package deliberi
import (
"slices"
"testing"
comatproto "github.com/bluesky-social/indigo/api/atproto"
deldb "tangled.org/core/deliberi/db"
models "tangled.org/core/deliberi/models"
"tangled.org/core/jetstream"
)
type kvDeletes struct{ keys []string }
func (k *kvDeletes) PutEmailDid(string, string) {}
func (k *kvDeletes) SetPrimaryEmail(string, string) {}
func (k *kvDeletes) DeleteEmailKey(email string) { k.keys = append(k.keys, email) }
func (k *kvDeletes) DeletePrimaryEmail(did string) { k.keys = append(k.keys, "__primary:"+did) }
func accountFrame(did string, active bool, status string) *jetstream.Event {
frameClock++
acct := &comatproto.SyncSubscribeRepos_Account{Did: did, Active: active}
if status != "" {
acct.Status = &status
}
return &jetstream.Event{Did: did, TimeUS: frameClock, Kind: jetstream.EventKindAccount, Account: acct}
}
func TestAccountDeletionDropsEmails(t *testing.T) {
const gone, kept = "did:plc:gone", "did:plc:kept"
i := newTestIngester(t, fakeBobbin{})
rec := &kvDeletes{}
i.emailKV = rec
for _, e := range []models.Email{
{Did: gone, Address: "gone@example.com", Verified: true, Primary: true},
{Did: gone, Address: "alt@example.com", Verified: true},
{Did: kept, Address: "kept@example.com", Verified: true, Primary: true},
} {
if err := deldb.AddEmail(i.db, e); err != nil {
t.Fatal(err)
}
}
mustProcess(t, i,
accountFrame(gone, false, "deactivated"),
accountFrame(kept, false, "takendown"),
)
if len(rec.keys) != 0 {
t.Fatalf("reversible statuses touched KV: %v", rec.keys)
}
mustProcess(t, i, accountFrame(gone, false, "deleted"))
if left, _ := deldb.GetAllEmails(i.db, gone); len(left) != 0 {
t.Errorf("deleted account still has emails: %v", left)
}
if left, _ := deldb.GetAllEmails(i.db, kept); len(left) != 1 {
t.Errorf("other account lost emails: %v", left)
}
slices.Sort(rec.keys)
want := []string{"__primary:" + gone, "alt@example.com", "gone@example.com"}
if !slices.Equal(rec.keys, want) {
t.Errorf("KV deletes = %v, want %v", rec.keys, want)
}
}