package atlas_test import ( "encoding/json" "testing" "git.d-ma.be/mathias/cad-atlas/internal/atlas" ) // Every stage authored before this type existed spells `generate` as a bare // string. That spelling stays valid — this is additive, not a migration. func TestGenerateKeys_UnmarshalsBareString(t *testing.T) { var s atlas.Stage if err := json.Unmarshal([]byte(`{"no":"06","generate":"ci-jobs"}`), &s); err != nil { t.Fatalf("unmarshal: %v", err) } if !s.Generate.Has("ci-jobs") { t.Fatalf("Has(ci-jobs) false for %+v", s.Generate) } if s.Generate.Has("gitea-repos") { t.Fatal("Has matched a key that is not present") } } func TestGenerateKeys_UnmarshalsList(t *testing.T) { var s atlas.Stage if err := json.Unmarshal([]byte(`{"no":"05","generate":["stuck-badges","gitea-repos"]}`), &s); err != nil { t.Fatalf("unmarshal: %v", err) } if !s.Generate.Has("stuck-badges") || !s.Generate.Has("gitea-repos") { t.Fatalf("both keys should match, got %+v", s.Generate) } } func TestGenerateKeys_AbsentMatchesNothing(t *testing.T) { var s atlas.Stage if err := json.Unmarshal([]byte(`{"no":"00"}`), &s); err != nil { t.Fatalf("unmarshal: %v", err) } if s.Generate.Has("") || s.Generate.Has("ci-jobs") { t.Fatalf("absent generate matched something: %+v", s.Generate) } } // The frontend reads this JSON, so the round-trip must stay stable. func TestGenerateKeys_RoundTrips(t *testing.T) { for _, raw := range []string{`{"generate":"ci-jobs"}`, `{"generate":["a","b"]}`} { var s atlas.Stage if err := json.Unmarshal([]byte(raw), &s); err != nil { t.Fatalf("unmarshal %s: %v", raw, err) } out, err := json.Marshal(s) if err != nil { t.Fatalf("marshal: %v", err) } var back atlas.Stage if err := json.Unmarshal(out, &back); err != nil { t.Fatalf("re-unmarshal %s: %v", out, err) } for _, k := range []string{"ci-jobs", "a", "b"} { if s.Generate.Has(k) != back.Generate.Has(k) { t.Fatalf("round-trip lost %q: %s -> %s", k, raw, out) } } } }