summaryrefslogtreecommitdiff
path: root/internal/processing/account/move_test.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2024-03-13 13:53:29 +0100
committerLibravatar GitHub <noreply@github.com>2024-03-13 13:53:29 +0100
commitab2d063fcb04f241a3147c843a021491f5fc0a55 (patch)
tree3d2eff864e8b19d4d9a24f4f1fe92feda8ee4dac /internal/processing/account/move_test.go
parent[bugfix]: Add missing Link headers in Swagger spec (#2751) (diff)
downloadgotosocial-ab2d063fcb04f241a3147c843a021491f5fc0a55.tar.xz
[feature] Process outgoing Move from clientAPI (#2750)
* prevent moved accounts from taking create-type actions * update move logic * federate move out * indicate on web profile when an account has moved * [docs] Add migration docs section * lock while checking + setting move state * use redirectFollowers func for clientAPI as well * comment typo * linter? i barely know 'er! * Update internal/uris/uri.go Co-authored-by: Daenney <daenney@users.noreply.github.com> * add a couple tests for move * fix little mistake exposed by tests (thanks tests) * ensure Move marked as successful * attach shared util funcs to struct * lock whole account when doing move * move moving check to after error check * replace repeated text with error func * linterrrrrr!!!! * catch self follow case --------- Co-authored-by: Daenney <daenney@users.noreply.github.com>
Diffstat (limited to 'internal/processing/account/move_test.go')
-rw-r--r--internal/processing/account/move_test.go175
1 files changed, 175 insertions, 0 deletions
diff --git a/internal/processing/account/move_test.go b/internal/processing/account/move_test.go
new file mode 100644
index 000000000..dfa0ea4e4
--- /dev/null
+++ b/internal/processing/account/move_test.go
@@ -0,0 +1,175 @@
+// GoToSocial
+// Copyright (C) GoToSocial Authors admin@gotosocial.org
+// SPDX-License-Identifier: AGPL-3.0-or-later
+//
+// 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 account_test
+
+import (
+ "context"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/suite"
+ apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model"
+ "github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
+ "github.com/superseriousbusiness/gotosocial/internal/oauth"
+)
+
+type MoveTestSuite struct {
+ AccountStandardTestSuite
+}
+
+func (suite *MoveTestSuite) TestMoveAccountOK() {
+ ctx := context.Background()
+
+ // Copy zork.
+ requestingAcct := new(gtsmodel.Account)
+ *requestingAcct = *suite.testAccounts["local_account_1"]
+
+ // Copy admin.
+ targetAcct := new(gtsmodel.Account)
+ *targetAcct = *suite.testAccounts["admin_account"]
+
+ // Update admin to alias back to zork.
+ targetAcct.AlsoKnownAsURIs = []string{requestingAcct.URI}
+ if err := suite.state.DB.UpdateAccount(
+ ctx,
+ targetAcct,
+ "also_known_as_uris",
+ ); err != nil {
+ suite.FailNow(err.Error())
+ }
+
+ // Trigger move from zork to admin.
+ if err := suite.accountProcessor.MoveSelf(
+ ctx,
+ &oauth.Auth{
+ Token: oauth.DBTokenToToken(suite.testTokens["local_account_1"]),
+ Application: suite.testApplications["local_account_1"],
+ User: suite.testUsers["local_account_1"],
+ Account: requestingAcct,
+ },
+ &apimodel.AccountMoveRequest{
+ Password: "password",
+ MovedToURI: targetAcct.URI,
+ },
+ ); err != nil {
+ suite.FailNow(err.Error())
+ }
+
+ // There should be a msg heading back to fromClientAPI.
+ select {
+ case msg := <-suite.fromClientAPIChan:
+ move, ok := msg.GTSModel.(*gtsmodel.Move)
+ if !ok {
+ suite.FailNow("", "could not cast %T to *gtsmodel.Move", move)
+ }
+
+ now := time.Now()
+ suite.WithinDuration(now, move.CreatedAt, 5*time.Second)
+ suite.WithinDuration(now, move.UpdatedAt, 5*time.Second)
+ suite.WithinDuration(now, move.AttemptedAt, 5*time.Second)
+ suite.Zero(move.SucceededAt)
+ suite.NotZero(move.ID)
+ suite.Equal(requestingAcct.URI, move.OriginURI)
+ suite.NotNil(move.Origin)
+ suite.Equal(targetAcct.URI, move.TargetURI)
+ suite.NotNil(move.Target)
+ suite.NotZero(move.URI)
+
+ case <-time.After(5 * time.Second):
+ suite.FailNow("time out waiting for message")
+ }
+
+ // Move should be in the database now.
+ move, err := suite.state.DB.GetMoveByOriginTarget(
+ ctx,
+ requestingAcct.URI,
+ targetAcct.URI,
+ )
+ if err != nil {
+ suite.FailNow(err.Error())
+ }
+ suite.NotNil(move)
+
+ // Origin account should have move ID and move to URI set.
+ suite.Equal(move.ID, requestingAcct.MoveID)
+ suite.Equal(targetAcct.URI, requestingAcct.MovedToURI)
+}
+
+func (suite *MoveTestSuite) TestMoveAccountNotAliased() {
+ ctx := context.Background()
+
+ // Copy zork.
+ requestingAcct := new(gtsmodel.Account)
+ *requestingAcct = *suite.testAccounts["local_account_1"]
+
+ // Don't copy admin.
+ targetAcct := suite.testAccounts["admin_account"]
+
+ // Trigger move from zork to admin.
+ //
+ // Move should fail since admin is
+ // not aliased back to zork.
+ err := suite.accountProcessor.MoveSelf(
+ ctx,
+ &oauth.Auth{
+ Token: oauth.DBTokenToToken(suite.testTokens["local_account_1"]),
+ Application: suite.testApplications["local_account_1"],
+ User: suite.testUsers["local_account_1"],
+ Account: requestingAcct,
+ },
+ &apimodel.AccountMoveRequest{
+ Password: "password",
+ MovedToURI: targetAcct.URI,
+ },
+ )
+ suite.EqualError(err, "target account http://localhost:8080/users/admin is not aliased to this account via alsoKnownAs; if you just changed it, please wait a few minutes and try the Move again")
+}
+
+func (suite *MoveTestSuite) TestMoveAccountBadPassword() {
+ ctx := context.Background()
+
+ // Copy zork.
+ requestingAcct := new(gtsmodel.Account)
+ *requestingAcct = *suite.testAccounts["local_account_1"]
+
+ // Don't copy admin.
+ targetAcct := suite.testAccounts["admin_account"]
+
+ // Trigger move from zork to admin.
+ //
+ // Move should fail since admin is
+ // not aliased back to zork.
+ err := suite.accountProcessor.MoveSelf(
+ ctx,
+ &oauth.Auth{
+ Token: oauth.DBTokenToToken(suite.testTokens["local_account_1"]),
+ Application: suite.testApplications["local_account_1"],
+ User: suite.testUsers["local_account_1"],
+ Account: requestingAcct,
+ },
+ &apimodel.AccountMoveRequest{
+ Password: "boobies",
+ MovedToURI: targetAcct.URI,
+ },
+ )
+ suite.EqualError(err, "invalid password provided in account Move request")
+}
+
+func TestMoveTestSuite(t *testing.T) {
+ suite.Run(t, new(MoveTestSuite))
+}