| 
									
										
										
										
											2023-03-12 16:00:57 +01:00
										 |  |  | // 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/>. | 
					
						
							| 
									
										
										
										
											2022-11-29 10:24:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | package search_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"net/http/httptest" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/api/client/search" | 
					
						
							|  |  |  | 	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type SearchGetTestSuite struct { | 
					
						
							|  |  |  | 	SearchStandardTestSuite | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) testSearch(query string, resolve bool, expectedHTTPStatus int) (*apimodel.SearchResult, error) { | 
					
						
							|  |  |  | 	requestPath := fmt.Sprintf("%s?q=%s&resolve=%t", search.BasePathV1, query, resolve) | 
					
						
							|  |  |  | 	recorder := httptest.NewRecorder() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ctx := suite.newContext(recorder, requestPath) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.searchModule.SearchGETHandler(ctx) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	result := recorder.Result() | 
					
						
							|  |  |  | 	defer result.Body.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if resultCode := recorder.Code; expectedHTTPStatus != resultCode { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("expected %d got %d", expectedHTTPStatus, resultCode) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	b, err := ioutil.ReadAll(result.Body) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult := &apimodel.SearchResult{} | 
					
						
							|  |  |  | 	if err := json.Unmarshal(b, searchResult); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return searchResult, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchRemoteAccountByURI() { | 
					
						
							|  |  |  | 	query := "https://unknown-instance.com/users/brand_new_person" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchRemoteAccountByNamestring() { | 
					
						
							|  |  |  | 	query := "@brand_new_person@unknown-instance.com" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-30 17:44:02 +01:00
										 |  |  | func (suite *SearchGetTestSuite) TestSearchRemoteAccountByNamestringUppercase() { | 
					
						
							|  |  |  | 	query := "@Some_User@example.org" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-29 10:24:55 +01:00
										 |  |  | func (suite *SearchGetTestSuite) TestSearchRemoteAccountByNamestringNoLeadingAt() { | 
					
						
							|  |  |  | 	query := "brand_new_person@unknown-instance.com" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchRemoteAccountByNamestringNoResolve() { | 
					
						
							|  |  |  | 	query := "@brand_new_person@unknown-instance.com" | 
					
						
							|  |  |  | 	resolve := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.Len(searchResult.Accounts, 0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchLocalAccountByNamestring() { | 
					
						
							|  |  |  | 	query := "@the_mighty_zork" | 
					
						
							|  |  |  | 	resolve := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchLocalAccountByNamestringWithDomain() { | 
					
						
							|  |  |  | 	query := "@the_mighty_zork@localhost:8080" | 
					
						
							|  |  |  | 	resolve := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchNonexistingLocalAccountByNamestringResolveTrue() { | 
					
						
							|  |  |  | 	query := "@somone_made_up@localhost:8080" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.Len(searchResult.Accounts, 0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchLocalAccountByURI() { | 
					
						
							|  |  |  | 	query := "http://localhost:8080/users/the_mighty_zork" | 
					
						
							|  |  |  | 	resolve := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchLocalAccountByURL() { | 
					
						
							|  |  |  | 	query := "http://localhost:8080/@the_mighty_zork" | 
					
						
							|  |  |  | 	resolve := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Accounts, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 account in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotAccount := searchResult.Accounts[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotAccount) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchNonexistingLocalAccountByURL() { | 
					
						
							|  |  |  | 	query := "http://localhost:8080/@the_shmighty_shmork" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.Len(searchResult.Accounts, 0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchStatusByURL() { | 
					
						
							|  |  |  | 	query := "https://turnip.farm/users/turniplover6969/statuses/70c53e54-3146-42d5-a630-83c8b6c7c042" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !suite.Len(searchResult.Statuses, 1) { | 
					
						
							|  |  |  | 		suite.FailNow("expected 1 status in search results but got 0") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gotStatus := searchResult.Statuses[0] | 
					
						
							|  |  |  | 	suite.NotNil(gotStatus) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-14 11:55:02 +01:00
										 |  |  | func (suite *SearchGetTestSuite) TestSearchBlockedDomainURL() { | 
					
						
							|  |  |  | 	query := "https://replyguys.com/@someone" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.Len(searchResult.Accounts, 0) | 
					
						
							|  |  |  | 	suite.Len(searchResult.Statuses, 0) | 
					
						
							|  |  |  | 	suite.Len(searchResult.Hashtags, 0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *SearchGetTestSuite) TestSearchBlockedDomainNamestring() { | 
					
						
							|  |  |  | 	query := "@someone@replyguys.com" | 
					
						
							|  |  |  | 	resolve := true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	searchResult, err := suite.testSearch(query, resolve, http.StatusOK) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	suite.Len(searchResult.Accounts, 0) | 
					
						
							|  |  |  | 	suite.Len(searchResult.Statuses, 0) | 
					
						
							|  |  |  | 	suite.Len(searchResult.Hashtags, 0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-29 10:24:55 +01:00
										 |  |  | func TestSearchGetTestSuite(t *testing.T) { | 
					
						
							|  |  |  | 	suite.Run(t, &SearchGetTestSuite{}) | 
					
						
							|  |  |  | } |