package migadu import ( "encoding/json" "testing" ) func TestStringListUnmarshal(t *testing.T) { cases := []struct { name string raw string want []string }{ {name: "null", raw: `null`, want: []string{}}, {name: "empty string", raw: `""`, want: []string{}}, {name: "csv string", raw: `"a@x.com, b@y.com"`, want: []string{"a@x.com", "b@y.com"}}, {name: "array", raw: `["a@x.com","b@y.com"]`, want: []string{"a@x.com", "b@y.com"}}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { var got StringList if err := json.Unmarshal([]byte(tc.raw), &got); err != nil { t.Fatalf("unmarshal: %v", err) } if len(got) != len(tc.want) { t.Fatalf("len=%d want %d (%v)", len(got), len(tc.want), got) } for i := range tc.want { if got[i] != tc.want[i] { t.Fatalf("got %v want %v", got, tc.want) } } }) } } func TestDomainUpdateNilListMarshalsAsEmptyArray(t *testing.T) { var nilList []string update := DomainUpdate{ SenderDenylist: &nilList, SenderAllowlist: &[]string{"a@b.com", "c@d.com"}, RecipientDenylist: &[]string{}, } update.normalizeListPointers() raw, err := json.Marshal(update) if err != nil { t.Fatalf("marshal: %v", err) } var decoded map[string]json.RawMessage if err := json.Unmarshal(raw, &decoded); err != nil { t.Fatalf("decode: %v", err) } if string(decoded["sender_denylist"]) != `""` { t.Fatalf("sender_denylist=%s want empty string", decoded["sender_denylist"]) } if string(decoded["sender_allowlist"]) != `"a@b.com,c@d.com"` { t.Fatalf("sender_allowlist=%s", decoded["sender_allowlist"]) } if string(decoded["recipient_denylist"]) != `""` { t.Fatalf("recipient_denylist=%s want empty string", decoded["recipient_denylist"]) } }