package store import ( "path/filepath" "testing" "tweetdistributor/output" ) func TestStoreRoundTripThroughFile(t *testing.T) { path := filepath.Join(t.TempDir(), "posts.json") s, err := New(path) if err != nil { t.Fatal(err) } refs := Refs{ "twitter": {ID: "123"}, "bluesky": {URI: "at://did:plc:xyz/app.bsky.feed.post/abc", CID: "bafy"}, } if err := s.Put("discord-1", refs); err != nil { t.Fatal(err) } reopened, err := New(path) if err != nil { t.Fatal(err) } got, ok := reopened.Get("discord-1") if !ok { t.Fatal("stored message was not found after reopening") } if got["twitter"] != (output.Ref{ID: "123"}) { t.Errorf("twitter ref = %+v, want ID 123", got["twitter"]) } if got["bluesky"].URI != refs["bluesky"].URI { t.Errorf("bluesky URI = %q, want %q", got["bluesky"].URI, refs["bluesky"].URI) } if err := reopened.Delete("discord-1"); err != nil { t.Fatal(err) } if _, ok := reopened.Get("discord-1"); ok { t.Error("message is still present after Delete") } } func TestStoreMissingMessage(t *testing.T) { s, err := New("") if err != nil { t.Fatal(err) } if _, ok := s.Get("nope"); ok { t.Error("Get returned a ref for a message that was never stored") } if err := s.Delete("nope"); err != nil { t.Errorf("deleting an unknown message returned %s", err) } } func TestStoreEvictsOldest(t *testing.T) { s, err := New("") if err != nil { t.Fatal(err) } for i := 0; i < maxEntries+10; i++ { if err := s.Put(string(rune('a'+i%26))+string(rune(i)), Refs{"stdout": {ID: "x"}}); err != nil { t.Fatal(err) } } if len(s.refs) > maxEntries { t.Errorf("store holds %d entries, want at most %d", len(s.refs), maxEntries) } if len(s.order) != len(s.refs) { t.Errorf("order has %d entries but refs has %d", len(s.order), len(s.refs)) } }