diff options
Diffstat (limited to 'internal/db/bundb/timeline_test.go')
-rw-r--r-- | internal/db/bundb/timeline_test.go | 253 |
1 files changed, 181 insertions, 72 deletions
diff --git a/internal/db/bundb/timeline_test.go b/internal/db/bundb/timeline_test.go index f954c78dd..7e8fd0838 100644 --- a/internal/db/bundb/timeline_test.go +++ b/internal/db/bundb/timeline_test.go @@ -33,134 +33,243 @@ type TimelineTestSuite struct { BunDBStandardTestSuite } -func (suite *TimelineTestSuite) TestGetPublicTimeline() { - var count int +func getFutureStatus() *gtsmodel.Status { + theDistantFuture := time.Now().Add(876600 * time.Hour) + id, err := id.NewULIDFromTime(theDistantFuture) + if err != nil { + panic(err) + } + + return >smodel.Status{ + ID: id, + URI: "http://localhost:8080/users/admin/statuses/" + id, + URL: "http://localhost:8080/@admin/statuses/" + id, + Content: "it's the future, wooooooooooooooooooooooooooooooooo", + Text: "it's the future, wooooooooooooooooooooooooooooooooo", + AttachmentIDs: []string{}, + TagIDs: []string{}, + MentionIDs: []string{}, + EmojiIDs: []string{}, + CreatedAt: theDistantFuture, + UpdatedAt: theDistantFuture, + Local: testrig.TrueBool(), + AccountURI: "http://localhost:8080/users/admin", + AccountID: "01F8MH17FWEB39HZJ76B6VXSKF", + InReplyToID: "", + BoostOfID: "", + ContentWarning: "", + Visibility: gtsmodel.VisibilityPublic, + Sensitive: testrig.FalseBool(), + Language: "en", + CreatedWithApplicationID: "01F8MGXQRHYF5QPMTMXP78QC2F", + Federated: testrig.TrueBool(), + Boostable: testrig.TrueBool(), + Replyable: testrig.TrueBool(), + Likeable: testrig.TrueBool(), + ActivityStreamsType: ap.ObjectNote, + } +} + +func (suite *TimelineTestSuite) publicCount() int { + var publicCount int for _, status := range suite.testStatuses { if status.Visibility == gtsmodel.VisibilityPublic && status.BoostOfID == "" { - count++ + publicCount++ } } - ctx := context.Background() - s, err := suite.db.GetPublicTimeline(ctx, "", "", "", 20, false) - suite.NoError(err) - - suite.Len(s, count) + return publicCount } -func (suite *TimelineTestSuite) TestGetPublicTimelineWithFutureStatus() { - var count int +func (suite *TimelineTestSuite) checkStatuses(statuses []*gtsmodel.Status, maxID string, minID string, expectedLength int) { + if l := len(statuses); l != expectedLength { + suite.FailNow("", "expected %d statuses in slice, got %d", expectedLength, l) + } else if l == 0 { + // Can't test empty slice. + return + } - for _, status := range suite.testStatuses { - if status.Visibility == gtsmodel.VisibilityPublic && - status.BoostOfID == "" { - count++ + // Check ordering + bounds of statuses. + highest := statuses[0].ID + for _, status := range statuses { + id := status.ID + + if id >= maxID { + suite.FailNow("", "%s greater than maxID %s", id, maxID) + } + + if id <= minID { + suite.FailNow("", "%s smaller than minID %s", id, minID) + } + + if id > highest { + suite.FailNow("", "statuses in slice were not ordered highest -> lowest ID") } + + highest = id } +} +func (suite *TimelineTestSuite) TestGetPublicTimeline() { ctx := context.Background() + s, err := suite.db.GetPublicTimeline(ctx, "", "", "", 20, false) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.checkStatuses(s, id.Highest, id.Lowest, suite.publicCount()) +} + +func (suite *TimelineTestSuite) TestGetPublicTimelineWithFutureStatus() { + ctx := context.Background() + + // Insert a status set far in the + // future, it shouldn't be retrieved. futureStatus := getFutureStatus() - err := suite.db.PutStatus(ctx, futureStatus) - suite.NoError(err) + if err := suite.db.PutStatus(ctx, futureStatus); err != nil { + suite.FailNow(err.Error()) + } s, err := suite.db.GetPublicTimeline(ctx, "", "", "", 20, false) - suite.NoError(err) + if err != nil { + suite.FailNow(err.Error()) + } suite.NotContains(s, futureStatus) - suite.Len(s, count) + suite.checkStatuses(s, id.Highest, id.Lowest, suite.publicCount()) } func (suite *TimelineTestSuite) TestGetHomeTimeline() { - ctx := context.Background() - - viewingAccount := suite.testAccounts["local_account_1"] + var ( + ctx = context.Background() + viewingAccount = suite.testAccounts["local_account_1"] + ) s, err := suite.db.GetHomeTimeline(ctx, viewingAccount.ID, "", "", "", 20, false) - suite.NoError(err) + if err != nil { + suite.FailNow(err.Error()) + } - suite.Len(s, 16) + suite.checkStatuses(s, id.Highest, id.Lowest, 16) } func (suite *TimelineTestSuite) TestGetHomeTimelineWithFutureStatus() { - ctx := context.Background() - - viewingAccount := suite.testAccounts["local_account_1"] + var ( + ctx = context.Background() + viewingAccount = suite.testAccounts["local_account_1"] + ) + // Insert a status set far in the + // future, it shouldn't be retrieved. futureStatus := getFutureStatus() - err := suite.db.PutStatus(ctx, futureStatus) - suite.NoError(err) + if err := suite.db.PutStatus(ctx, futureStatus); err != nil { + suite.FailNow(err.Error()) + } - s, err := suite.db.GetHomeTimeline(context.Background(), viewingAccount.ID, "", "", "", 20, false) - suite.NoError(err) + s, err := suite.db.GetHomeTimeline(ctx, viewingAccount.ID, "", "", "", 20, false) + if err != nil { + suite.FailNow(err.Error()) + } suite.NotContains(s, futureStatus) - suite.Len(s, 16) + suite.checkStatuses(s, id.Highest, id.Lowest, 16) } func (suite *TimelineTestSuite) TestGetHomeTimelineBackToFront() { - ctx := context.Background() - - viewingAccount := suite.testAccounts["local_account_1"] + var ( + ctx = context.Background() + viewingAccount = suite.testAccounts["local_account_1"] + ) s, err := suite.db.GetHomeTimeline(ctx, viewingAccount.ID, "", "", id.Lowest, 5, false) - suite.NoError(err) + if err != nil { + suite.FailNow(err.Error()) + } - suite.Len(s, 5) + suite.checkStatuses(s, id.Highest, id.Lowest, 5) suite.Equal("01F8MHAYFKS4KMXF8K5Y1C0KRN", s[0].ID) suite.Equal("01F8MH75CBF9JFX4ZAD54N0W0R", s[len(s)-1].ID) } func (suite *TimelineTestSuite) TestGetHomeTimelineFromHighest() { - ctx := context.Background() - - viewingAccount := suite.testAccounts["local_account_1"] + var ( + ctx = context.Background() + viewingAccount = suite.testAccounts["local_account_1"] + ) s, err := suite.db.GetHomeTimeline(ctx, viewingAccount.ID, id.Highest, "", "", 5, false) - suite.NoError(err) + if err != nil { + suite.FailNow(err.Error()) + } - suite.Len(s, 5) + suite.checkStatuses(s, id.Highest, id.Lowest, 5) suite.Equal("01G36SF3V6Y6V5BF9P4R7PQG7G", s[0].ID) suite.Equal("01FCTA44PW9H1TB328S9AQXKDS", s[len(s)-1].ID) } -func getFutureStatus() *gtsmodel.Status { - theDistantFuture := time.Now().Add(876600 * time.Hour) - id, err := id.NewULIDFromTime(theDistantFuture) +func (suite *TimelineTestSuite) TestGetListTimelineNoParams() { + var ( + ctx = context.Background() + list = suite.testLists["local_account_1_list_1"] + ) + + s, err := suite.db.GetListTimeline(ctx, list.ID, "", "", "", 20) if err != nil { - panic(err) + suite.FailNow(err.Error()) } - return >smodel.Status{ - ID: id, - URI: "http://localhost:8080/users/admin/statuses/" + id, - URL: "http://localhost:8080/@admin/statuses/" + id, - Content: "it's the future, wooooooooooooooooooooooooooooooooo", - Text: "it's the future, wooooooooooooooooooooooooooooooooo", - AttachmentIDs: []string{}, - TagIDs: []string{}, - MentionIDs: []string{}, - EmojiIDs: []string{}, - CreatedAt: theDistantFuture, - UpdatedAt: theDistantFuture, - Local: testrig.TrueBool(), - AccountURI: "http://localhost:8080/users/admin", - AccountID: "01F8MH17FWEB39HZJ76B6VXSKF", - InReplyToID: "", - BoostOfID: "", - ContentWarning: "", - Visibility: gtsmodel.VisibilityPublic, - Sensitive: testrig.FalseBool(), - Language: "en", - CreatedWithApplicationID: "01F8MGXQRHYF5QPMTMXP78QC2F", - Federated: testrig.TrueBool(), - Boostable: testrig.TrueBool(), - Replyable: testrig.TrueBool(), - Likeable: testrig.TrueBool(), - ActivityStreamsType: ap.ObjectNote, + suite.checkStatuses(s, id.Highest, id.Lowest, 11) +} + +func (suite *TimelineTestSuite) TestGetListTimelineMaxID() { + var ( + ctx = context.Background() + list = suite.testLists["local_account_1_list_1"] + ) + + s, err := suite.db.GetListTimeline(ctx, list.ID, id.Highest, "", "", 5) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.checkStatuses(s, id.Highest, id.Lowest, 5) + suite.Equal("01G36SF3V6Y6V5BF9P4R7PQG7G", s[0].ID) + suite.Equal("01FCQSQ667XHJ9AV9T27SJJSX5", s[len(s)-1].ID) +} + +func (suite *TimelineTestSuite) TestGetListTimelineMinID() { + var ( + ctx = context.Background() + list = suite.testLists["local_account_1_list_1"] + ) + + s, err := suite.db.GetListTimeline(ctx, list.ID, "", "", id.Lowest, 5) + if err != nil { + suite.FailNow(err.Error()) } + + suite.checkStatuses(s, id.Highest, id.Lowest, 5) + suite.Equal("01F8MHC8VWDRBQR0N1BATDDEM5", s[0].ID) + suite.Equal("01F8MH75CBF9JFX4ZAD54N0W0R", s[len(s)-1].ID) +} + +func (suite *TimelineTestSuite) TestGetListTimelineMinIDPagingUp() { + var ( + ctx = context.Background() + list = suite.testLists["local_account_1_list_1"] + ) + + s, err := suite.db.GetListTimeline(ctx, list.ID, "", "", "01F8MHC8VWDRBQR0N1BATDDEM5", 5) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.checkStatuses(s, id.Highest, "01F8MHC8VWDRBQR0N1BATDDEM5", 5) + suite.Equal("01G20ZM733MGN8J344T4ZDDFY1", s[0].ID) + suite.Equal("01F8MHCP5P2NWYQ416SBA0XSEV", s[len(s)-1].ID) } func TestTimelineTestSuite(t *testing.T) { |