package spindle
import (
"testing"
"github.com/bluesky-social/indigo/atproto/syntax"
"tangled.org/core/spindle/config"
"tangled.org/core/spindle/db"
)
func TestEnrollsShouldFollowAdmission(t *testing.T) {
admin := syntax.DID("did:plc:admin")
owner := syntax.DID("did:plc:owner")
nel := syntax.DID("did:plc:nel")
squid := syntax.DID("did:plc:squid")
d, _ := newTestSpindleDB(t)
srv := &config.Server{Owner: owner.String(), Admins: []string{admin.String()}}
enrolls := func(want bool, did syntax.DID) {
t.Helper()
got, err := db.Enrolls(d, srv, did)
if err != nil {
t.Fatal(err)
}
if got != want {
t.Fatalf("Enrolls(%s) = %v under %q admission, want %v", did, got, srv.Admission, want)
}
}
// an empty allow-list serves only the admins
enrolls(false, nel)
enrolls(true, owner)
enrolls(true, admin)
if err := db.AddToAllowlist(d, squid); err != nil {
t.Fatal(err)
}
enrolls(true, squid)
enrolls(false, nel)
srv.Admission = config.AdmissionClosed
enrolls(false, nel)
srv.Admission = config.AdmissionOpen
enrolls(true, nel)
enrolls(true, squid)
}
func TestBanShouldBeatEveryAdmission(t *testing.T) {
admin := syntax.DID("did:plc:admin")
owner := syntax.DID("did:plc:owner")
squid := syntax.DID("did:plc:squid")
nel := syntax.DID("did:plc:nel")
d, _ := newTestSpindleDB(t)
if err := db.AddToAllowlist(d, squid); err != nil {
t.Fatal(err)
}
for _, did := range []syntax.DID{admin, owner, squid, nel} {
if err := d.PutBan(db.BanEntry{SubjectDid: did}); err != nil {
t.Fatal(err)
}
}
for _, admission := range []config.Admission{config.AdmissionClosed, config.AdmissionOpen} {
srv := &config.Server{Owner: owner.String(), Admins: []string{admin.String()}, Admission: admission}
for _, did := range []syntax.DID{admin, owner, squid, nel} {
if got, err := db.Enrolls(d, srv, did); err != nil || got {
t.Fatalf("Enrolls(%s) = %v, %v under %q admission, want a ban to refuse", did, got, err, admission)
}
}
}
}