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-06-23 16:54:54 +02:00
package instance_test
import (
2023-01-13 17:02:45 +01:00
"bytes"
"encoding/json"
2022-06-23 16:54:54 +02:00
"fmt"
"io"
"net/http"
"net/http/httptest"
"testing"
2025-04-26 15:34:10 +02:00
"code.superseriousbusiness.org/gotosocial/internal/api/client/instance"
"code.superseriousbusiness.org/gotosocial/internal/config"
"code.superseriousbusiness.org/gotosocial/internal/gtsmodel"
"code.superseriousbusiness.org/gotosocial/internal/util"
"code.superseriousbusiness.org/gotosocial/testrig"
2022-07-12 08:32:20 +01:00
"github.com/gin-gonic/gin/render"
2022-06-23 16:54:54 +02:00
"github.com/stretchr/testify/suite"
)
type InstancePeersGetTestSuite struct {
InstanceStandardTestSuite
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetNoParams ( ) {
recorder := httptest . NewRecorder ( )
2022-07-12 08:32:20 +01:00
ctx , r := testrig . CreateGinTestContext ( recorder , nil )
r . HTMLRender = render . HTMLDebug { }
2022-06-23 16:54:54 +02:00
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s" , baseURI , instance . InstancePeersPath )
ctx . Request = httptest . NewRequest ( http . MethodGet , requestURI , nil )
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
"example.org" ,
"fossbros-anonymous.io"
] ` , dst . String ( ) )
2022-06-23 16:54:54 +02:00
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetNoParamsUnauthorized ( ) {
config . SetInstanceExposePeers ( false )
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusUnauthorized , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
suite . Equal ( ` { "error":"Unauthorized: peers open query requires an authenticated account/user"} ` , string ( b ) )
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetNoParamsAuthorized ( ) {
config . SetInstanceExposePeers ( false )
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , true )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
"example.org" ,
"fossbros-anonymous.io"
] ` , dst . String ( ) )
2022-06-23 16:54:54 +02:00
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetOnlySuspended ( ) {
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=suspended" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
{
"domain" : "replyguys.com" ,
"suspended_at" : "2020-05-13T13:29:12.000Z" ,
2025-05-20 11:47:40 +02:00
"comment" : "reply-guying to tech posts" ,
"severity" : "suspend"
2023-01-13 17:02:45 +01:00
}
] ` , dst . String ( ) )
2022-06-23 16:54:54 +02:00
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetOnlySuspendedUnauthorized ( ) {
2025-05-20 11:47:40 +02:00
config . SetInstanceExposeBlocklist ( false )
2022-06-23 16:54:54 +02:00
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=suspended" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusUnauthorized , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2025-05-20 11:47:40 +02:00
suite . Equal ( ` { "error":"Unauthorized: peers blocked query requires an authenticated account/user"} ` , string ( b ) )
2022-06-23 16:54:54 +02:00
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetOnlySuspendedAuthorized ( ) {
2025-05-20 11:47:40 +02:00
config . SetInstanceExposeBlocklist ( false )
2022-06-23 16:54:54 +02:00
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=suspended" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , true )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
{
"domain" : "replyguys.com" ,
"suspended_at" : "2020-05-13T13:29:12.000Z" ,
2025-05-20 11:47:40 +02:00
"comment" : "reply-guying to tech posts" ,
"severity" : "suspend"
2023-01-13 17:02:45 +01:00
}
] ` , dst . String ( ) )
2022-06-23 16:54:54 +02:00
}
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetAll ( ) {
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=suspended,open" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
{
"domain" : "example.org"
} ,
{
"domain" : "fossbros-anonymous.io"
} ,
{
"domain" : "replyguys.com" ,
"suspended_at" : "2020-05-13T13:29:12.000Z" ,
2025-05-20 11:47:40 +02:00
"comment" : "reply-guying to tech posts" ,
"severity" : "suspend"
2023-01-13 17:02:45 +01:00
}
] ` , dst . String ( ) )
2022-06-23 16:54:54 +02:00
}
2025-05-20 11:47:40 +02:00
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetAllowed ( ) {
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=allowed" , baseURI , instance . InstancePeersPath )
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [] ` , dst . String ( ) )
}
2022-06-23 16:54:54 +02:00
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetAllWithObfuscated ( ) {
2025-05-22 12:26:11 +02:00
err := suite . db . Put ( suite . T ( ) . Context ( ) , & gtsmodel . DomainBlock {
2022-06-23 16:54:54 +02:00
ID : "01G633XTNK51GBADQZFZQDP6WR" ,
CreatedAt : testrig . TimeMustParse ( "2021-06-09T12:34:55+02:00" ) ,
UpdatedAt : testrig . TimeMustParse ( "2021-06-09T12:34:55+02:00" ) ,
Domain : "omg.just.the.worst.org.ever" ,
CreatedByAccountID : "01F8MH17FWEB39HZJ76B6VXSKF" ,
PublicComment : "just absolutely the worst, wowza" ,
2023-08-07 19:38:11 +02:00
Obfuscate : util . Ptr ( true ) ,
2022-06-23 16:54:54 +02:00
} )
suite . NoError ( err )
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=suspended,open" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
{
"domain" : "example.org"
} ,
{
"domain" : "fossbros-anonymous.io"
} ,
{
"domain" : "o*g.*u**.t**.*or*t.*r**ev**" ,
"suspended_at" : "2021-06-09T10:34:55.000Z" ,
2025-05-20 11:47:40 +02:00
"comment" : "just absolutely the worst, wowza" ,
"severity" : "suspend"
2023-01-13 17:02:45 +01:00
} ,
{
"domain" : "replyguys.com" ,
"suspended_at" : "2020-05-13T13:29:12.000Z" ,
2025-05-20 11:47:40 +02:00
"comment" : "reply-guying to tech posts" ,
"severity" : "suspend"
2023-01-13 17:02:45 +01:00
}
] ` , dst . String ( ) )
2022-06-23 16:54:54 +02:00
}
2025-05-20 11:47:40 +02:00
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetAllWithObfuscatedFlat ( ) {
2025-05-22 12:26:11 +02:00
err := suite . db . Put ( suite . T ( ) . Context ( ) , & gtsmodel . DomainBlock {
2025-05-20 11:47:40 +02:00
ID : "01G633XTNK51GBADQZFZQDP6WR" ,
CreatedAt : testrig . TimeMustParse ( "2021-06-09T12:34:55+02:00" ) ,
UpdatedAt : testrig . TimeMustParse ( "2021-06-09T12:34:55+02:00" ) ,
Domain : "omg.just.the.worst.org.ever" ,
CreatedByAccountID : "01F8MH17FWEB39HZJ76B6VXSKF" ,
PublicComment : "just absolutely the worst, wowza" ,
Obfuscate : util . Ptr ( true ) ,
} )
suite . NoError ( err )
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=suspended,open&flat=true" , baseURI , instance . InstancePeersPath )
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , false )
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
dst := new ( bytes . Buffer )
err = json . Indent ( dst , b , "" , " " )
suite . NoError ( err )
suite . Equal ( ` [
"example.org" ,
"fossbros-anonymous.io" ,
"o*g.*u**.t**.*or*t.*r**ev**" ,
"replyguys.com"
] ` , dst . String ( ) )
}
2022-06-23 16:54:54 +02:00
func ( suite * InstancePeersGetTestSuite ) TestInstancePeersGetFunkyParams ( ) {
recorder := httptest . NewRecorder ( )
baseURI := fmt . Sprintf ( "%s://%s" , config . GetProtocol ( ) , config . GetHost ( ) )
requestURI := fmt . Sprintf ( "%s/%s?filter=aaaaaaaaaaaaaaaaa,open" , baseURI , instance . InstancePeersPath )
2022-07-12 08:32:20 +01:00
ctx := suite . newContext ( recorder , http . MethodGet , requestURI , nil , "" , true )
2022-06-23 16:54:54 +02:00
suite . instanceModule . InstancePeersGETHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
2025-05-20 11:47:40 +02:00
suite . Equal ( ` { "error":"Bad Request: filter aaaaaaaaaaaaaaaaa not recognized; accepted values are 'open', 'blocked', 'allowed', and 'suspended' (deprecated)"} ` , string ( b ) )
2022-06-23 16:54:54 +02:00
}
func TestInstancePeersGetTestSuite ( t * testing . T ) {
suite . Run ( t , & InstancePeersGetTestSuite { } )
}