Build the Go API and React UI for managing domain denylist/allowlist/recipient deny and spam settings, plus shared lists that import/apply across domains with wildcard compaction, entry verification, and Migadu-friendly list encoding (including per-domain recipient filtering and rejection bisect on apply).
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
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"])
|
|
}
|
|
}
|