Add Migadu domain admin with shared lists, compaction, and safer apply.
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).
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
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"])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user