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-05-26 11:37:13 +02:00
package instance_test
import (
2023-01-13 17:02:45 +01:00
"bytes"
2022-11-08 18:11:06 +01:00
"context"
2023-01-13 17:02:45 +01:00
"encoding/json"
2022-05-26 11:37:13 +02:00
"io"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/suite"
"github.com/superseriousbusiness/gotosocial/internal/api/client/instance"
2022-06-08 20:38:03 +02:00
"github.com/superseriousbusiness/gotosocial/internal/oauth"
2022-05-26 11:37:13 +02:00
"github.com/superseriousbusiness/gotosocial/testrig"
)
type InstancePatchTestSuite struct {
InstanceStandardTestSuite
}
2023-02-04 15:53:11 +01:00
func ( suite * InstancePatchTestSuite ) instancePatch ( fieldName string , fileName string , extraFields map [ string ] string ) ( code int , body [ ] byte ) {
requestBody , w , err := testrig . CreateMultipartFormData ( fieldName , fileName , extraFields )
2022-05-26 11:37:13 +02:00
if err != nil {
2023-02-04 15:53:11 +01:00
suite . FailNow ( err . Error ( ) )
2022-05-26 11:37:13 +02:00
}
recorder := httptest . NewRecorder ( )
2023-02-04 15:53:11 +01:00
ctx := suite . newContext ( recorder , http . MethodPatch , instance . InstanceInformationPathV1 , requestBody . Bytes ( ) , w . FormDataContentType ( ) , true )
2022-05-26 11:37:13 +02:00
suite . instanceModule . InstanceUpdatePATCHHandler ( ctx )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
2023-02-04 15:53:11 +01:00
if err != nil {
suite . FailNow ( err . Error ( ) )
}
return recorder . Code , b
}
func ( suite * InstancePatchTestSuite ) TestInstancePatch1 ( ) {
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"title" : "Example Instance" ,
"contact_username" : "admin" ,
"contact_email" : "someone@example.org" ,
} )
if expectedCode := http . StatusOK ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
2023-02-04 15:53:11 +01:00
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2023-01-13 17:02:45 +01:00
suite . Equal ( ` {
"uri" : "http://localhost:8080" ,
"account_domain" : "localhost:8080" ,
"title" : "Example Instance" ,
"description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"short_description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"email" : "someone@example.org" ,
"version" : "0.0.0-testrig" ,
2023-05-06 22:38:19 +02:00
"languages" : [ ] ,
2023-01-13 17:02:45 +01:00
"registrations" : true ,
"approval_required" : true ,
"invites_enabled" : false ,
"configuration" : {
"statuses" : {
"max_characters" : 5000 ,
"max_media_attachments" : 6 ,
2023-03-02 12:06:40 +01:00
"characters_reserved_per_url" : 25 ,
"supported_mime_types" : [
"text/plain" ,
"text/markdown"
]
2023-01-13 17:02:45 +01:00
} ,
"media_attachments" : {
"supported_mime_types" : [
"image/jpeg" ,
"image/gif" ,
"image/png" ,
"image/webp" ,
"video/mp4"
] ,
"image_size_limit" : 10485760 ,
"image_matrix_limit" : 16777216 ,
"video_size_limit" : 41943040 ,
"video_frame_rate_limit" : 60 ,
"video_matrix_limit" : 16777216
} ,
"polls" : {
"max_options" : 6 ,
"max_characters_per_option" : 50 ,
"min_expiration" : 300 ,
"max_expiration" : 2629746
} ,
"accounts" : {
2023-02-02 14:08:13 +01:00
"allow_custom_css" : true ,
"max_featured_tags" : 10
2023-01-13 17:02:45 +01:00
} ,
"emojis" : {
"emoji_size_limit" : 51200
}
} ,
"urls" : {
"streaming_api" : "wss://localhost:8080"
} ,
"stats" : {
"domain_count" : 2 ,
"status_count" : 16 ,
"user_count" : 4
} ,
"thumbnail" : "http://localhost:8080/assets/logo.png" ,
"contact_account" : {
"id" : "01F8MH17FWEB39HZJ76B6VXSKF" ,
"username" : "admin" ,
"acct" : "admin" ,
"display_name" : "" ,
"locked" : false ,
2023-02-16 14:20:23 +01:00
"discoverable" : true ,
2023-01-13 17:02:45 +01:00
"bot" : false ,
"created_at" : "2022-05-17T13:10:59.000Z" ,
"note" : "" ,
"url" : "http://localhost:8080/@admin" ,
"avatar" : "" ,
"avatar_static" : "" ,
"header" : "http://localhost:8080/assets/default_header.png" ,
"header_static" : "http://localhost:8080/assets/default_header.png" ,
"followers_count" : 1 ,
"following_count" : 1 ,
"statuses_count" : 4 ,
"last_status_at" : "2021-10-20T10:41:37.000Z" ,
"emojis" : [ ] ,
"fields" : [ ] ,
"enable_rss" : true ,
2023-02-20 17:00:44 +01:00
"role" : {
"name" : "admin"
}
2023-01-13 17:02:45 +01:00
} ,
"max_toot_chars" : 5000
} ` , dst . String ( ) )
2022-05-26 11:37:13 +02:00
}
func ( suite * InstancePatchTestSuite ) TestInstancePatch2 ( ) {
2023-02-04 15:53:11 +01:00
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"title" : "<p>Geoff's Instance</p>" ,
} )
2022-05-26 11:37:13 +02:00
2023-02-04 15:53:11 +01:00
if expectedCode := http . StatusOK ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2022-05-26 11:37:13 +02:00
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
2023-02-04 15:53:11 +01:00
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2023-01-13 17:02:45 +01:00
suite . Equal ( ` {
"uri" : "http://localhost:8080" ,
"account_domain" : "localhost:8080" ,
"title" : "Geoff's Instance" ,
"description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"short_description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"email" : "admin@example.org" ,
"version" : "0.0.0-testrig" ,
2023-05-06 22:38:19 +02:00
"languages" : [ ] ,
2023-01-13 17:02:45 +01:00
"registrations" : true ,
"approval_required" : true ,
"invites_enabled" : false ,
"configuration" : {
"statuses" : {
"max_characters" : 5000 ,
"max_media_attachments" : 6 ,
2023-03-02 12:06:40 +01:00
"characters_reserved_per_url" : 25 ,
"supported_mime_types" : [
"text/plain" ,
"text/markdown"
]
2023-01-13 17:02:45 +01:00
} ,
"media_attachments" : {
"supported_mime_types" : [
"image/jpeg" ,
"image/gif" ,
"image/png" ,
"image/webp" ,
"video/mp4"
] ,
"image_size_limit" : 10485760 ,
"image_matrix_limit" : 16777216 ,
"video_size_limit" : 41943040 ,
"video_frame_rate_limit" : 60 ,
"video_matrix_limit" : 16777216
} ,
"polls" : {
"max_options" : 6 ,
"max_characters_per_option" : 50 ,
"min_expiration" : 300 ,
"max_expiration" : 2629746
} ,
"accounts" : {
2023-02-02 14:08:13 +01:00
"allow_custom_css" : true ,
"max_featured_tags" : 10
2023-01-13 17:02:45 +01:00
} ,
"emojis" : {
"emoji_size_limit" : 51200
}
} ,
"urls" : {
"streaming_api" : "wss://localhost:8080"
} ,
"stats" : {
"domain_count" : 2 ,
"status_count" : 16 ,
"user_count" : 4
} ,
"thumbnail" : "http://localhost:8080/assets/logo.png" ,
"contact_account" : {
"id" : "01F8MH17FWEB39HZJ76B6VXSKF" ,
"username" : "admin" ,
"acct" : "admin" ,
"display_name" : "" ,
"locked" : false ,
2023-02-16 14:20:23 +01:00
"discoverable" : true ,
2023-01-13 17:02:45 +01:00
"bot" : false ,
"created_at" : "2022-05-17T13:10:59.000Z" ,
"note" : "" ,
"url" : "http://localhost:8080/@admin" ,
"avatar" : "" ,
"avatar_static" : "" ,
"header" : "http://localhost:8080/assets/default_header.png" ,
"header_static" : "http://localhost:8080/assets/default_header.png" ,
"followers_count" : 1 ,
"following_count" : 1 ,
"statuses_count" : 4 ,
"last_status_at" : "2021-10-20T10:41:37.000Z" ,
"emojis" : [ ] ,
"fields" : [ ] ,
"enable_rss" : true ,
2023-02-20 17:00:44 +01:00
"role" : {
"name" : "admin"
}
2023-01-13 17:02:45 +01:00
} ,
"max_toot_chars" : 5000
} ` , dst . String ( ) )
2022-05-26 11:37:13 +02:00
}
func ( suite * InstancePatchTestSuite ) TestInstancePatch3 ( ) {
2023-02-04 15:53:11 +01:00
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"short_description" : "<p>This is some html, which is <em>allowed</em> in short descriptions.</p>" ,
} )
2022-05-26 11:37:13 +02:00
2023-02-04 15:53:11 +01:00
if expectedCode := http . StatusOK ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2022-05-26 11:37:13 +02:00
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
2023-02-04 15:53:11 +01:00
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2023-01-13 17:02:45 +01:00
suite . Equal ( ` {
"uri" : "http://localhost:8080" ,
"account_domain" : "localhost:8080" ,
"title" : "GoToSocial Testrig Instance" ,
"description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"short_description" : "\u003cp\u003eThis is some html, which is \u003cem\u003eallowed\u003c/em\u003e in short descriptions.\u003c/p\u003e" ,
"email" : "admin@example.org" ,
"version" : "0.0.0-testrig" ,
2023-05-06 22:38:19 +02:00
"languages" : [ ] ,
2023-01-13 17:02:45 +01:00
"registrations" : true ,
"approval_required" : true ,
"invites_enabled" : false ,
"configuration" : {
"statuses" : {
"max_characters" : 5000 ,
"max_media_attachments" : 6 ,
2023-03-02 12:06:40 +01:00
"characters_reserved_per_url" : 25 ,
"supported_mime_types" : [
"text/plain" ,
"text/markdown"
]
2023-01-13 17:02:45 +01:00
} ,
"media_attachments" : {
"supported_mime_types" : [
"image/jpeg" ,
"image/gif" ,
"image/png" ,
"image/webp" ,
"video/mp4"
] ,
"image_size_limit" : 10485760 ,
"image_matrix_limit" : 16777216 ,
"video_size_limit" : 41943040 ,
"video_frame_rate_limit" : 60 ,
"video_matrix_limit" : 16777216
} ,
"polls" : {
"max_options" : 6 ,
"max_characters_per_option" : 50 ,
"min_expiration" : 300 ,
"max_expiration" : 2629746
} ,
"accounts" : {
2023-02-02 14:08:13 +01:00
"allow_custom_css" : true ,
"max_featured_tags" : 10
2023-01-13 17:02:45 +01:00
} ,
"emojis" : {
"emoji_size_limit" : 51200
}
} ,
"urls" : {
"streaming_api" : "wss://localhost:8080"
} ,
"stats" : {
"domain_count" : 2 ,
"status_count" : 16 ,
"user_count" : 4
} ,
"thumbnail" : "http://localhost:8080/assets/logo.png" ,
"contact_account" : {
"id" : "01F8MH17FWEB39HZJ76B6VXSKF" ,
"username" : "admin" ,
"acct" : "admin" ,
"display_name" : "" ,
"locked" : false ,
2023-02-16 14:20:23 +01:00
"discoverable" : true ,
2023-01-13 17:02:45 +01:00
"bot" : false ,
"created_at" : "2022-05-17T13:10:59.000Z" ,
"note" : "" ,
"url" : "http://localhost:8080/@admin" ,
"avatar" : "" ,
"avatar_static" : "" ,
"header" : "http://localhost:8080/assets/default_header.png" ,
"header_static" : "http://localhost:8080/assets/default_header.png" ,
"followers_count" : 1 ,
"following_count" : 1 ,
"statuses_count" : 4 ,
"last_status_at" : "2021-10-20T10:41:37.000Z" ,
"emojis" : [ ] ,
"fields" : [ ] ,
"enable_rss" : true ,
2023-02-20 17:00:44 +01:00
"role" : {
"name" : "admin"
}
2023-01-13 17:02:45 +01:00
} ,
"max_toot_chars" : 5000
} ` , dst . String ( ) )
2022-05-26 11:37:13 +02:00
}
2022-06-08 20:38:03 +02:00
func ( suite * InstancePatchTestSuite ) TestInstancePatch4 ( ) {
2023-02-04 15:53:11 +01:00
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"" : "" ,
} )
2022-06-08 20:38:03 +02:00
2023-02-04 15:53:11 +01:00
if expectedCode := http . StatusBadRequest ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2022-06-08 20:38:03 +02:00
2023-02-04 15:53:11 +01:00
dst := new ( bytes . Buffer )
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2022-06-08 20:38:03 +02:00
suite . Equal ( ` { "error":"Bad Request: empty form submitted"} ` , string ( b ) )
}
func ( suite * InstancePatchTestSuite ) TestInstancePatch5 ( ) {
requestBody , w , err := testrig . CreateMultipartFormData (
"" , "" ,
map [ string ] string {
"short_description" : "<p>This is some html, which is <em>allowed</em> in short descriptions.</p>" ,
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
// set up the request
recorder := httptest . NewRecorder ( )
2023-02-02 14:08:13 +01:00
ctx := suite . newContext ( recorder , http . MethodPatch , instance . InstanceInformationPathV1 , bodyBytes , w . FormDataContentType ( ) , true )
2022-06-08 20:38:03 +02:00
ctx . Set ( oauth . SessionAuthorizedAccount , suite . testAccounts [ "local_account_1" ] )
ctx . Set ( oauth . SessionAuthorizedToken , oauth . DBTokenToToken ( suite . testTokens [ "local_account_1" ] ) )
ctx . Set ( oauth . SessionAuthorizedApplication , suite . testApplications [ "application_1" ] )
ctx . Set ( oauth . SessionAuthorizedUser , suite . testUsers [ "local_account_1" ] )
// call the handler
suite . instanceModule . InstanceUpdatePATCHHandler ( ctx )
suite . Equal ( http . StatusForbidden , recorder . Code )
result := recorder . Result ( )
defer result . Body . Close ( )
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
suite . Equal ( ` { "error":"Forbidden: user is not an admin so cannot update instance settings"} ` , string ( b ) )
}
2022-06-24 10:43:21 +02:00
func ( suite * InstancePatchTestSuite ) TestInstancePatch6 ( ) {
2023-02-04 15:53:11 +01:00
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"contact_email" : "" ,
} )
2022-06-24 10:43:21 +02:00
2023-02-04 15:53:11 +01:00
if expectedCode := http . StatusOK ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2022-06-24 10:43:21 +02:00
2023-01-13 17:02:45 +01:00
dst := new ( bytes . Buffer )
2023-02-04 15:53:11 +01:00
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2023-01-13 17:02:45 +01:00
suite . Equal ( ` {
"uri" : "http://localhost:8080" ,
"account_domain" : "localhost:8080" ,
"title" : "GoToSocial Testrig Instance" ,
"description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"short_description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"email" : "" ,
"version" : "0.0.0-testrig" ,
2023-05-06 22:38:19 +02:00
"languages" : [ ] ,
2023-01-13 17:02:45 +01:00
"registrations" : true ,
"approval_required" : true ,
"invites_enabled" : false ,
"configuration" : {
"statuses" : {
"max_characters" : 5000 ,
"max_media_attachments" : 6 ,
2023-03-02 12:06:40 +01:00
"characters_reserved_per_url" : 25 ,
"supported_mime_types" : [
"text/plain" ,
"text/markdown"
]
2023-01-13 17:02:45 +01:00
} ,
"media_attachments" : {
"supported_mime_types" : [
"image/jpeg" ,
"image/gif" ,
"image/png" ,
"image/webp" ,
"video/mp4"
] ,
"image_size_limit" : 10485760 ,
"image_matrix_limit" : 16777216 ,
"video_size_limit" : 41943040 ,
"video_frame_rate_limit" : 60 ,
"video_matrix_limit" : 16777216
} ,
"polls" : {
"max_options" : 6 ,
"max_characters_per_option" : 50 ,
"min_expiration" : 300 ,
"max_expiration" : 2629746
} ,
"accounts" : {
2023-02-02 14:08:13 +01:00
"allow_custom_css" : true ,
"max_featured_tags" : 10
2023-01-13 17:02:45 +01:00
} ,
"emojis" : {
"emoji_size_limit" : 51200
}
} ,
"urls" : {
"streaming_api" : "wss://localhost:8080"
} ,
"stats" : {
"domain_count" : 2 ,
"status_count" : 16 ,
"user_count" : 4
} ,
"thumbnail" : "http://localhost:8080/assets/logo.png" ,
"contact_account" : {
"id" : "01F8MH17FWEB39HZJ76B6VXSKF" ,
"username" : "admin" ,
"acct" : "admin" ,
"display_name" : "" ,
"locked" : false ,
2023-02-16 14:20:23 +01:00
"discoverable" : true ,
2023-01-13 17:02:45 +01:00
"bot" : false ,
"created_at" : "2022-05-17T13:10:59.000Z" ,
"note" : "" ,
"url" : "http://localhost:8080/@admin" ,
"avatar" : "" ,
"avatar_static" : "" ,
"header" : "http://localhost:8080/assets/default_header.png" ,
"header_static" : "http://localhost:8080/assets/default_header.png" ,
"followers_count" : 1 ,
"following_count" : 1 ,
"statuses_count" : 4 ,
"last_status_at" : "2021-10-20T10:41:37.000Z" ,
"emojis" : [ ] ,
"fields" : [ ] ,
"enable_rss" : true ,
2023-02-20 17:00:44 +01:00
"role" : {
"name" : "admin"
}
2023-01-13 17:02:45 +01:00
} ,
"max_toot_chars" : 5000
} ` , dst . String ( ) )
2022-06-24 10:43:21 +02:00
}
func ( suite * InstancePatchTestSuite ) TestInstancePatch7 ( ) {
2023-02-04 15:53:11 +01:00
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"contact_email" : "not.an.email.address" ,
} )
2022-06-24 10:43:21 +02:00
2023-02-04 15:53:11 +01:00
if expectedCode := http . StatusBadRequest ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2022-06-24 10:43:21 +02:00
2023-02-04 15:53:11 +01:00
dst := new ( bytes . Buffer )
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2022-06-24 10:43:21 +02:00
suite . Equal ( ` { "error":"Bad Request: mail: missing '@' or angle-addr"} ` , string ( b ) )
}
2022-11-08 18:11:06 +01:00
func ( suite * InstancePatchTestSuite ) TestInstancePatch8 ( ) {
2023-02-04 15:53:11 +01:00
code , b := suite . instancePatch ( "thumbnail" , "../../../../testrig/media/peglin.gif" , map [ string ] string {
2023-03-12 16:00:57 +01:00
"thumbnail_description" : "A bouncing little green peglin." ,
} )
2022-11-08 18:11:06 +01:00
2023-02-04 15:53:11 +01:00
if expectedCode := http . StatusOK ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
2022-11-08 18:11:06 +01:00
2023-02-04 15:53:11 +01:00
dst := new ( bytes . Buffer )
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
2022-11-08 18:11:06 +01:00
instanceAccount , err := suite . db . GetInstanceAccount ( context . Background ( ) , "" )
if err != nil {
suite . FailNow ( err . Error ( ) )
}
2023-01-13 17:02:45 +01:00
suite . Equal ( ` {
"uri" : "http://localhost:8080" ,
"account_domain" : "localhost:8080" ,
"title" : "GoToSocial Testrig Instance" ,
"description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"short_description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"email" : "admin@example.org" ,
"version" : "0.0.0-testrig" ,
2023-05-06 22:38:19 +02:00
"languages" : [ ] ,
2023-01-13 17:02:45 +01:00
"registrations" : true ,
"approval_required" : true ,
"invites_enabled" : false ,
"configuration" : {
"statuses" : {
"max_characters" : 5000 ,
"max_media_attachments" : 6 ,
2023-03-02 12:06:40 +01:00
"characters_reserved_per_url" : 25 ,
"supported_mime_types" : [
"text/plain" ,
"text/markdown"
]
2023-01-13 17:02:45 +01:00
} ,
"media_attachments" : {
"supported_mime_types" : [
"image/jpeg" ,
"image/gif" ,
"image/png" ,
"image/webp" ,
"video/mp4"
] ,
"image_size_limit" : 10485760 ,
"image_matrix_limit" : 16777216 ,
"video_size_limit" : 41943040 ,
"video_frame_rate_limit" : 60 ,
"video_matrix_limit" : 16777216
} ,
"polls" : {
"max_options" : 6 ,
"max_characters_per_option" : 50 ,
"min_expiration" : 300 ,
"max_expiration" : 2629746
} ,
"accounts" : {
2023-02-02 14:08:13 +01:00
"allow_custom_css" : true ,
"max_featured_tags" : 10
2023-01-13 17:02:45 +01:00
} ,
"emojis" : {
"emoji_size_limit" : 51200
}
} ,
"urls" : {
"streaming_api" : "wss://localhost:8080"
} ,
"stats" : {
"domain_count" : 2 ,
"status_count" : 16 ,
"user_count" : 4
} ,
"thumbnail" : "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/attachment/original/`+instanceAccount.AvatarMediaAttachment.ID+`.gif" , ` + `
"thumbnail_type" : "image/gif" ,
"thumbnail_description" : "A bouncing little green peglin." ,
"contact_account" : {
"id" : "01F8MH17FWEB39HZJ76B6VXSKF" ,
"username" : "admin" ,
"acct" : "admin" ,
"display_name" : "" ,
"locked" : false ,
2023-02-16 14:20:23 +01:00
"discoverable" : true ,
2023-01-13 17:02:45 +01:00
"bot" : false ,
"created_at" : "2022-05-17T13:10:59.000Z" ,
"note" : "" ,
"url" : "http://localhost:8080/@admin" ,
"avatar" : "" ,
"avatar_static" : "" ,
"header" : "http://localhost:8080/assets/default_header.png" ,
"header_static" : "http://localhost:8080/assets/default_header.png" ,
"followers_count" : 1 ,
"following_count" : 1 ,
"statuses_count" : 4 ,
"last_status_at" : "2021-10-20T10:41:37.000Z" ,
"emojis" : [ ] ,
"fields" : [ ] ,
"enable_rss" : true ,
2023-02-20 17:00:44 +01:00
"role" : {
"name" : "admin"
}
2023-01-13 17:02:45 +01:00
} ,
"max_toot_chars" : 5000
} ` , dst . String ( ) )
2023-02-02 14:08:13 +01:00
// extra bonus: check the v2 model thumbnail after the patch
2023-02-04 15:53:11 +01:00
instanceV2 , err := suite . processor . InstanceGetV2 ( context . Background ( ) )
2023-02-02 14:08:13 +01:00
if err != nil {
suite . FailNow ( err . Error ( ) )
}
instanceV2ThumbnailJson , err := json . MarshalIndent ( instanceV2 . Thumbnail , "" , " " )
if err != nil {
suite . FailNow ( err . Error ( ) )
}
suite . Equal ( ` {
"url" : "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/attachment/original/`+instanceAccount.AvatarMediaAttachment.ID+`.gif" , ` + `
"thumbnail_type" : "image/gif" ,
"thumbnail_description" : "A bouncing little green peglin." ,
"blurhash" : "LG9t;qRS4YtO.4WDRlt5IXoxtPj["
} ` , string ( instanceV2ThumbnailJson ) )
2023-02-04 15:53:11 +01:00
// double extra special bonus: now update the image description without changing the image
code2 , b2 := suite . instancePatch ( "" , "" , map [ string ] string {
"thumbnail_description" : "updating the thumbnail description without changing anything else!" ,
} )
if expectedCode := http . StatusOK ; code2 != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code2 )
}
// just extract the value we wanna check, no need to print the whole thing again
i := make ( map [ string ] interface { } )
if err := json . Unmarshal ( b2 , & i ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
suite . EqualValues ( "updating the thumbnail description without changing anything else!" , i [ "thumbnail_description" ] )
}
func ( suite * InstancePatchTestSuite ) TestInstancePatch9 ( ) {
code , b := suite . instancePatch ( "" , "" , map [ string ] string {
"thumbnail_description" : "setting a new description without having a custom image set; this should change nothing!" ,
} )
if expectedCode := http . StatusOK ; code != expectedCode {
suite . FailNowf ( "wrong status code" , "expected %d but got %d" , expectedCode , code )
}
dst := new ( bytes . Buffer )
if err := json . Indent ( dst , b , "" , " " ) ; err != nil {
suite . FailNow ( err . Error ( ) )
}
suite . Equal ( ` {
"uri" : "http://localhost:8080" ,
"account_domain" : "localhost:8080" ,
"title" : "GoToSocial Testrig Instance" ,
"description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"short_description" : "\u003cp\u003eThis is the GoToSocial testrig. It doesn't federate or anything.\u003c/p\u003e\u003cp\u003eWhen the testrig is shut down, all data on it will be deleted.\u003c/p\u003e\u003cp\u003eDon't use this in production!\u003c/p\u003e" ,
"email" : "admin@example.org" ,
"version" : "0.0.0-testrig" ,
2023-05-06 22:38:19 +02:00
"languages" : [ ] ,
2023-02-04 15:53:11 +01:00
"registrations" : true ,
"approval_required" : true ,
"invites_enabled" : false ,
"configuration" : {
"statuses" : {
"max_characters" : 5000 ,
"max_media_attachments" : 6 ,
2023-03-02 12:06:40 +01:00
"characters_reserved_per_url" : 25 ,
"supported_mime_types" : [
"text/plain" ,
"text/markdown"
]
2023-02-04 15:53:11 +01:00
} ,
"media_attachments" : {
"supported_mime_types" : [
"image/jpeg" ,
"image/gif" ,
"image/png" ,
"image/webp" ,
"video/mp4"
] ,
"image_size_limit" : 10485760 ,
"image_matrix_limit" : 16777216 ,
"video_size_limit" : 41943040 ,
"video_frame_rate_limit" : 60 ,
"video_matrix_limit" : 16777216
} ,
"polls" : {
"max_options" : 6 ,
"max_characters_per_option" : 50 ,
"min_expiration" : 300 ,
"max_expiration" : 2629746
} ,
"accounts" : {
"allow_custom_css" : true ,
"max_featured_tags" : 10
} ,
"emojis" : {
"emoji_size_limit" : 51200
}
} ,
"urls" : {
"streaming_api" : "wss://localhost:8080"
} ,
"stats" : {
"domain_count" : 2 ,
"status_count" : 16 ,
"user_count" : 4
} ,
"thumbnail" : "http://localhost:8080/assets/logo.png" ,
"contact_account" : {
"id" : "01F8MH17FWEB39HZJ76B6VXSKF" ,
"username" : "admin" ,
"acct" : "admin" ,
"display_name" : "" ,
"locked" : false ,
2023-02-16 14:20:23 +01:00
"discoverable" : true ,
2023-02-04 15:53:11 +01:00
"bot" : false ,
"created_at" : "2022-05-17T13:10:59.000Z" ,
"note" : "" ,
"url" : "http://localhost:8080/@admin" ,
"avatar" : "" ,
"avatar_static" : "" ,
"header" : "http://localhost:8080/assets/default_header.png" ,
"header_static" : "http://localhost:8080/assets/default_header.png" ,
"followers_count" : 1 ,
"following_count" : 1 ,
"statuses_count" : 4 ,
"last_status_at" : "2021-10-20T10:41:37.000Z" ,
"emojis" : [ ] ,
"fields" : [ ] ,
"enable_rss" : true ,
2023-02-20 17:00:44 +01:00
"role" : {
"name" : "admin"
}
2023-02-04 15:53:11 +01:00
} ,
"max_toot_chars" : 5000
} ` , dst . String ( ) )
2022-11-08 18:11:06 +01:00
}
2022-05-26 11:37:13 +02:00
func TestInstancePatchTestSuite ( t * testing . T ) {
suite . Run ( t , & InstancePatchTestSuite { } )
}