diff options
author | 2024-07-04 19:29:28 -0700 | |
---|---|---|
committer | 2024-07-04 19:29:28 -0700 | |
commit | be5e532cd21fdbdfd1589186ed66a495ed5b8b35 (patch) | |
tree | d70eb05166f08225c484474bbef4bbbdc04bdf2b /internal/processing/timeline/public_test.go | |
parent | [feature] Set some security related headers (#3065) (diff) | |
download | gotosocial-be5e532cd21fdbdfd1589186ed66a495ed5b8b35.tar.xz |
[bugfix] Handle ErrHideStatus when preparing timeline statuses (#3071)
Diffstat (limited to 'internal/processing/timeline/public_test.go')
-rw-r--r-- | internal/processing/timeline/public_test.go | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/internal/processing/timeline/public_test.go b/internal/processing/timeline/public_test.go index f14fee1b9..6b01c9849 100644 --- a/internal/processing/timeline/public_test.go +++ b/internal/processing/timeline/public_test.go @@ -22,6 +22,10 @@ import ( "testing" "github.com/stretchr/testify/suite" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/util" ) type PublicTestSuite struct { @@ -91,6 +95,93 @@ func (suite *PublicTestSuite) TestPublicTimelineGetNotEmpty() { suite.Equal(`http://localhost:8080/api/v1/timelines/public?limit=1&min_id=01HE7XJ1CG84TBKH5V9XKBVGF5&local=false`, resp.PrevLink) } +// A timeline containing a status hidden due to filtering should return other statuses with no error. +func (suite *PublicTestSuite) TestPublicTimelineGetHideFiltered() { + var ( + ctx = context.Background() + requester = suite.testAccounts["local_account_1"] + maxID = "" + sinceID = "" + minID = "01F8MHAAY43M6RJ473VQFCVH36" // 1 before filteredStatus + limit = 10 + local = false + filteredStatus = suite.testStatuses["admin_account_status_2"] + filteredStatusFound = false + filterID = id.NewULID() + filter = >smodel.Filter{ + ID: filterID, + AccountID: requester.ID, + Title: "timeline filtering test", + Action: gtsmodel.FilterActionHide, + Statuses: []*gtsmodel.FilterStatus{ + { + ID: id.NewULID(), + AccountID: requester.ID, + FilterID: filterID, + StatusID: filteredStatus.ID, + }, + }, + ContextHome: util.Ptr(false), + ContextNotifications: util.Ptr(false), + ContextPublic: util.Ptr(true), + ContextThread: util.Ptr(false), + ContextAccount: util.Ptr(false), + } + ) + + // Fetch the timeline to make sure the status we're going to filter is in that section of it. + resp, errWithCode := suite.timeline.PublicTimelineGet( + ctx, + requester, + maxID, + sinceID, + minID, + limit, + local, + ) + suite.NoError(errWithCode) + for _, item := range resp.Items { + if item.(*apimodel.Status).ID == filteredStatus.ID { + filteredStatusFound = true + break + } + } + if !filteredStatusFound { + suite.FailNow("precondition failed: status we would filter isn't present in unfiltered timeline") + } + // The public timeline has no prepared status cache and doesn't need to be pruned, + // as in the home timeline version of this test. + + // Create a filter to hide one status on the timeline. + if err := suite.db.PutFilter(ctx, filter); err != nil { + suite.FailNow(err.Error()) + } + + // Fetch the timeline again with the filter in place. + resp, errWithCode = suite.timeline.PublicTimelineGet( + ctx, + requester, + maxID, + sinceID, + minID, + limit, + local, + ) + + // We should have some statuses even though one status was filtered out. + suite.NoError(errWithCode) + suite.NotEmpty(resp.Items) + // The filtered status should not be there. + filteredStatusFound = false + for _, item := range resp.Items { + if item.(*apimodel.Status).ID == filteredStatus.ID { + filteredStatusFound = true + break + } + } + suite.False(filteredStatusFound) +} + func TestPublicTestSuite(t *testing.T) { suite.Run(t, new(PublicTestSuite)) } |