clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

feat/ui-updates
tinyrelay / internal / daemon / inbox_reconcile_test.go
inbox_reconcile_test.go 3.2K
1package daemon23import (4 "context"5 "testing"67 "github.com/FelineStateMachine/tinyrelay/internal/catalog"8 "github.com/FelineStateMachine/tinyrelay/internal/policy"9 "github.com/FelineStateMachine/tinyrelay/internal/replication"10 "github.com/FelineStateMachine/tinyrelay/internal/storage"11)1213func TestAutomaticInboxJobReconcilesPolicyChanges(t *testing.T) {14 ctx := context.Background()15 store, err := storage.Open(ctx, t.TempDir()+"/tenant.db")16 if err != nil {17 t.Fatal(err)18 }19 defer store.Close()20 service, err := replication.NewService(replication.Config{Store: store, DataDir: t.TempDir()})21 if err != nil {22 t.Fatal(err)23 }24 tenant := &Tenant{meta: catalog.Tenant{ID: "tenant"}, store: store, replication: service}25 owner := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"26 previous := policy.Policy{Owner: owner}27 current := previous28 current.Inbox.Targeted = true29 current.AllowedKinds = []int{1, 7}30 if err := tenant.reconcileAutomaticInbox(ctx, previous, current); err != nil {31 t.Fatal(err)32 }33 jobs, err := service.ListJobs(ctx)34 if err != nil {35 t.Fatal(err)36 }37 if len(jobs) != 1 || jobs[0].DiscoverPubKey != owner {38 t.Fatalf("jobs after enable = %#v", jobs)39 }40 if err := tenant.reconcileAutomaticInbox(ctx, previous, current); err != nil {41 t.Fatal(err)42 }43 var intents int44 if err := store.DB().QueryRowContext(ctx, `SELECT count(*) FROM work_intents WHERE event_id=? AND kind='job'`, "source-tenant").Scan(&intents); err != nil {45 t.Fatal(err)46 }47 if intents != 1 {48 t.Fatalf("reconcile created %d job intents, want one", intents)49 }50 disabled := current51 disabled.Inbox.Targeted = false52 if err := tenant.reconcileAutomaticInbox(ctx, current, disabled); err != nil {53 t.Fatal(err)54 }55 jobs, err = service.ListJobs(ctx)56 if err != nil {57 t.Fatal(err)58 }59 if len(jobs) != 0 {60 t.Fatalf("jobs after disable = %#v", jobs)61 }62 if err := tenant.reconcileAutomaticInbox(ctx, disabled, current); err != nil {63 t.Fatal(err)64 }65 jobs, err = service.ListJobs(ctx)66 if err != nil {67 t.Fatal(err)68 }69 if len(jobs) != 1 {70 t.Fatalf("jobs after re-enable = %#v", jobs)71 }72}7374func TestAutomaticInboxTransferFollowsCurrentOwner(t *testing.T) {75 ctx := context.Background()76 store, err := storage.Open(ctx, t.TempDir()+"/tenant.db")77 if err != nil {78 t.Fatal(err)79 }80 defer store.Close()81 service, err := replication.NewService(replication.Config{Store: store, DataDir: t.TempDir()})82 if err != nil {83 t.Fatal(err)84 }85 tenant := &Tenant{meta: catalog.Tenant{ID: "tenant"}, store: store, replication: service}86 oldOwner := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"87 newOwner := "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"88 previous := policy.Policy{Owner: oldOwner, Inbox: policy.Inbox{Targeted: true}, AllowedKinds: []int{1}}89 if err := tenant.reconcileAutomaticInbox(ctx, policy.Policy{Owner: oldOwner}, previous); err != nil {90 t.Fatal(err)91 }92 next := previous93 next.Owner = newOwner94 if err := tenant.reconcileAutomaticInbox(ctx, previous, next); err != nil {95 t.Fatal(err)96 }97 jobs, err := service.ListJobs(ctx)98 if err != nil {99 t.Fatal(err)100 }101 if len(jobs) != 1 || jobs[0].DiscoverPubKey != newOwner || inboxJobOwner(jobs[0]) != newOwner {102 t.Fatalf("transfer did not update discovery owner: %#v", jobs)103 }104}