| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package timeline_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/testrig" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ManagerTestSuite struct { | 
					
						
							|  |  |  | 	TimelineStandardTestSuite | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *ManagerTestSuite) SetupSuite() { | 
					
						
							|  |  |  | 	suite.testAccounts = testrig.NewTestAccounts() | 
					
						
							|  |  |  | 	suite.testStatuses = testrig.NewTestStatuses() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *ManagerTestSuite) SetupTest() { | 
					
						
							|  |  |  | 	suite.config = testrig.NewTestConfig() | 
					
						
							|  |  |  | 	suite.db = testrig.NewTestDB() | 
					
						
							|  |  |  | 	suite.log = testrig.NewTestLog() | 
					
						
							|  |  |  | 	suite.tc = testrig.NewTestTypeConverter(suite.db) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testrig.StandardDBSetup(suite.db, nil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	manager := testrig.NewTestTimelineManager(suite.db) | 
					
						
							|  |  |  | 	suite.manager = manager | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *ManagerTestSuite) TearDownTest() { | 
					
						
							|  |  |  | 	testrig.StandardDBTeardown(suite.db) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *ManagerTestSuite) TestManagerIntegration() { | 
					
						
							|  |  |  | 	testAccount := suite.testAccounts["local_account_1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// should start at 0 | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	indexedLen := suite.manager.GetIndexedLength(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.Equal(0, indexedLen) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// oldestIndexed should be empty string since there's nothing indexed | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	oldestIndexed, err := suite.manager.GetOldestIndexedID(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Empty(oldestIndexed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// trigger status preparation | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	err = suite.manager.PrepareXFromTop(context.Background(), testAccount.ID, 20) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	// local_account_1 can see 13 statuses out of the testrig statuses in its home timeline | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	indexedLen = suite.manager.GetIndexedLength(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	suite.Equal(13, indexedLen) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// oldest should now be set | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	oldestIndexed, err = suite.manager.GetOldestIndexedID(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("01F8MH75CBF9JFX4ZAD54N0W0R", oldestIndexed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get hometimeline | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	statuses, err := suite.manager.HomeTimeline(context.Background(), testAccount.ID, "", "", "", 20, false) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	suite.Len(statuses, 13) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// now wipe the last status from all timelines, as though it had been deleted by the owner | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	err = suite.manager.WipeStatusFromAllTimelines(context.Background(), "01F8MH75CBF9JFX4ZAD54N0W0R") | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// timeline should be shorter | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	indexedLen = suite.manager.GetIndexedLength(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	suite.Equal(12, indexedLen) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// oldest should now be different | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	oldestIndexed, err = suite.manager.GetOldestIndexedID(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("01F8MH82FYRXD2RC6108DAJ5HB", oldestIndexed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// delete the new oldest status specifically from this timeline, as though local_account_1 had muted or blocked it | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	removed, err := suite.manager.Remove(context.Background(), testAccount.ID, "01F8MH82FYRXD2RC6108DAJ5HB") | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal(2, removed) // 1 status should be removed, but from both indexed and prepared, so 2 removals total | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// timeline should be shorter | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	indexedLen = suite.manager.GetIndexedLength(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	suite.Equal(11, indexedLen) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// oldest should now be different | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	oldestIndexed, err = suite.manager.GetOldestIndexedID(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.Equal("01F8MHAAY43M6RJ473VQFCVH37", oldestIndexed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// now remove all entries by local_account_2 from the timeline | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	err = suite.manager.WipeStatusesFromAccountID(context.Background(), testAccount.ID, suite.testAccounts["local_account_2"].ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	// timeline should be shorter | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	indexedLen = suite.manager.GetIndexedLength(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	suite.Equal(6, indexedLen) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// ingest 1 into the timeline | 
					
						
							|  |  |  | 	status1 := suite.testStatuses["admin_account_status_1"] | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	ingested, err := suite.manager.Ingest(context.Background(), status1, testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.True(ingested) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// ingest and prepare another one into the timeline | 
					
						
							|  |  |  | 	status2 := suite.testStatuses["local_account_2_status_1"] | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	ingested, err = suite.manager.IngestAndPrepare(context.Background(), status2, testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.True(ingested) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// timeline should be longer now | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	indexedLen = suite.manager.GetIndexedLength(context.Background(), testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-09-09 16:15:25 +02:00
										 |  |  | 	suite.Equal(8, indexedLen) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// try to ingest status 2 again | 
					
						
							| 
									
										
										
										
											2021-08-25 15:34:33 +02:00
										 |  |  | 	ingested, err = suite.manager.IngestAndPrepare(context.Background(), status2, testAccount.ID) | 
					
						
							| 
									
										
										
										
											2021-08-15 18:43:08 +02:00
										 |  |  | 	suite.NoError(err) | 
					
						
							|  |  |  | 	suite.False(ingested) // should be false since it's a duplicate | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestManagerTestSuite(t *testing.T) { | 
					
						
							|  |  |  | 	suite.Run(t, new(ManagerTestSuite)) | 
					
						
							|  |  |  | } |