| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    GoToSocial | 
					
						
							| 
									
										
										
										
											2021-12-20 18:42:19 +01:00
										 |  |  |    Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | package bundb_test | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2021-09-28 15:21:59 +02:00
										 |  |  | 	"crypto/rand" | 
					
						
							|  |  |  | 	"crypto/rsa" | 
					
						
							| 
									
										
										
										
											2022-12-01 16:06:09 +01:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							| 
									
										
										
										
											2021-09-28 15:21:59 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/ap" | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/db/bundb" | 
					
						
							| 
									
										
										
										
											2021-09-28 15:21:59 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	"github.com/uptrace/bun" | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type AccountTestSuite struct { | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	BunDBStandardTestSuite | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-23 17:40:03 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountStatuses() { | 
					
						
							|  |  |  | 	statuses, err := suite.db.GetAccountStatuses(context.Background(), suite.testAccounts["local_account_1"].ID, 20, false, false, "", "", false, false, false) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Len(statuses, 5) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 13:50:48 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountStatusesExcludeRepliesAndReblogs() { | 
					
						
							|  |  |  | 	statuses, err := suite.db.GetAccountStatuses(context.Background(), suite.testAccounts["local_account_1"].ID, 20, true, true, "", "", false, false, false) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Len(statuses, 5) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *AccountTestSuite) TestGetAccountStatusesExcludeRepliesAndReblogsPublicOnly() { | 
					
						
							|  |  |  | 	statuses, err := suite.db.GetAccountStatuses(context.Background(), suite.testAccounts["local_account_1"].ID, 20, true, true, "", "", false, false, true) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Len(statuses, 1) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-10 10:56:49 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountStatusesMediaOnly() { | 
					
						
							|  |  |  | 	statuses, err := suite.db.GetAccountStatuses(context.Background(), suite.testAccounts["local_account_1"].ID, 20, false, false, "", "", false, true, false) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Len(statuses, 1) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountByIDWithExtras() { | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	account, err := suite.db.GetAccountByID(context.Background(), suite.testAccounts["local_account_1"].ID) | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	suite.NotNil(account) | 
					
						
							|  |  |  | 	suite.NotNil(account.AvatarMediaAttachment) | 
					
						
							|  |  |  | 	suite.NotEmpty(account.AvatarMediaAttachment.URL) | 
					
						
							|  |  |  | 	suite.NotNil(account.HeaderMediaAttachment) | 
					
						
							|  |  |  | 	suite.NotEmpty(account.HeaderMediaAttachment.URL) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-20 22:47:19 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountByUsernameDomain() { | 
					
						
							|  |  |  | 	testAccount1 := suite.testAccounts["local_account_1"] | 
					
						
							|  |  |  | 	account1, err := suite.db.GetAccountByUsernameDomain(context.Background(), testAccount1.Username, testAccount1.Domain) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.NotNil(account1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testAccount2 := suite.testAccounts["remote_account_1"] | 
					
						
							|  |  |  | 	account2, err := suite.db.GetAccountByUsernameDomain(context.Background(), testAccount2.Username, testAccount2.Domain) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.NotNil(account2) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-01 16:06:09 +01:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountByUsernameDomainMixedCase() { | 
					
						
							|  |  |  | 	testAccount := suite.testAccounts["remote_account_2"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	account1, err := suite.db.GetAccountByUsernameDomain(context.Background(), testAccount.Username, testAccount.Domain) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.NotNil(account1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	account2, err := suite.db.GetAccountByUsernameDomain(context.Background(), strings.ToUpper(testAccount.Username), testAccount.Domain) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.NotNil(account2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	account3, err := suite.db.GetAccountByUsernameDomain(context.Background(), strings.ToLower(testAccount.Username), testAccount.Domain) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.NotNil(account3) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | func (suite *AccountTestSuite) TestUpdateAccount() { | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	ctx := context.Background() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	testAccount := suite.testAccounts["local_account_1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testAccount.DisplayName = "new display name!" | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	testAccount.EmojiIDs = []string{"01GD36ZKWTKY3T1JJ24JR7KY1Q", "01GD36ZV904SHBHNAYV6DX5QEF"} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-15 18:45:15 +00:00
										 |  |  | 	err := suite.db.UpdateAccount(ctx, testAccount) | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	updated, err := suite.db.GetAccountByID(ctx, testAccount.ID) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("new display name!", updated.DisplayName) | 
					
						
							|  |  |  | 	suite.Equal([]string{"01GD36ZKWTKY3T1JJ24JR7KY1Q", "01GD36ZV904SHBHNAYV6DX5QEF"}, updated.EmojiIDs) | 
					
						
							|  |  |  | 	suite.WithinDuration(time.Now(), updated.UpdatedAt, 5*time.Second) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get account without cache + make sure it's really in the db as desired | 
					
						
							|  |  |  | 	dbService, ok := suite.db.(*bundb.DBService) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		panic("db was not *bundb.DBService") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	noCache := >smodel.Account{} | 
					
						
							|  |  |  | 	err = dbService.GetConn(). | 
					
						
							|  |  |  | 		NewSelect(). | 
					
						
							|  |  |  | 		Model(noCache). | 
					
						
							| 
									
										
										
										
											2022-10-08 13:50:48 +02:00
										 |  |  | 		Where("? = ?", bun.Ident("account.id"), testAccount.ID). | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 		Relation("AvatarMediaAttachment"). | 
					
						
							|  |  |  | 		Relation("HeaderMediaAttachment"). | 
					
						
							|  |  |  | 		Relation("Emojis"). | 
					
						
							|  |  |  | 		Scan(ctx) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("new display name!", noCache.DisplayName) | 
					
						
							|  |  |  | 	suite.Equal([]string{"01GD36ZKWTKY3T1JJ24JR7KY1Q", "01GD36ZV904SHBHNAYV6DX5QEF"}, noCache.EmojiIDs) | 
					
						
							|  |  |  | 	suite.WithinDuration(time.Now(), noCache.UpdatedAt, 5*time.Second) | 
					
						
							|  |  |  | 	suite.NotNil(noCache.AvatarMediaAttachment) | 
					
						
							|  |  |  | 	suite.NotNil(noCache.HeaderMediaAttachment) | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	// update again to remove emoji associations | 
					
						
							|  |  |  | 	testAccount.EmojiIDs = []string{} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-15 18:45:15 +00:00
										 |  |  | 	err = suite.db.UpdateAccount(ctx, testAccount) | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	updated, err = suite.db.GetAccountByID(ctx, testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("new display name!", updated.DisplayName) | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 	suite.Empty(updated.EmojiIDs) | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	suite.WithinDuration(time.Now(), updated.UpdatedAt, 5*time.Second) | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	err = dbService.GetConn(). | 
					
						
							|  |  |  | 		NewSelect(). | 
					
						
							|  |  |  | 		Model(noCache). | 
					
						
							| 
									
										
										
										
											2022-10-08 13:50:48 +02:00
										 |  |  | 		Where("? = ?", bun.Ident("account.id"), testAccount.ID). | 
					
						
							| 
									
										
										
										
											2022-09-26 11:56:01 +02:00
										 |  |  | 		Relation("AvatarMediaAttachment"). | 
					
						
							|  |  |  | 		Relation("HeaderMediaAttachment"). | 
					
						
							|  |  |  | 		Relation("Emojis"). | 
					
						
							|  |  |  | 		Scan(ctx) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("new display name!", noCache.DisplayName) | 
					
						
							|  |  |  | 	suite.Empty(noCache.EmojiIDs) | 
					
						
							|  |  |  | 	suite.WithinDuration(time.Now(), noCache.UpdatedAt, 5*time.Second) | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-26 14:43:19 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountLastPosted() { | 
					
						
							| 
									
										
										
										
											2022-10-08 14:00:39 +02:00
										 |  |  | 	lastPosted, err := suite.db.GetAccountLastPosted(context.Background(), suite.testAccounts["local_account_1"].ID, false) | 
					
						
							| 
									
										
										
										
											2022-09-26 14:43:19 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.EqualValues(1653046675, lastPosted.Unix()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 14:00:39 +02:00
										 |  |  | func (suite *AccountTestSuite) TestGetAccountLastPostedWebOnly() { | 
					
						
							|  |  |  | 	lastPosted, err := suite.db.GetAccountLastPosted(context.Background(), suite.testAccounts["local_account_1"].ID, true) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.EqualValues(1634726437, lastPosted.Unix()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 15:21:59 +02:00
										 |  |  | func (suite *AccountTestSuite) TestInsertAccountWithDefaults() { | 
					
						
							|  |  |  | 	key, err := rsa.GenerateKey(rand.Reader, 2048) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	newAccount := >smodel.Account{ | 
					
						
							|  |  |  | 		ID:           "01FGP5P4VJ9SPFB0T3E36Q60DW", | 
					
						
							|  |  |  | 		Username:     "test_service", | 
					
						
							|  |  |  | 		Domain:       "example.org", | 
					
						
							|  |  |  | 		URI:          "https://example.org/users/test_service", | 
					
						
							|  |  |  | 		URL:          "https://example.org/@test_service", | 
					
						
							|  |  |  | 		ActorType:    ap.ActorService, | 
					
						
							|  |  |  | 		PublicKey:    &key.PublicKey, | 
					
						
							|  |  |  | 		PublicKeyURI: "https://example.org/users/test_service#main-key", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = suite.db.Put(context.Background(), newAccount) | 
					
						
							|  |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.Equal("en", newAccount.Language) | 
					
						
							|  |  |  | 	suite.WithinDuration(time.Now(), newAccount.CreatedAt, 30*time.Second) | 
					
						
							|  |  |  | 	suite.WithinDuration(time.Now(), newAccount.UpdatedAt, 30*time.Second) | 
					
						
							| 
									
										
										
										
											2022-08-15 12:35:05 +02:00
										 |  |  | 	suite.False(*newAccount.Memorial) | 
					
						
							|  |  |  | 	suite.False(*newAccount.Bot) | 
					
						
							|  |  |  | 	suite.False(*newAccount.Discoverable) | 
					
						
							|  |  |  | 	suite.False(*newAccount.Sensitive) | 
					
						
							|  |  |  | 	suite.False(*newAccount.HideCollections) | 
					
						
							| 
									
										
										
										
											2021-09-28 15:21:59 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | func TestAccountTestSuite(t *testing.T) { | 
					
						
							|  |  |  | 	suite.Run(t, new(AccountTestSuite)) | 
					
						
							|  |  |  | } |