2023-03-12 15:00:57 +00: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-24 18:12:07 +00:00
package admin_test
import (
"context"
"encoding/json"
2024-06-26 15:01:16 +00:00
"io"
2022-11-24 18:12:07 +00:00
"net/http"
"net/http/httptest"
2024-08-03 17:05:38 +00:00
"strings"
2022-11-24 18:12:07 +00:00
"testing"
"github.com/stretchr/testify/suite"
"github.com/superseriousbusiness/gotosocial/internal/api/client/admin"
apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model"
2024-06-18 16:18:00 +00:00
apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util"
2022-11-24 18:12:07 +00:00
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
"github.com/superseriousbusiness/gotosocial/testrig"
)
type EmojiUpdateTestSuite struct {
AdminStandardTestSuite
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateNewCategory ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "rainbow" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"category" : { "New Category" } , // this category doesn't exist yet
"type" : { "modify" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
// 1. we should have OK because our request was valid
suite . Equal ( http . StatusOK , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
suite . NotEmpty ( b )
// response should be an admin model emoji
adminEmoji := & apimodel . AdminEmoji { }
err = json . Unmarshal ( b , adminEmoji )
suite . NoError ( err )
// appropriate fields should be set
suite . Equal ( "rainbow" , adminEmoji . Shortcode )
suite . NotEmpty ( adminEmoji . URL )
suite . NotEmpty ( adminEmoji . StaticURL )
suite . True ( adminEmoji . VisibleInPicker )
// emoji should be in the db
dbEmoji , err := suite . db . GetEmojiByShortcodeDomain ( context . Background ( ) , adminEmoji . Shortcode , "" )
suite . NoError ( err )
// check fields on the emoji
suite . NotEmpty ( dbEmoji . ID )
suite . Equal ( "rainbow" , dbEmoji . Shortcode )
suite . Empty ( dbEmoji . Domain )
suite . Empty ( dbEmoji . ImageRemoteURL )
suite . Empty ( dbEmoji . ImageStaticRemoteURL )
suite . Equal ( adminEmoji . URL , dbEmoji . ImageURL )
suite . Equal ( adminEmoji . StaticURL , dbEmoji . ImageStaticURL )
suite . NotEmpty ( dbEmoji . ImagePath )
suite . NotEmpty ( dbEmoji . ImageStaticPath )
suite . Equal ( "image/png" , dbEmoji . ImageContentType )
suite . Equal ( "image/png" , dbEmoji . ImageStaticContentType )
suite . Equal ( 36702 , dbEmoji . ImageFileSize )
2024-07-12 09:39:47 +00:00
suite . Equal ( 6092 , dbEmoji . ImageStaticFileSize )
2022-11-24 18:12:07 +00:00
suite . False ( * dbEmoji . Disabled )
suite . NotEmpty ( dbEmoji . URI )
suite . True ( * dbEmoji . VisibleInPicker )
suite . NotEmpty ( dbEmoji . CategoryID )
// emoji should be in storage
2024-07-12 09:39:47 +00:00
entry , err := suite . storage . Storage . Stat ( ctx , dbEmoji . ImagePath )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-07-12 09:39:47 +00:00
suite . Equal ( int64 ( dbEmoji . ImageFileSize ) , entry . Size )
entry , err = suite . storage . Storage . Stat ( ctx , dbEmoji . ImageStaticPath )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-07-12 09:39:47 +00:00
suite . Equal ( int64 ( dbEmoji . ImageStaticFileSize ) , entry . Size )
2022-11-24 18:12:07 +00:00
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateSwitchCategory ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "rainbow" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "modify" } ,
"category" : { "cute stuff" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
// 1. we should have OK because our request was valid
suite . Equal ( http . StatusOK , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
suite . NotEmpty ( b )
// response should be an admin model emoji
adminEmoji := & apimodel . AdminEmoji { }
err = json . Unmarshal ( b , adminEmoji )
suite . NoError ( err )
// appropriate fields should be set
suite . Equal ( "rainbow" , adminEmoji . Shortcode )
suite . NotEmpty ( adminEmoji . URL )
suite . NotEmpty ( adminEmoji . StaticURL )
suite . True ( adminEmoji . VisibleInPicker )
// emoji should be in the db
dbEmoji , err := suite . db . GetEmojiByShortcodeDomain ( context . Background ( ) , adminEmoji . Shortcode , "" )
suite . NoError ( err )
// check fields on the emoji
suite . NotEmpty ( dbEmoji . ID )
suite . Equal ( "rainbow" , dbEmoji . Shortcode )
suite . Empty ( dbEmoji . Domain )
suite . Empty ( dbEmoji . ImageRemoteURL )
suite . Empty ( dbEmoji . ImageStaticRemoteURL )
suite . Equal ( adminEmoji . URL , dbEmoji . ImageURL )
suite . Equal ( adminEmoji . StaticURL , dbEmoji . ImageStaticURL )
suite . NotEmpty ( dbEmoji . ImagePath )
suite . NotEmpty ( dbEmoji . ImageStaticPath )
suite . Equal ( "image/png" , dbEmoji . ImageContentType )
suite . Equal ( "image/png" , dbEmoji . ImageStaticContentType )
suite . Equal ( 36702 , dbEmoji . ImageFileSize )
2024-07-12 09:39:47 +00:00
suite . Equal ( 6092 , dbEmoji . ImageStaticFileSize )
2022-11-24 18:12:07 +00:00
suite . False ( * dbEmoji . Disabled )
suite . NotEmpty ( dbEmoji . URI )
suite . True ( * dbEmoji . VisibleInPicker )
suite . NotEmpty ( dbEmoji . CategoryID )
// emoji should be in storage
2024-07-12 09:39:47 +00:00
entry , err := suite . storage . Storage . Stat ( ctx , dbEmoji . ImagePath )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-07-12 09:39:47 +00:00
suite . Equal ( int64 ( dbEmoji . ImageFileSize ) , entry . Size )
entry , err = suite . storage . Storage . Stat ( ctx , dbEmoji . ImageStaticPath )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-07-12 09:39:47 +00:00
suite . Equal ( int64 ( dbEmoji . ImageStaticFileSize ) , entry . Size )
2022-11-24 18:12:07 +00:00
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateCopyRemoteToLocal ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "yell" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "copy" } ,
"category" : { "emojis i stole" } ,
"shortcode" : { "yell" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
// 1. we should have OK because our request was valid
suite . Equal ( http . StatusOK , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
suite . NotEmpty ( b )
// response should be an admin model emoji
adminEmoji := & apimodel . AdminEmoji { }
err = json . Unmarshal ( b , adminEmoji )
suite . NoError ( err )
// appropriate fields should be set
suite . Equal ( "yell" , adminEmoji . Shortcode )
suite . NotEmpty ( adminEmoji . URL )
suite . NotEmpty ( adminEmoji . StaticURL )
suite . True ( adminEmoji . VisibleInPicker )
// emoji should be in the db
dbEmoji , err := suite . db . GetEmojiByShortcodeDomain ( context . Background ( ) , adminEmoji . Shortcode , "" )
suite . NoError ( err )
// check fields on the emoji
suite . NotEmpty ( dbEmoji . ID )
suite . Equal ( "yell" , dbEmoji . Shortcode )
suite . Empty ( dbEmoji . Domain )
suite . Empty ( dbEmoji . ImageRemoteURL )
suite . Empty ( dbEmoji . ImageStaticRemoteURL )
suite . Equal ( adminEmoji . URL , dbEmoji . ImageURL )
suite . Equal ( adminEmoji . StaticURL , dbEmoji . ImageStaticURL )
suite . NotEmpty ( dbEmoji . ImagePath )
suite . NotEmpty ( dbEmoji . ImageStaticPath )
suite . Equal ( "image/png" , dbEmoji . ImageContentType )
suite . Equal ( "image/png" , dbEmoji . ImageStaticContentType )
suite . Equal ( 10889 , dbEmoji . ImageFileSize )
2024-07-12 09:39:47 +00:00
suite . Equal ( 8965 , dbEmoji . ImageStaticFileSize )
2022-11-24 18:12:07 +00:00
suite . False ( * dbEmoji . Disabled )
suite . NotEmpty ( dbEmoji . URI )
suite . True ( * dbEmoji . VisibleInPicker )
suite . NotEmpty ( dbEmoji . CategoryID )
// emoji should be in storage
2024-07-12 09:39:47 +00:00
entry , err := suite . storage . Storage . Stat ( ctx , dbEmoji . ImagePath )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-07-12 09:39:47 +00:00
suite . Equal ( int64 ( dbEmoji . ImageFileSize ) , entry . Size )
entry , err = suite . storage . Storage . Stat ( ctx , dbEmoji . ImageStaticPath )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-07-12 09:39:47 +00:00
suite . Equal ( int64 ( dbEmoji . ImageStaticFileSize ) , entry . Size )
2022-11-24 18:12:07 +00:00
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateDisableEmoji ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "yell" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "disable" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
// 1. we should have OK because our request was valid
suite . Equal ( http . StatusOK , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
suite . NotEmpty ( b )
// response should be an admin model emoji
adminEmoji := & apimodel . AdminEmoji { }
err = json . Unmarshal ( b , adminEmoji )
suite . NoError ( err )
suite . True ( adminEmoji . Disabled )
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateDisableLocalEmoji ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "rainbow" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "disable" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-01-29 14:57:22 +00:00
suite . Equal ( ` { "error":"Bad Request: emoji 01F8MH9H8E4VG3KDYJR9EGPXCQ is not a remote emoji, cannot disable it via this endpoint"} ` , string ( b ) )
2022-11-24 18:12:07 +00:00
}
2024-08-03 17:05:38 +00:00
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateModify ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "rainbow" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
testrig . FileToDataF ( "image" , "../../../../testrig/media/kip-original.gif" ) ,
map [ string ] [ ] string {
"type" : { "modify" } ,
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusOK , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
b , err := io . ReadAll ( result . Body )
suite . NoError ( err )
suite . NotEmpty ( b )
// response should be an admin model emoji
adminEmoji := & apimodel . AdminEmoji { }
err = json . Unmarshal ( b , adminEmoji )
suite . NoError ( err )
// appropriate fields should be set
suite . Equal ( "rainbow" , adminEmoji . Shortcode )
suite . NotEmpty ( adminEmoji . URL )
suite . NotEmpty ( adminEmoji . StaticURL )
suite . True ( adminEmoji . VisibleInPicker )
// emoji should be in the db
dbEmoji , err := suite . db . GetEmojiByShortcodeDomain ( context . Background ( ) , adminEmoji . Shortcode , "" )
suite . NoError ( err )
// check fields on the emoji
suite . NotEmpty ( dbEmoji . ID )
suite . Equal ( "rainbow" , dbEmoji . Shortcode )
suite . Empty ( dbEmoji . Domain )
suite . Empty ( dbEmoji . ImageRemoteURL )
suite . Empty ( dbEmoji . ImageStaticRemoteURL )
suite . Equal ( adminEmoji . URL , dbEmoji . ImageURL )
suite . Equal ( adminEmoji . StaticURL , dbEmoji . ImageStaticURL )
// Ensure image path as expected.
suite . NotEmpty ( dbEmoji . ImagePath )
if ! strings . HasPrefix ( dbEmoji . ImagePath , suite . testAccounts [ "instance_account" ] . ID + "/emoji/original" ) {
suite . FailNow ( "" , "image path %s not valid" , dbEmoji . ImagePath )
}
// Ensure static image path as expected.
suite . NotEmpty ( dbEmoji . ImageStaticPath )
if ! strings . HasPrefix ( dbEmoji . ImageStaticPath , suite . testAccounts [ "instance_account" ] . ID + "/emoji/static" ) {
suite . FailNow ( "" , "image path %s not valid" , dbEmoji . ImageStaticPath )
}
suite . Equal ( "image/gif" , dbEmoji . ImageContentType )
suite . Equal ( "image/png" , dbEmoji . ImageStaticContentType )
suite . Equal ( 1428 , dbEmoji . ImageFileSize )
suite . Equal ( 1056 , dbEmoji . ImageStaticFileSize )
suite . False ( * dbEmoji . Disabled )
suite . NotEmpty ( dbEmoji . URI )
suite . True ( * dbEmoji . VisibleInPicker )
suite . NotEmpty ( dbEmoji . CategoryID )
// emoji should be in storage
entry , err := suite . storage . Storage . Stat ( ctx , dbEmoji . ImagePath )
suite . NoError ( err )
suite . Equal ( int64 ( dbEmoji . ImageFileSize ) , entry . Size )
entry , err = suite . storage . Storage . Stat ( ctx , dbEmoji . ImageStaticPath )
suite . NoError ( err )
suite . Equal ( int64 ( dbEmoji . ImageStaticFileSize ) , entry . Size )
}
2022-11-24 18:12:07 +00:00
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateModifyRemoteEmoji ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "yell" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
testrig . FileToDataF ( "image" , "../../../../testrig/media/kip-original.gif" ) ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "modify" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-06-26 15:01:16 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-06-26 15:01:16 +00:00
suite . Equal ( ` { "error":"Bad Request: cannot modify remote emoji"} ` , string ( b ) )
2022-11-24 18:12:07 +00:00
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateModifyNoParams ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "rainbow" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "modify" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
suite . Equal ( ` { "error":"Bad Request: emoji action type was 'modify' but no image or category name was provided"} ` , string ( b ) )
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateCopyLocalToLocal ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "rainbow" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "copy" } ,
"shortcode" : { "bottoms" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-06-26 15:01:16 +00:00
suite . Equal ( ` { "error":"Bad Request: target emoji is not remote; cannot copy to local"} ` , string ( b ) )
2022-11-24 18:12:07 +00:00
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateCopyEmptyShortcode ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "yell" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "copy" } ,
"shortcode" : { "" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-11-21 11:13:55 +00:00
suite . Equal ( ` { "error":"Bad Request: shortcode did not pass validation, must be between 1 and 30 characters, letters, numbers, and underscores only"} ` , string ( b ) )
2022-11-24 18:12:07 +00:00
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateCopyNoShortcode ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "yell" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "copy" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusBadRequest , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
suite . Equal ( ` { "error":"Bad Request: emoji action type was 'copy' but no shortcode was provided"} ` , string ( b ) )
}
func ( suite * EmojiUpdateTestSuite ) TestEmojiUpdateCopyShortcodeAlreadyInUse ( ) {
testEmoji := & gtsmodel . Emoji { }
* testEmoji = * suite . testEmojis [ "yell" ]
// set up the request
requestBody , w , err := testrig . CreateMultipartFormData (
2024-08-02 11:41:46 +00:00
nil ,
2023-11-10 16:42:48 +00:00
map [ string ] [ ] string {
"type" : { "copy" } ,
"shortcode" : { "rainbow" } ,
2022-11-24 18:12:07 +00:00
} )
if err != nil {
panic ( err )
}
bodyBytes := requestBody . Bytes ( )
recorder := httptest . NewRecorder ( )
ctx := suite . newContext ( recorder , http . MethodPost , bodyBytes , admin . EmojiPathWithID , w . FormDataContentType ( ) )
2024-06-18 16:18:00 +00:00
ctx . AddParam ( apiutil . IDKey , testEmoji . ID )
2022-11-24 18:12:07 +00:00
// call the handler
suite . adminModule . EmojiPATCHHandler ( ctx )
suite . Equal ( http . StatusConflict , recorder . Code )
// 2. we should have no error message in the result body
result := recorder . Result ( )
defer result . Body . Close ( )
// check the response
2024-08-03 17:05:38 +00:00
b , err := io . ReadAll ( result . Body )
2022-11-24 18:12:07 +00:00
suite . NoError ( err )
2024-06-26 15:01:16 +00:00
suite . Equal ( ` { "error":"Conflict: emoji with shortcode already exists"} ` , string ( b ) )
2022-11-24 18:12:07 +00:00
}
func TestEmojiUpdateTestSuite ( t * testing . T ) {
suite . Run ( t , & EmojiUpdateTestSuite { } )
}