mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[bugfix] Handle ErrHideStatus when preparing timeline statuses (#3071)
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
Reference in New Issue
Block a user