package appconfig import ( "encoding/json" "strings" "testing" ) func TestKeyIsAccountScoped(t *testing.T) { got := Key("bab", "keymail") want := "apps/bab/keymail/config.json" if got != want { t.Fatalf("Key(bab, keymail) = %q, want %q", got, want) } } func TestValidVarName(t *testing.T) { valid := []string{"LOG_LEVEL", "_FOO", "A", "SES_SECRET_2", "lower_case"} invalid := []string{"", "1FOO", "has-hyphen", "has space", "has=equals"} for _, k := range valid { if !ValidVarName(k) { t.Errorf("ValidVarName(%q) = false, want true", k) } } for _, k := range invalid { if ValidVarName(k) { t.Errorf("ValidVarName(%q) = true, want false", k) } } } // The swap policy (zero-downtime spec ยง4.1) is additive to schema 1: a // manifest written before it parses with zero values, and a manifest with no // policy marshals with no new keys, byte for byte as before. func TestSwapPolicyIsAdditive(t *testing.T) { var old Manifest if err := json.Unmarshal([]byte(`{"schema":1,"app":"blog","vars":{}}`), &old); err != nil { t.Fatal(err) } if old.Swap != "" || old.SwapConcurrency != 0 { t.Fatalf("old manifest parsed as %q/%d", old.Swap, old.SwapConcurrency) } raw, err := json.Marshal(Manifest{Schema: 1, App: "blog", Vars: map[string]Var{}}) if err != nil { t.Fatal(err) } if strings.Contains(string(raw), "swap") { t.Fatalf("a manifest with no policy marshals %s", raw) } var m Manifest if err := json.Unmarshal([]byte(`{"schema":1,"app":"blog","vars":{},"swap":"hold","swap_concurrency":3}`), &m); err != nil { t.Fatal(err) } if m.Swap != SwapHold || m.SwapConcurrency != 3 { t.Fatalf("parsed %q/%d", m.Swap, m.SwapConcurrency) } for v, want := range map[string]bool{"": true, "overlap": true, "hold": true, "Hold": false, "stop": false} { if ValidSwap(v) != want { t.Errorf("ValidSwap(%q) = %v", v, !want) } } for n, want := range map[int]bool{-1: false, 0: true, 1: true, 64: true} { if ValidSwapConcurrency(n) != want { t.Errorf("ValidSwapConcurrency(%d) = %v", n, !want) } } }