package db import ( "testing" "github.com/bluesky-social/indigo/atproto/syntax" ) func TestBans_RoundTrip(t *testing.T) { d := newTestDB(t) repo := syntax.DID("did:plc:repo1") b, err := d.GetBan(repo) if err != nil || b != nil { t.Fatalf("GetBan on empty store: %v, %v", b, err) } if err := d.PutBan(BanEntry{SubjectDid: repo}); err != nil { t.Fatalf("PutBan: %v", err) } b, err = d.GetBan(repo) if err != nil || b == nil || b.CreatedAt == "" { t.Fatalf("GetBan after put: %+v, %v", b, err) } first := *b if err := d.PutBan(BanEntry{SubjectDid: repo}); err != nil { t.Fatalf("PutBan idempotent: %v", err) } b, _ = d.GetBan(repo) if b.CreatedAt != first.CreatedAt { t.Fatalf("re-ban clobbered timestamp: %+v", b) } ok, err := d.DeleteBan(repo) if err != nil || !ok { t.Fatalf("DeleteBan present: %v, %v", ok, err) } ok, err = d.DeleteBan(repo) if err != nil || ok { t.Fatalf("DeleteBan absent should report false: %v, %v", ok, err) } } func TestBans_EffectiveBan(t *testing.T) { d := newTestDB(t) repo := syntax.DID("did:plc:repo2") owner := syntax.DID("did:plc:owner2") if err := d.PutBan(BanEntry{SubjectDid: owner}); err != nil { t.Fatal(err) } b, _ := d.IsBanned(repo, owner) if b == nil || b.SubjectDid != owner { t.Fatalf("IsBanned should find the owner ban: %+v", b) } // a ban matches either role b, _ = d.IsBanned(owner, "did:plc:someoneelse") if b == nil || b.SubjectDid != owner { t.Fatalf("IsBanned should find the ban under the repo role too: %+v", b) } b, _ = d.IsBanned("did:plc:cleanrepo", "did:plc:cleanowner") if b != nil { t.Fatalf("IsBanned false positive: %+v", b) } } func TestBans_List(t *testing.T) { d := newTestDB(t) if err := d.PutBan(BanEntry{SubjectDid: "did:plc:b"}); err != nil { t.Fatal(err) } if err := d.PutBan(BanEntry{SubjectDid: "did:plc:a"}); err != nil { t.Fatal(err) } bans, err := d.BanList() if err != nil { t.Fatal(err) } if len(bans) != 2 || bans[0].SubjectDid != "did:plc:a" || bans[1].SubjectDid != "did:plc:b" { t.Fatalf("BanList order/content: %+v", bans) } }