From a43739569374ece206d64d7d0ae81470823d23db Mon Sep 17 00:00:00 2001 From: Will Andrews Date: Fri, 22 Nov 2024 14:45:01 +0000 Subject: [PATCH] opps need the tests in there --- handler.go | 1 - handler_test.go | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 handler_test.go diff --git a/handler.go b/handler.go index 443e93d..a65ca6f 100644 --- a/handler.go +++ b/handler.go @@ -86,7 +86,6 @@ func (h *handler) handleCreateEvent(_ context.Context, event *models.Event) erro slog.Info("post is a reply to a post that users are subscribed to", "subscribed post URI", subscribedPostURI, "dids", subscribedDids, "RKey", event.Commit.RKey) - // TODO: parse from the event createdAt, err := time.Parse(time.RFC1123, post.CreatedAt) if err != nil { slog.Error("parsing createdAt time from post", "error", err, "timestamp", post.CreatedAt) diff --git a/handler_test.go b/handler_test.go new file mode 100644 index 0000000..f9c95e5 --- /dev/null +++ b/handler_test.go @@ -0,0 +1,179 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "testing" + "time" + + "github.com/bluesky-social/indigo/api/atproto" + apibsky "github.com/bluesky-social/indigo/api/bsky" + "github.com/bluesky-social/jetstream/pkg/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/willdot/bskyfeedgen/store" +) + +func TestIt(t *testing.T) { + ti := time.Now().Add(-time.Minute * 60) + + fmt.Println(ti.UnixMicro()) + t.FailNow() +} + +func TestHandlerReceivesSubscribeMessage(t *testing.T) { + db, err := store.New(":memory:") + require.NoError(t, err) + + handler := handler{ + store: db, + } + + record := apibsky.FeedPost{ + Text: "/subscribe", + Reply: &apibsky.FeedPost_ReplyRef{ + Parent: &atproto.RepoStrongRef{ + Uri: "parent-uri", + }, + }, + } + + recordB, err := json.Marshal(record) + require.NoError(t, err) + + event := &models.Event{ + Did: myDid, + Commit: &models.Commit{ + Operation: models.CommitOperationCreate, + Collection: "app.bsky.feed.post", + RKey: "subscribe-post-rkey", + Record: recordB, + }, + } + + // send the event twice to simulate subscribing to the same post twice, to check only + // 1 subscription is created + err = handler.HandleEvent(context.Background(), event) + require.NoError(t, err) + err = handler.HandleEvent(context.Background(), event) + require.NoError(t, err) + + subs, err := db.GetSubscriptionsForPost("parent-uri") + require.NoError(t, err) + + assert.Len(t, subs, 1) + assert.Equal(t, myDid, subs[0]) +} + +func TestHandlerReceivesReplyToASubscribedPost(t *testing.T) { + db, err := store.New(":memory:") + require.NoError(t, err) + + handler := handler{ + store: db, + } + + // add the subscription + err = db.AddSubscriptionForPost("parent-uri", myDid, "subscribe-post-rkey") + require.NoError(t, err) + + record := apibsky.FeedPost{ + Text: "this is a reply to a post that was subscribed to", + Reply: &apibsky.FeedPost_ReplyRef{ + Parent: &atproto.RepoStrongRef{ + Uri: "parent-uri", + }, + }, + } + + recordB, err := json.Marshal(record) + require.NoError(t, err) + + event := &models.Event{ + Did: "some-random-did", + Commit: &models.Commit{ + Operation: models.CommitOperationCreate, + Collection: "app.bsky.feed.post", + RKey: "reply-post-rkey", + Record: recordB, + }, + } + + err = handler.HandleEvent(context.Background(), event) + require.NoError(t, err) + + feed, err := db.GetUsersFeed(myDid, 9999999999999, 5) + require.NoError(t, err) + + assert.Len(t, feed, 1) + expectedFeedPost := store.FeedPost{ + ID: 1, + ReplyURI: "at://some-random-did/app.bsky.feed.post/reply-post-rkey", + UserDID: myDid, + SubscribedPostURI: "parent-uri", + } + + res := feed[0] + // timestamps are hard to assert so check it's within a few seconds and then remove from + // the result so the rest of the assertion can complete + assert.WithinDuration(t, time.Now(), time.UnixMilli(res.CreatedAt), time.Second) + res.CreatedAt = 0 + + assert.Equal(t, expectedFeedPost, res) +} + +func TestHandlerReceivesDeleteEvent(t *testing.T) { + db, err := store.New(":memory:") + require.NoError(t, err) + + handler := handler{ + store: db, + } + + // add the subscription + err = db.AddSubscriptionForPost("parent-uri", myDid, "subscribe-post-rkey") + require.NoError(t, err) + // add in some feed posts + feedPost1 := store.FeedPost{ + ReplyURI: "at://some-random-did-1/app.bsky.feed.post/reply-post-rkey", + UserDID: myDid, + SubscribedPostURI: "parent-uri", + } + feedPost2 := store.FeedPost{ + ReplyURI: "at://some-random-did-2/app.bsky.feed.post/reply-post-rkey", + UserDID: myDid, + SubscribedPostURI: "parent-uri", + } + err = db.AddFeedPost(feedPost1) + require.NoError(t, err) + err = db.AddFeedPost(feedPost2) + require.NoError(t, err) + // add a feed post for a different subscribed post + feedPost3 := store.FeedPost{ + ReplyURI: "at://some-random-did-3/app.bsky.feed.post/reply-post-rkey", + UserDID: myDid, + SubscribedPostURI: "different-parent-uri", + } + err = db.AddFeedPost(feedPost3) + require.NoError(t, err) + + event := &models.Event{ + Did: myDid, + Commit: &models.Commit{ + Operation: models.CommitOperationDelete, + Collection: "app.bsky.feed.post", + RKey: "subscribe-post-rkey", + }, + } + + err = handler.HandleEvent(context.Background(), event) + require.NoError(t, err) + + feed, err := db.GetUsersFeed(myDid, 9999999999999, 5) + require.NoError(t, err) + + assert.Len(t, feed, 1) + feedPost3.ID = 3 + assert.Equal(t, feedPost3, feed[0]) +} -- 2.51.2