| 
									
										
										
										
											2021-08-29 12:03:08 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    GoToSocial | 
					
						
							| 
									
										
										
										
											2021-12-20 18:42:19 +01:00
										 |  |  |    Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org | 
					
						
							| 
									
										
										
										
											2021-08-29 12:03:08 +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/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package dereferencing_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-13 12:29:08 +01:00
										 |  |  | 	"codeberg.org/gruf/go-store/kv" | 
					
						
							| 
									
										
										
										
											2021-08-29 12:03:08 +02:00
										 |  |  | 	"github.com/sirupsen/logrus" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							| 
									
										
										
										
											2021-11-13 17:29:43 +01:00
										 |  |  | 	"github.com/superseriousbusiness/activity/streams" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/activity/streams/vocab" | 
					
						
							| 
									
										
										
										
											2021-08-29 12:03:08 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/db" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/federation/dereferencing" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/transport" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/testrig" | 
					
						
							| 
									
										
										
										
											2021-08-29 12:03:08 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type DereferencerStandardTestSuite struct { | 
					
						
							|  |  |  | 	suite.Suite | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	db      db.DB | 
					
						
							| 
									
										
										
										
											2021-09-11 20:12:47 +01:00
										 |  |  | 	storage *kv.KVStore | 
					
						
							| 
									
										
										
										
											2021-08-29 12:03:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	testRemoteStatuses    map[string]vocab.ActivityStreamsNote | 
					
						
							| 
									
										
										
										
											2021-09-30 12:27:42 +02:00
										 |  |  | 	testRemotePeople      map[string]vocab.ActivityStreamsPerson | 
					
						
							|  |  |  | 	testRemoteGroups      map[string]vocab.ActivityStreamsGroup | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	testRemoteAttachments map[string]testrig.RemoteAttachmentFile | 
					
						
							|  |  |  | 	testAccounts          map[string]*gtsmodel.Account | 
					
						
							| 
									
										
										
										
											2021-08-29 12:03:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	dereferencer dereferencing.Dereferencer | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-21 19:46:51 +01:00
										 |  |  | func (suite *DereferencerStandardTestSuite) SetupTest() { | 
					
						
							|  |  |  | 	testrig.InitTestConfig() | 
					
						
							|  |  |  | 	testrig.InitTestLog() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	suite.testAccounts = testrig.NewTestAccounts() | 
					
						
							|  |  |  | 	suite.testRemoteStatuses = testrig.NewTestFediStatuses() | 
					
						
							| 
									
										
										
										
											2021-09-30 12:27:42 +02:00
										 |  |  | 	suite.testRemotePeople = testrig.NewTestFediPeople() | 
					
						
							|  |  |  | 	suite.testRemoteGroups = testrig.NewTestFediGroups() | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	suite.testRemoteAttachments = testrig.NewTestFediAttachments("../../../testrig/media") | 
					
						
							| 
									
										
										
										
											2021-12-07 13:31:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	suite.db = testrig.NewTestDB() | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	suite.storage = testrig.NewTestStorage() | 
					
						
							| 
									
										
										
										
											2021-12-28 16:36:00 +01:00
										 |  |  | 	suite.dereferencer = dereferencing.NewDereferencer(suite.db, testrig.NewTestTypeConverter(suite.db), suite.mockTransportController(), testrig.NewTestMediaManager(suite.db, suite.storage)) | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 	testrig.StandardDBSetup(suite.db, nil) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *DereferencerStandardTestSuite) TearDownTest() { | 
					
						
							|  |  |  | 	testrig.StandardDBTeardown(suite.db) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // mockTransportController returns basically a miniature muxer, which returns a different | 
					
						
							|  |  |  | // value based on the request URL. It can be used to return remote statuses, profiles, etc, | 
					
						
							|  |  |  | // as though they were actually being dereferenced. If the URL doesn't correspond to any person | 
					
						
							|  |  |  | // or note or attachment that we have stored, then just a 200 code will be returned, with an empty body. | 
					
						
							|  |  |  | func (suite *DereferencerStandardTestSuite) mockTransportController() transport.Controller { | 
					
						
							|  |  |  | 	do := func(req *http.Request) (*http.Response, error) { | 
					
						
							| 
									
										
										
										
											2021-10-11 05:37:33 -07:00
										 |  |  | 		logrus.Debugf("received request for %s", req.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		responseBytes := []byte{} | 
					
						
							|  |  |  | 		responseType := "" | 
					
						
							|  |  |  | 		responseLength := 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-30 12:27:42 +02:00
										 |  |  | 		if note, ok := suite.testRemoteStatuses[req.URL.String()]; ok { | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 			// the request is for a note that we have stored | 
					
						
							|  |  |  | 			noteI, err := streams.Serialize(note) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				panic(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			noteJson, err := json.Marshal(noteI) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				panic(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			responseBytes = noteJson | 
					
						
							|  |  |  | 			responseType = "application/activity+json" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-30 12:27:42 +02:00
										 |  |  | 		if person, ok := suite.testRemotePeople[req.URL.String()]; ok { | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 			// the request is for a person that we have stored | 
					
						
							|  |  |  | 			personI, err := streams.Serialize(person) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				panic(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			personJson, err := json.Marshal(personI) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				panic(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			responseBytes = personJson | 
					
						
							|  |  |  | 			responseType = "application/activity+json" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-30 12:27:42 +02:00
										 |  |  | 		if group, ok := suite.testRemoteGroups[req.URL.String()]; ok { | 
					
						
							|  |  |  | 			// the request is for a person that we have stored | 
					
						
							|  |  |  | 			groupI, err := streams.Serialize(group) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				panic(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			groupJson, err := json.Marshal(groupI) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				panic(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			responseBytes = groupJson | 
					
						
							|  |  |  | 			responseType = "application/activity+json" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if attachment, ok := suite.testRemoteAttachments[req.URL.String()]; ok { | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 			responseBytes = attachment.Data | 
					
						
							|  |  |  | 			responseType = attachment.ContentType | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if len(responseBytes) != 0 { | 
					
						
							|  |  |  | 			// we found something, so print what we're going to return | 
					
						
							| 
									
										
										
										
											2021-10-11 05:37:33 -07:00
										 |  |  | 			logrus.Debugf("returning response %s", string(responseBytes)) | 
					
						
							| 
									
										
										
										
											2021-09-04 14:02:01 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		responseLength = len(responseBytes) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		reader := bytes.NewReader(responseBytes) | 
					
						
							|  |  |  | 		readCloser := io.NopCloser(reader) | 
					
						
							|  |  |  | 		response := &http.Response{ | 
					
						
							|  |  |  | 			StatusCode:    200, | 
					
						
							|  |  |  | 			Body:          readCloser, | 
					
						
							|  |  |  | 			ContentLength: int64(responseLength), | 
					
						
							|  |  |  | 			Header: http.Header{ | 
					
						
							|  |  |  | 				"content-type": {responseType}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return response, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	mockClient := testrig.NewMockHTTPClient(do) | 
					
						
							|  |  |  | 	return testrig.NewTestTransportController(mockClient, suite.db) | 
					
						
							|  |  |  | } |