package db import ( "testing" ) func TestDecodeTagsEdgeCases(t *testing.T) { tests := []struct { name string raw string want int }{ {"empty", "", 0}, {"brackets", "[]", 0}, {"whitespace", " [] ", 0}, {"valid", `["a","b"]`, 2}, {"invalid json", "{not-json", 0}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { got := decodeTags(tc.raw) if len(got) != tc.want { t.Fatalf("decodeTags(%q) len=%d want %d (%v)", tc.raw, len(got), tc.want, got) } }) } } func TestEncodeTagsEmpty(t *testing.T) { if got := encodeTags(nil); got != "[]" { t.Fatalf("encodeTags(nil) = %q want []", got) } if got := encodeTags([]string{}); got != "[]" { t.Fatalf("encodeTags(empty) = %q want []", got) } } func TestGetAgentInvalidTagsInDB(t *testing.T) { d := openTestDB(t) seedAgent(t, d, "bad-tags") if _, err := d.Exec(`UPDATE agents SET tags = ? WHERE id = ?`, "{invalid", "bad-tags"); err != nil { t.Fatal(err) } got, err := d.GetAgent("bad-tags") if err != nil { t.Fatal(err) } if len(got.Tags) != 0 { t.Fatalf("invalid tags should decode to empty slice, got %v", got.Tags) } } func TestUpdateAgentMetaClearsTags(t *testing.T) { d := openTestDB(t) seedAgent(t, d, "meta-clear") if err := d.UpdateAgentMeta("meta-clear", "note", []string{"x"}); err != nil { t.Fatal(err) } if err := d.UpdateAgentMeta("meta-clear", "", nil); err != nil { t.Fatal(err) } got, err := d.GetAgent("meta-clear") if err != nil { t.Fatal(err) } if got.Notes != "" { t.Fatalf("notes not cleared: %q", got.Notes) } if len(got.Tags) != 0 { t.Fatalf("tags not cleared: %v", got.Tags) } }