diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/api/client/account/accountverify_test.go | 2 | ||||
| -rw-r--r-- | internal/api/client/status/status_test.go | 13 | ||||
| -rw-r--r-- | internal/api/client/status/statusboost_test.go | 6 | ||||
| -rw-r--r-- | internal/federation/federatingdb/following.go | 18 | ||||
| -rw-r--r-- | internal/federation/federatingdb/inbox_test.go | 56 | ||||
| -rw-r--r-- | internal/federation/federatingprotocol_test.go | 122 | ||||
| -rw-r--r-- | internal/federation/federator_test.go | 104 | ||||
| -rw-r--r-- | internal/timeline/index_test.go | 9 | ||||
| -rw-r--r-- | internal/visibility/filter_test.go | 2 | ||||
| -rw-r--r-- | internal/visibility/statusvisible_test.go | 5 | 
10 files changed, 227 insertions, 110 deletions
| diff --git a/internal/api/client/account/accountverify_test.go b/internal/api/client/account/accountverify_test.go index b5dfdd5e8..2732a6188 100644 --- a/internal/api/client/account/accountverify_test.go +++ b/internal/api/client/account/accountverify_test.go @@ -80,7 +80,7 @@ func (suite *AccountVerifyTestSuite) TestAccountVerifyGet() {  	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.jpeg", apimodelAccount.AvatarStatic)  	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpeg", apimodelAccount.Header)  	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpeg", apimodelAccount.HeaderStatic) -	suite.Zero(apimodelAccount.FollowersCount) +	suite.Equal(2, apimodelAccount.FollowersCount)  	suite.Equal(2, apimodelAccount.FollowingCount)  	suite.Equal(5, apimodelAccount.StatusesCount)  	suite.WithinDuration(time.Now(), lastStatusAt, 5*time.Minute) diff --git a/internal/api/client/status/status_test.go b/internal/api/client/status/status_test.go index 92466645b..a4a56aa0b 100644 --- a/internal/api/client/status/status_test.go +++ b/internal/api/client/status/status_test.go @@ -63,6 +63,7 @@ type StatusStandardTestSuite struct {  	testAccounts     map[string]*gtsmodel.Account  	testAttachments  map[string]*gtsmodel.MediaAttachment  	testStatuses     map[string]*gtsmodel.Status +	testFollows      map[string]*gtsmodel.Follow  	// module being tested  	statusModule *status.Module @@ -76,25 +77,27 @@ func (suite *StatusStandardTestSuite) SetupSuite() {  	suite.testAccounts = testrig.NewTestAccounts()  	suite.testAttachments = testrig.NewTestAttachments()  	suite.testStatuses = testrig.NewTestStatuses() +	suite.testFollows = testrig.NewTestFollows()  }  func (suite *StatusStandardTestSuite) SetupTest() {  	testrig.InitTestConfig()  	testrig.InitTestLog() -	fedWorker := worker.New[messages.FromFederator](-1, -1) -	clientWorker := worker.New[messages.FromClientAPI](-1, -1) -  	suite.db = testrig.NewTestDB()  	suite.tc = testrig.NewTestTypeConverter(suite.db)  	suite.storage = testrig.NewTestStorage() +	testrig.StandardDBSetup(suite.db, nil) +	testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") + +	fedWorker := worker.New[messages.FromFederator](-1, -1) +	clientWorker := worker.New[messages.FromClientAPI](-1, -1) +  	suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage)  	suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(suite.testHttpClient(), suite.db, fedWorker), suite.storage, suite.mediaManager, fedWorker)  	suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil)  	suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager, clientWorker, fedWorker)  	suite.statusModule = status.New(suite.processor).(*status.Module) -	testrig.StandardDBSetup(suite.db, nil) -	testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media")  }  func (suite *StatusStandardTestSuite) TearDownTest() { diff --git a/internal/api/client/status/statusboost_test.go b/internal/api/client/status/statusboost_test.go index 103c201ec..42693d9e0 100644 --- a/internal/api/client/status/statusboost_test.go +++ b/internal/api/client/status/statusboost_test.go @@ -16,6 +16,7 @@  package status_test  import ( +	"context"  	"encoding/json"  	"fmt"  	"io/ioutil" @@ -29,6 +30,7 @@ import (  	"github.com/stretchr/testify/suite"  	"github.com/superseriousbusiness/gotosocial/internal/api/client/status"  	"github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"  	"github.com/superseriousbusiness/gotosocial/internal/oauth"  ) @@ -144,6 +146,10 @@ func (suite *StatusBoostTestSuite) TestPostUnboostable() {  // try to boost a status that's not visible to the user  func (suite *StatusBoostTestSuite) TestPostNotVisible() { +	// stop local_account_2 following zork +	err := suite.db.DeleteByID(context.Background(), suite.testFollows["local_account_2_local_account_1"].ID, >smodel.Follow{}) +	suite.NoError(err) +  	t := suite.testTokens["local_account_2"]  	oauthToken := oauth.DBTokenToToken(t) diff --git a/internal/federation/federatingdb/following.go b/internal/federation/federatingdb/following.go index 54d703742..62b148d5b 100644 --- a/internal/federation/federatingdb/following.go +++ b/internal/federation/federatingdb/following.go @@ -1,3 +1,21 @@ +/* +   GoToSocial +   Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ +  package federatingdb  import ( diff --git a/internal/federation/federatingdb/inbox_test.go b/internal/federation/federatingdb/inbox_test.go new file mode 100644 index 000000000..d5cc46b8b --- /dev/null +++ b/internal/federation/federatingdb/inbox_test.go @@ -0,0 +1,56 @@ +/* +   GoToSocial +   Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +package federatingdb_test + +import ( +	"context" +	"testing" + +	"github.com/stretchr/testify/suite" +	"github.com/superseriousbusiness/gotosocial/testrig" +) + +type InboxTestSuite struct { +	FederatingDBTestSuite +} + +func (suite *InboxTestSuite) TestInboxesForFollowersIRI() { +	ctx := context.Background() +	testAccount := suite.testAccounts["local_account_1"] + +	inboxIRIs, err := suite.federatingDB.InboxesForIRI(ctx, testrig.URLMustParse(testAccount.FollowersURI)) +	suite.NoError(err) +	suite.Len(inboxIRIs, 2) +	suite.Equal(inboxIRIs[0].String(), suite.testAccounts["local_account_2"].InboxURI) +	suite.Equal(inboxIRIs[1].String(), suite.testAccounts["admin_account"].InboxURI) +} + +func (suite *InboxTestSuite) TestInboxesForAccountIRI() { +	ctx := context.Background() +	testAccount := suite.testAccounts["local_account_1"] + +	inboxIRIs, err := suite.federatingDB.InboxesForIRI(ctx, testrig.URLMustParse(testAccount.URI)) +	suite.NoError(err) +	suite.Len(inboxIRIs, 1) +	suite.Equal(inboxIRIs[0].String(), testAccount.InboxURI) +} + +func TestInboxTestSuite(t *testing.T) { +	suite.Run(t, &InboxTestSuite{}) +} diff --git a/internal/federation/federatingprotocol_test.go b/internal/federation/federatingprotocol_test.go new file mode 100644 index 000000000..953ad348b --- /dev/null +++ b/internal/federation/federatingprotocol_test.go @@ -0,0 +1,122 @@ +/* +   GoToSocial +   Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +package federation_test + +import ( +	"context" +	"net/http" +	"net/http/httptest" +	"testing" + +	"github.com/go-fed/httpsig" +	"github.com/stretchr/testify/suite" +	"github.com/superseriousbusiness/activity/pub" +	"github.com/superseriousbusiness/gotosocial/internal/ap" +	"github.com/superseriousbusiness/gotosocial/internal/federation" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +	"github.com/superseriousbusiness/gotosocial/internal/messages" +	"github.com/superseriousbusiness/gotosocial/internal/worker" +	"github.com/superseriousbusiness/gotosocial/testrig" +) + +type FederatingProtocolTestSuite struct { +	FederatorStandardTestSuite +} + +// make sure PostInboxRequestBodyHook properly sets the inbox username and activity on the context +func (suite *FederatingProtocolTestSuite) TestPostInboxRequestBodyHook() { +	// the activity we're gonna use +	activity := suite.activities["dm_for_zork"] + +	fedWorker := worker.New[messages.FromFederator](-1, -1) + +	// setup transport controller with a no-op client so we don't make external calls +	tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(func(req *http.Request) (*http.Response, error) { +		return nil, nil +	}), suite.db, fedWorker) +	// setup module being tested +	federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db, fedWorker), tc, suite.typeConverter, testrig.NewTestMediaManager(suite.db, suite.storage)) + +	// setup request +	ctx := context.Background() +	request := httptest.NewRequest(http.MethodPost, "http://localhost:8080/users/the_mighty_zork/inbox", nil) // the endpoint we're hitting +	request.Header.Set("Signature", activity.SignatureHeader) + +	// trigger the function being tested, and return the new context it creates +	newContext, err := federator.PostInboxRequestBodyHook(ctx, request, activity.Activity) +	suite.NoError(err) +	suite.NotNil(newContext) + +	// activity should be set on context now +	activityI := newContext.Value(ap.ContextActivity) +	suite.NotNil(activityI) +	returnedActivity, ok := activityI.(pub.Activity) +	suite.True(ok) +	suite.NotNil(returnedActivity) +	suite.EqualValues(activity.Activity, returnedActivity) +} + +func (suite *FederatingProtocolTestSuite) TestAuthenticatePostInbox() { +	// the activity we're gonna use +	activity := suite.activities["dm_for_zork"] +	sendingAccount := suite.accounts["remote_account_1"] +	inboxAccount := suite.accounts["local_account_1"] + +	fedWorker := worker.New[messages.FromFederator](-1, -1) + +	tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db, fedWorker) +	// now setup module being tested, with the mock transport controller +	federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db, fedWorker), tc, suite.typeConverter, testrig.NewTestMediaManager(suite.db, suite.storage)) + +	request := httptest.NewRequest(http.MethodPost, "http://localhost:8080/users/the_mighty_zork/inbox", nil) +	// we need these headers for the request to be validated +	request.Header.Set("Signature", activity.SignatureHeader) +	request.Header.Set("Date", activity.DateHeader) +	request.Header.Set("Digest", activity.DigestHeader) + +	verifier, err := httpsig.NewVerifier(request) +	suite.NoError(err) + +	ctx := context.Background() +	// by the time AuthenticatePostInbox is called, PostInboxRequestBodyHook should have already been called, +	// which should have set the account and username onto the request. We can replicate that behavior here: +	ctxWithAccount := context.WithValue(ctx, ap.ContextReceivingAccount, inboxAccount) +	ctxWithActivity := context.WithValue(ctxWithAccount, ap.ContextActivity, activity) +	ctxWithVerifier := context.WithValue(ctxWithActivity, ap.ContextRequestingPublicKeyVerifier, verifier) +	ctxWithSignature := context.WithValue(ctxWithVerifier, ap.ContextRequestingPublicKeySignature, activity.SignatureHeader) + +	// we can pass this recorder as a writer and read it back after +	recorder := httptest.NewRecorder() + +	// trigger the function being tested, and return the new context it creates +	newContext, authed, err := federator.AuthenticatePostInbox(ctxWithSignature, recorder, request) +	suite.NoError(err) +	suite.True(authed) + +	// since we know this account already it should be set on the context +	requestingAccountI := newContext.Value(ap.ContextRequestingAccount) +	suite.NotNil(requestingAccountI) +	requestingAccount, ok := requestingAccountI.(*gtsmodel.Account) +	suite.True(ok) +	suite.Equal(sendingAccount.Username, requestingAccount.Username) +} + +func TestFederatingProtocolTestSuite(t *testing.T) { +	suite.Run(t, new(FederatingProtocolTestSuite)) +} diff --git a/internal/federation/federator_test.go b/internal/federation/federator_test.go index 220c3a193..68ad606f8 100644 --- a/internal/federation/federator_test.go +++ b/internal/federation/federator_test.go @@ -19,28 +19,16 @@  package federation_test  import ( -	"context" -	"net/http" -	"net/http/httptest" -	"testing" -  	"codeberg.org/gruf/go-store/kv" -	"github.com/go-fed/httpsig" -	"github.com/stretchr/testify/assert"  	"github.com/stretchr/testify/suite" -	"github.com/superseriousbusiness/activity/pub" -	"github.com/superseriousbusiness/gotosocial/internal/ap"  	"github.com/superseriousbusiness/gotosocial/internal/db" -	"github.com/superseriousbusiness/gotosocial/internal/federation"  	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -	"github.com/superseriousbusiness/gotosocial/internal/messages"  	"github.com/superseriousbusiness/gotosocial/internal/typeutils" -	"github.com/superseriousbusiness/gotosocial/internal/worker"  	"github.com/superseriousbusiness/gotosocial/testrig"  ) -type ProtocolTestSuite struct { +type FederatorStandardTestSuite struct {  	suite.Suite  	db            db.DB  	storage       *kv.KVStore @@ -50,104 +38,22 @@ type ProtocolTestSuite struct {  }  // SetupSuite sets some variables on the suite that we can use as consts (more or less) throughout -func (suite *ProtocolTestSuite) SetupSuite() { +func (suite *FederatorStandardTestSuite) SetupSuite() {  	// setup standard items  	suite.storage = testrig.NewTestStorage()  	suite.typeConverter = testrig.NewTestTypeConverter(suite.db)  	suite.accounts = testrig.NewTestAccounts()  } -func (suite *ProtocolTestSuite) SetupTest() { -	testrig.InitTestLog() +func (suite *FederatorStandardTestSuite) SetupTest() {  	testrig.InitTestConfig() +	testrig.InitTestLog()  	suite.db = testrig.NewTestDB()  	suite.activities = testrig.NewTestActivities(suite.accounts)  	testrig.StandardDBSetup(suite.db, suite.accounts)  }  // TearDownTest drops tables to make sure there's no data in the db -func (suite *ProtocolTestSuite) TearDownTest() { +func (suite *FederatorStandardTestSuite) TearDownTest() {  	testrig.StandardDBTeardown(suite.db)  } - -// make sure PostInboxRequestBodyHook properly sets the inbox username and activity on the context -func (suite *ProtocolTestSuite) TestPostInboxRequestBodyHook() { -	// the activity we're gonna use -	activity := suite.activities["dm_for_zork"] - -	fedWorker := worker.New[messages.FromFederator](-1, -1) - -	// setup transport controller with a no-op client so we don't make external calls -	tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(func(req *http.Request) (*http.Response, error) { -		return nil, nil -	}), suite.db, fedWorker) -	// setup module being tested -	federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db, fedWorker), tc, suite.typeConverter, testrig.NewTestMediaManager(suite.db, suite.storage)) - -	// setup request -	ctx := context.Background() -	request := httptest.NewRequest(http.MethodPost, "http://localhost:8080/users/the_mighty_zork/inbox", nil) // the endpoint we're hitting -	request.Header.Set("Signature", activity.SignatureHeader) - -	// trigger the function being tested, and return the new context it creates -	newContext, err := federator.PostInboxRequestBodyHook(ctx, request, activity.Activity) -	assert.NoError(suite.T(), err) -	assert.NotNil(suite.T(), newContext) - -	// activity should be set on context now -	activityI := newContext.Value(ap.ContextActivity) -	assert.NotNil(suite.T(), activityI) -	returnedActivity, ok := activityI.(pub.Activity) -	assert.True(suite.T(), ok) -	assert.NotNil(suite.T(), returnedActivity) -	assert.EqualValues(suite.T(), activity.Activity, returnedActivity) -} - -func (suite *ProtocolTestSuite) TestAuthenticatePostInbox() { -	// the activity we're gonna use -	activity := suite.activities["dm_for_zork"] -	sendingAccount := suite.accounts["remote_account_1"] -	inboxAccount := suite.accounts["local_account_1"] - -	fedWorker := worker.New[messages.FromFederator](-1, -1) - -	tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db, fedWorker) -	// now setup module being tested, with the mock transport controller -	federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db, fedWorker), tc, suite.typeConverter, testrig.NewTestMediaManager(suite.db, suite.storage)) - -	request := httptest.NewRequest(http.MethodPost, "http://localhost:8080/users/the_mighty_zork/inbox", nil) -	// we need these headers for the request to be validated -	request.Header.Set("Signature", activity.SignatureHeader) -	request.Header.Set("Date", activity.DateHeader) -	request.Header.Set("Digest", activity.DigestHeader) - -	verifier, err := httpsig.NewVerifier(request) -	assert.NoError(suite.T(), err) - -	ctx := context.Background() -	// by the time AuthenticatePostInbox is called, PostInboxRequestBodyHook should have already been called, -	// which should have set the account and username onto the request. We can replicate that behavior here: -	ctxWithAccount := context.WithValue(ctx, ap.ContextReceivingAccount, inboxAccount) -	ctxWithActivity := context.WithValue(ctxWithAccount, ap.ContextActivity, activity) -	ctxWithVerifier := context.WithValue(ctxWithActivity, ap.ContextRequestingPublicKeyVerifier, verifier) -	ctxWithSignature := context.WithValue(ctxWithVerifier, ap.ContextRequestingPublicKeySignature, activity.SignatureHeader) - -	// we can pass this recorder as a writer and read it back after -	recorder := httptest.NewRecorder() - -	// trigger the function being tested, and return the new context it creates -	newContext, authed, err := federator.AuthenticatePostInbox(ctxWithSignature, recorder, request) -	assert.NoError(suite.T(), err) -	assert.True(suite.T(), authed) - -	// since we know this account already it should be set on the context -	requestingAccountI := newContext.Value(ap.ContextRequestingAccount) -	assert.NotNil(suite.T(), requestingAccountI) -	requestingAccount, ok := requestingAccountI.(*gtsmodel.Account) -	assert.True(suite.T(), ok) -	assert.Equal(suite.T(), sendingAccount.Username, requestingAccount.Username) -} - -func TestProtocolTestSuite(t *testing.T) { -	suite.Run(t, new(ProtocolTestSuite)) -} diff --git a/internal/timeline/index_test.go b/internal/timeline/index_test.go index 3f4822dcb..acefe2b4c 100644 --- a/internal/timeline/index_test.go +++ b/internal/timeline/index_test.go @@ -74,13 +74,12 @@ func (suite *IndexTestSuite) TestIndexBeforeLowID() {  	err := suite.timeline.IndexBefore(context.Background(), "00000000000000000000000000", 10)  	suite.NoError(err) -	// the oldest indexed post should be the lowest one we have in our testrig  	postID, err := suite.timeline.OldestIndexedItemID(context.Background())  	suite.NoError(err) -	suite.Equal("01F8MHAYFKS4KMXF8K5Y1C0KRN", postID) +	suite.Equal("01F8MHBBN8120SYH7D5S050MGK", postID)  	indexLength := suite.timeline.ItemIndexLength(context.Background()) -	suite.Equal(10, indexLength) +	suite.Equal(9, indexLength)  }  func (suite *IndexTestSuite) TestIndexBeforeHighID() { @@ -108,9 +107,9 @@ func (suite *IndexTestSuite) TestIndexBehindHighID() {  	suite.NoError(err)  	suite.Equal("01FN3VJGFH10KR7S2PB0GFJZYG", postID) -	// indexLength should be 10 because that's all this user has hometimelineable +	// indexLength should be 9 because that's all this user has hometimelineable  	indexLength := suite.timeline.ItemIndexLength(context.Background()) -	suite.Equal(10, indexLength) +	suite.Equal(9, indexLength)  }  func (suite *IndexTestSuite) TestIndexBehindLowID() { diff --git a/internal/visibility/filter_test.go b/internal/visibility/filter_test.go index 5c10a4210..1283a50de 100644 --- a/internal/visibility/filter_test.go +++ b/internal/visibility/filter_test.go @@ -41,6 +41,7 @@ type FilterStandardTestSuite struct {  	testStatuses     map[string]*gtsmodel.Status  	testTags         map[string]*gtsmodel.Tag  	testMentions     map[string]*gtsmodel.Mention +	testFollows      map[string]*gtsmodel.Follow  	filter visibility.Filter  } @@ -55,6 +56,7 @@ func (suite *FilterStandardTestSuite) SetupSuite() {  	suite.testStatuses = testrig.NewTestStatuses()  	suite.testTags = testrig.NewTestTags()  	suite.testMentions = testrig.NewTestMentions() +	suite.testFollows = testrig.NewTestFollows()  }  func (suite *FilterStandardTestSuite) SetupTest() { diff --git a/internal/visibility/statusvisible_test.go b/internal/visibility/statusvisible_test.go index e23973b5a..e7f6aa09d 100644 --- a/internal/visibility/statusvisible_test.go +++ b/internal/visibility/statusvisible_test.go @@ -23,6 +23,7 @@ import (  	"testing"  	"github.com/stretchr/testify/suite" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"  )  type StatusVisibleTestSuite struct { @@ -85,6 +86,8 @@ func (suite *StatusVisibleTestSuite) TestDMNotVisibleIfNotMentioned() {  func (suite *StatusVisibleTestSuite) TestStatusNotVisibleIfNotMutuals() {  	ctx := context.Background() +	suite.db.DeleteByID(ctx, suite.testFollows["local_account_2_local_account_1"].ID, >smodel.Follow{}) +  	testStatusID := suite.testStatuses["local_account_1_status_4"].ID  	testStatus, err := suite.db.GetStatusByID(ctx, testStatusID)  	suite.NoError(err) @@ -99,6 +102,8 @@ func (suite *StatusVisibleTestSuite) TestStatusNotVisibleIfNotMutuals() {  func (suite *StatusVisibleTestSuite) TestStatusNotVisibleIfNotFollowing() {  	ctx := context.Background() +	suite.db.DeleteByID(ctx, suite.testFollows["admin_account_local_account_1"].ID, >smodel.Follow{}) +  	testStatusID := suite.testStatuses["local_account_1_status_5"].ID  	testStatus, err := suite.db.GetStatusByID(ctx, testStatusID)  	suite.NoError(err) | 
