package kvm2 import ( "errors" "strings" "testing" "time" "gitea.home.hrajfrisbee.cz/kacerr/egress-proxies-operator/internal/provider" ) func TestMarshalInstanceMetadata_namespacedElement(t *testing.T) { t.Parallel() created := time.Date(2026, 9, 16, 10, 30, 0, 0, time.FixedZone("CEST", 2*3600)) got, err := marshalInstanceMetadata(newInstanceMetadata("uid-1", created)) if err != nil { t.Fatal(err) } for _, want := range []string{ ``, "true", "uid-1", "2026-09-16T08:30:00Z", "", } { if !strings.Contains(got, want) { t.Errorf("marshalled metadata %q lacks %q", got, want) } } } func TestParseMetadata_withNamespace(t *testing.T) { t.Parallel() in := `trueabc2026-09-16T08:30:00Z` m, err := parseInstanceMetadata(in) if err != nil { t.Fatal(err) } if !m.managed() { t.Error("managed() = false, want true") } if m.UID != "abc" { t.Errorf("UID = %q, want abc", m.UID) } if want := time.Date(2026, 9, 16, 8, 30, 0, 0, time.UTC); !m.createdAt().Equal(want) { t.Errorf("createdAt() = %v, want %v", m.createdAt(), want) } } func TestParseMetadata_withoutNamespaceDeclaration(t *testing.T) { t.Parallel() in := "\n true\n abc\n 2026-09-16T08:30:00Z\n" m, err := parseInstanceMetadata(in) if err != nil { t.Fatal(err) } if !m.managed() || m.UID != "abc" { t.Errorf("got managed=%v uid=%q, want true/abc", m.managed(), m.UID) } if m.createdAt().IsZero() { t.Error("createdAt() is zero, want parsed timestamp") } } func TestParseMetadata_absentGivesEmptyUID(t *testing.T) { t.Parallel() tests := []struct { name string in string }{ {name: "empty element", in: ""}, {name: "empty element with namespace", in: ``}, {name: "empty children", in: ""}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() m, err := parseInstanceMetadata(tc.in) if err != nil { t.Fatal(err) } if m.managed() { t.Error("managed() = true, want false") } if m.UID != "" { t.Errorf("UID = %q, want empty", m.UID) } if !m.createdAt().IsZero() { t.Errorf("createdAt() = %v, want zero", m.createdAt()) } }) } } func TestParseMetadata_badCreatedAtIsZeroTime(t *testing.T) { t.Parallel() tests := []struct { name string in string }{ {name: "garbage", in: "trueuyesterday"}, {name: "date only", in: "trueu2026-09-16"}, {name: "missing", in: "trueu"}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() m, err := parseInstanceMetadata(tc.in) if err != nil { t.Fatal(err) } if !m.createdAt().IsZero() { t.Errorf("createdAt() = %v, want zero", m.createdAt()) } if !m.managed() || m.UID != "u" { t.Errorf("other fields lost: managed=%v uid=%q", m.managed(), m.UID) } }) } } func TestParseMetadata_notXMLIsPermanent(t *testing.T) { t.Parallel() tests := []struct { name string in string }{ {name: "empty string", in: ""}, {name: "whitespace", in: " \n"}, {name: "plain text", in: "managed: true"}, {name: "unclosed element", in: "true"}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() _, err := parseInstanceMetadata(tc.in) if !errors.Is(err, provider.ErrPermanent) { t.Errorf("err = %v, want ErrPermanent", err) } }) } } func TestParseMetadata_wrongRootIsPermanent(t *testing.T) { t.Parallel() tests := []struct { name string in string }{ {name: "other local name", in: "true"}, {name: "other local name with our namespace", in: `x`}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() _, err := parseInstanceMetadata(tc.in) if !errors.Is(err, provider.ErrPermanent) { t.Errorf("err = %v, want ErrPermanent", err) } }) } }