diff --git a/internal/federation/federatingdb/create_test.go b/internal/federation/federatingdb/create_test.go new file mode 100644 index 000000000..645a009ee --- /dev/null +++ b/internal/federation/federatingdb/create_test.go @@ -0,0 +1,86 @@ +/* + GoToSocial + Copyright (C) 2021 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 . +*/ + +package federatingdb_test + +import ( + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/messages" +) + +type CreateTestSuite struct { + FederatingDBTestSuite +} + +func (suite *CreateTestSuite) TestCreateNote() { + receivingAccount := suite.testAccounts["local_account_1"] + requestingAccount := suite.testAccounts["remote_account_1"] + fromFederatorChan := make(chan messages.FromFederator, 10) + + ctx := createTestContext(receivingAccount, requestingAccount, fromFederatorChan) + + create := suite.testActivities["dm_for_zork"].Activity + + err := suite.federatingDB.Create(ctx, create) + suite.NoError(err) + + // should be a message heading to the processor now, which we can intercept here + msg := <-fromFederatorChan + suite.Equal(ap.ObjectNote, msg.APObjectType) + suite.Equal(ap.ActivityCreate, msg.APActivityType) + + // shiny new status should be defined on the message + suite.NotNil(msg.GTSModel) + status := msg.GTSModel.(*gtsmodel.Status) + + // status should have some expected values + suite.Equal(requestingAccount.ID, status.AccountID) + suite.Equal("hey zork here's a new private note for you", status.Content) +} + +func (suite *CreateTestSuite) TestCreateNoteForward() { + receivingAccount := suite.testAccounts["local_account_1"] + requestingAccount := suite.testAccounts["remote_account_1"] + fromFederatorChan := make(chan messages.FromFederator, 10) + + ctx := createTestContext(receivingAccount, requestingAccount, fromFederatorChan) + + create := suite.testActivities["forwarded_message"].Activity + + err := suite.federatingDB.Create(ctx, create) + suite.NoError(err) + + // should be a message heading to the processor now, which we can intercept here + msg := <-fromFederatorChan + suite.Equal(ap.ObjectNote, msg.APObjectType) + suite.Equal(ap.ActivityCreate, msg.APActivityType) + + // nothing should be set as the model since this is a forward + suite.Nil(msg.GTSModel) + + // but we should have a uri set + suite.Equal("http://example.org/users/some_user/statuses/afaba698-5740-4e32-a702-af61aa543bc1", msg.APIri.String()) +} + +func TestCreateTestSuite(t *testing.T) { + suite.Run(t, &CreateTestSuite{}) +} diff --git a/internal/federation/federatingdb/federatingdb_test.go b/internal/federation/federatingdb/federatingdb_test.go index fc78540f2..3c22480f7 100644 --- a/internal/federation/federatingdb/federatingdb_test.go +++ b/internal/federation/federatingdb/federatingdb_test.go @@ -19,13 +19,17 @@ package federatingdb_test import ( + "context" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/federation/federatingdb" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/messages" "github.com/superseriousbusiness/gotosocial/internal/typeutils" + "github.com/superseriousbusiness/gotosocial/internal/util" "github.com/superseriousbusiness/gotosocial/testrig" ) @@ -45,6 +49,7 @@ type FederatingDBTestSuite struct { testAttachments map[string]*gtsmodel.MediaAttachment testStatuses map[string]*gtsmodel.Status testBlocks map[string]*gtsmodel.Block + testActivities map[string]testrig.ActivityWithSignature } func (suite *FederatingDBTestSuite) SetupSuite() { @@ -56,6 +61,7 @@ func (suite *FederatingDBTestSuite) SetupSuite() { suite.testAttachments = testrig.NewTestAttachments() suite.testStatuses = testrig.NewTestStatuses() suite.testBlocks = testrig.NewTestBlocks() + suite.testActivities = testrig.NewTestActivities(suite.testAccounts) } func (suite *FederatingDBTestSuite) SetupTest() { @@ -70,3 +76,11 @@ func (suite *FederatingDBTestSuite) SetupTest() { func (suite *FederatingDBTestSuite) TearDownTest() { testrig.StandardDBTeardown(suite.db) } + +func createTestContext(receivingAccount *gtsmodel.Account, requestingAccount *gtsmodel.Account, fromFederatorChan chan messages.FromFederator) context.Context { + ctx := context.Background() + ctx = context.WithValue(ctx, util.APReceivingAccount, receivingAccount) + ctx = context.WithValue(ctx, util.APRequestingAccount, requestingAccount) + ctx = context.WithValue(ctx, util.APFromFederatorChanKey, fromFederatorChan) + return ctx +} diff --git a/testrig/testmodels.go b/testrig/testmodels.go index a868d7aff..46ce1cf12 100644 --- a/testrig/testmodels.go +++ b/testrig/testmodels.go @@ -1283,14 +1283,38 @@ func NewTestActivities(accounts map[string]*gtsmodel.Account) map[string]Activit URLMustParse("http://fossbros-anonymous.io/users/foss_satan"), time.Now(), dmForZork) - sig, digest, date := GetSignatureForActivity(createDmForZork, accounts["remote_account_1"].PublicKeyURI, accounts["remote_account_1"].PrivateKey, URLMustParse(accounts["local_account_1"].InboxURI)) + createDmForZorkSig, createDmForZorkDigest, creatDmForZorkDate := GetSignatureForActivity(createDmForZork, accounts["remote_account_1"].PublicKeyURI, accounts["remote_account_1"].PrivateKey, URLMustParse(accounts["local_account_1"].InboxURI)) + + forwardedMessage := newNote( + URLMustParse("http://example.org/users/some_user/statuses/afaba698-5740-4e32-a702-af61aa543bc1"), + URLMustParse("http://example.org/@some_user/afaba698-5740-4e32-a702-af61aa543bc1"), + time.Now(), + "this is a public status, please forward it!", + "", + URLMustParse("http://example.org/users/some_user"), + []*url.URL{URLMustParse(pub.PublicActivityPubIRI)}, + nil, + false, + []vocab.ActivityStreamsMention{}) + createForwardedMessage := wrapNoteInCreate( + URLMustParse("http://example.org/users/some_user/statuses/afaba698-5740-4e32-a702-af61aa543bc1/activity"), + URLMustParse("http://example.org/users/some_user"), + time.Now(), + forwardedMessage) + createForwardedMessageSig, createForwardedMessageDigest, createForwardedMessageDate := GetSignatureForActivity(createForwardedMessage, accounts["remote_account_1"].PublicKeyURI, accounts["remote_account_1"].PrivateKey, URLMustParse(accounts["local_account_1"].InboxURI)) return map[string]ActivityWithSignature{ "dm_for_zork": { Activity: createDmForZork, - SignatureHeader: sig, - DigestHeader: digest, - DateHeader: date, + SignatureHeader: createDmForZorkSig, + DigestHeader: createDmForZorkDigest, + DateHeader: creatDmForZorkDate, + }, + "forwarded_message": { + Activity: createForwardedMessage, + SignatureHeader: createForwardedMessageSig, + DigestHeader: createForwardedMessageDigest, + DateHeader: createForwardedMessageDate, }, } }