package provision import ( "encoding/json" "strings" "testing" "github.com/carlosframework/platform/internal/release" ) func intp(n int) *int { return &n } func TestARecordWithoutSettingsIsToday(t *testing.T) { rec := Record{Schema: 1, Host: "a.example.com", App: "km", Account: "bab", Channel: "stable"} u := EffectiveUpdates(rec, nil) if !u.Default() || u.Channel != "stable" || u.Column() != "" { t.Fatalf("EffectiveUpdates = %+v (column %q)", u, u.Column()) } b, _ := json.Marshal(rec) for _, k := range []string{`"updates"`, `"major"`, `"pin"`, `"install_request"`} { if strings.Contains(string(b), k) { t.Fatalf("an unset %s leaked into the record: %s", k, b) } } } func TestDefaultsApplyWhereNothingIsSet(t *testing.T) { p := &UpdatePolicy{DefaultUpdates: release.UpdatesManual, DefaultMajor: intp(3), InstanceControl: []string{"pin"}} u := EffectiveUpdates(Record{Channel: "stable"}, p) if u.Updates != release.UpdatesManual || *u.Major != 3 || len(u.Control) != 1 { t.Fatalf("defaults = %+v", u) } u = EffectiveUpdates(Record{Channel: "stable", Updates: release.UpdatesAuto, Major: intp(4)}, p) if u.Updates != release.UpdatesAuto || *u.Major != 4 { t.Fatalf("explicit values lost to defaults: %+v", u) } } // Review Focus 1. func TestEffectiveUpdatesDropsMajorOffStable(t *testing.T) { u := EffectiveUpdates(Record{Channel: "beta", Major: intp(2)}, &UpdatePolicy{DefaultMajor: intp(1)}) if u.Major != nil { t.Fatalf("major off stable = %d; it can never apply there", *u.Major) } } func TestEffectiveUpdatesCarriesTheRequest(t *testing.T) { u := EffectiveUpdates(Record{Channel: "stable", InstallRequest: &InstallRequest{ID: 7, FastTrack: true}}, nil) if u.InstallRequest != 7 || !u.InstallFastTrack { t.Fatalf("request = %+v", u) } } func TestValidateUpdates(t *testing.T) { ok := []Record{ {Channel: "stable"}, {Channel: "stable", Updates: "manual", Major: intp(0), Pin: "v1"}, } for _, r := range ok { if err := ValidateUpdates(r); err != nil { t.Errorf("%+v: %v", r, err) } } bad := []Record{ {Channel: "stable", Updates: "sometimes"}, {Channel: "stable", Major: intp(-1)}, {Channel: "beta", Major: intp(1)}, {Channel: "stable", Pin: "../etc"}, } for _, r := range bad { if err := ValidateUpdates(r); err == nil { t.Errorf("%+v was accepted", r) } } if ValidatePolicy(&UpdatePolicy{InstanceControl: []string{"bake"}}) == nil || ValidatePolicy(&UpdatePolicy{DefaultUpdates: "x"}) == nil { t.Fatal("ValidatePolicy accepted nonsense") } }