package store import ( "encoding/json" "errors" "path/filepath" "testing" "time" ) func TestAFederationPeerIsKeptWithWhatItLastOffered(t *testing.T) { s, err := OpenSQLite(t.Context(), filepath.Join(t.TempDir(), "s.db")) if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = s.Close() }) ctx := t.Context() if err := s.PutFederationPeer(ctx, FederationPeer{Name: "east", URL: "https://east", KeyFile: "/k", SendTags: true, CreatedBy: "ops"}); err != nil { t.Fatal(err) } peers, err := s.FederationPeers(ctx) if err != nil || len(peers) != 1 { t.Fatalf("%v %+v", err, peers) } if p := peers[0]; !p.SendTags || string(p.Models) != "[]" || !p.SyncedAt.IsZero() || p.CreatedBy != "ops" { t.Errorf("as kept: %+v", p) } at := time.Now() if err := s.SetFederationPeerModels(ctx, "east", "c1", json.RawMessage(`[{"id":"m"}]`), at); err != nil { t.Fatal(err) } p, err := s.FederationPeer(ctx, "east") if err != nil || p.Cluster != "c1" || string(p.Models) != `[{"id":"m"}]` || p.SyncedAt.UnixMilli() != at.UnixMilli() { t.Errorf("after a sync: %v %+v", err, p) } // A sync finishing after the peer was removed does not bring it back. if err := s.DeleteFederationPeer(ctx, "east"); err != nil { t.Fatal(err) } if err := s.SetFederationPeerModels(ctx, "east", "c1", json.RawMessage(`[]`), at); !errors.Is(err, ErrNotFound) { t.Errorf("syncing a removed peer: %v", err) } if err := s.DeleteFederationPeer(ctx, "east"); !errors.Is(err, ErrNotFound) { t.Errorf("removing it twice: %v", err) } }