/* GoToSocial Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org 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 . */ package typeutils_test import ( "context" "encoding/json" "testing" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/testrig" ) type InternalToFrontendTestSuite struct { TypeUtilsTestSuite } func (suite *InternalToFrontendTestSuite) TestAccountToFrontend() { testAccount := suite.testAccounts["local_account_1"] // take zork for this test apiAccount, err := suite.typeconverter.AccountToAPIAccountPublic(context.Background(), testAccount) suite.NoError(err) suite.NotNil(apiAccount) b, err := json.MarshalIndent(apiAccount, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01F8MH1H7YV1Z7D2C8K2730QBF", "username": "the_mighty_zork", "acct": "the_mighty_zork", "display_name": "original zork (he/they)", "locked": false, "bot": false, "created_at": "2022-05-20T11:09:18.000Z", "note": "\u003cp\u003ehey yo this is my profile!\u003c/p\u003e", "url": "http://localhost:8080/@the_mighty_zork", "avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg", "avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.jpg", "header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "followers_count": 2, "following_count": 2, "statuses_count": 5, "last_status_at": "2022-05-20T11:37:55.000Z", "emojis": [], "fields": [], "enable_rss": true, "role": "user" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestAccountToFrontendWithEmojiStruct() { testAccount := suite.testAccounts["local_account_1"] // take zork for this test testEmoji := suite.testEmojis["rainbow"] testAccount.Emojis = []*gtsmodel.Emoji{testEmoji} apiAccount, err := suite.typeconverter.AccountToAPIAccountPublic(context.Background(), testAccount) suite.NoError(err) suite.NotNil(apiAccount) b, err := json.MarshalIndent(apiAccount, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01F8MH1H7YV1Z7D2C8K2730QBF", "username": "the_mighty_zork", "acct": "the_mighty_zork", "display_name": "original zork (he/they)", "locked": false, "bot": false, "created_at": "2022-05-20T11:09:18.000Z", "note": "\u003cp\u003ehey yo this is my profile!\u003c/p\u003e", "url": "http://localhost:8080/@the_mighty_zork", "avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg", "avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.jpg", "header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "followers_count": 2, "following_count": 2, "statuses_count": 5, "last_status_at": "2022-05-20T11:37:55.000Z", "emojis": [ { "shortcode": "rainbow", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "visible_in_picker": true, "category": "reactions" } ], "fields": [], "enable_rss": true, "role": "user" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestAccountToFrontendWithEmojiIDs() { testAccount := suite.testAccounts["local_account_1"] // take zork for this test testEmoji := suite.testEmojis["rainbow"] testAccount.EmojiIDs = []string{testEmoji.ID} apiAccount, err := suite.typeconverter.AccountToAPIAccountPublic(context.Background(), testAccount) suite.NoError(err) suite.NotNil(apiAccount) b, err := json.MarshalIndent(apiAccount, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01F8MH1H7YV1Z7D2C8K2730QBF", "username": "the_mighty_zork", "acct": "the_mighty_zork", "display_name": "original zork (he/they)", "locked": false, "bot": false, "created_at": "2022-05-20T11:09:18.000Z", "note": "\u003cp\u003ehey yo this is my profile!\u003c/p\u003e", "url": "http://localhost:8080/@the_mighty_zork", "avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg", "avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.jpg", "header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "followers_count": 2, "following_count": 2, "statuses_count": 5, "last_status_at": "2022-05-20T11:37:55.000Z", "emojis": [ { "shortcode": "rainbow", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "visible_in_picker": true, "category": "reactions" } ], "fields": [], "enable_rss": true, "role": "user" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestAccountToFrontendSensitive() { testAccount := suite.testAccounts["local_account_1"] // take zork for this test apiAccount, err := suite.typeconverter.AccountToAPIAccountSensitive(context.Background(), testAccount) suite.NoError(err) suite.NotNil(apiAccount) b, err := json.MarshalIndent(apiAccount, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01F8MH1H7YV1Z7D2C8K2730QBF", "username": "the_mighty_zork", "acct": "the_mighty_zork", "display_name": "original zork (he/they)", "locked": false, "bot": false, "created_at": "2022-05-20T11:09:18.000Z", "note": "\u003cp\u003ehey yo this is my profile!\u003c/p\u003e", "url": "http://localhost:8080/@the_mighty_zork", "avatar": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpg", "avatar_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.jpg", "header": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "header_static": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg", "followers_count": 2, "following_count": 2, "statuses_count": 5, "last_status_at": "2022-05-20T11:37:55.000Z", "emojis": [], "fields": [], "source": { "privacy": "public", "sensitive": false, "language": "en", "status_format": "plain", "note": "hey yo this is my profile!", "fields": [], "follow_requests_count": 0 }, "enable_rss": true, "role": "user" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestStatusToFrontend() { testStatus := suite.testStatuses["admin_account_status_1"] requestingAccount := suite.testAccounts["local_account_1"] apiStatus, err := suite.typeconverter.StatusToAPIStatus(context.Background(), testStatus, requestingAccount) suite.NoError(err) b, err := json.MarshalIndent(apiStatus, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01F8MH75CBF9JFX4ZAD54N0W0R", "created_at": "2021-10-20T11:36:45.000Z", "in_reply_to_id": null, "in_reply_to_account_id": null, "sensitive": false, "spoiler_text": "", "visibility": "public", "language": "en", "uri": "http://localhost:8080/users/admin/statuses/01F8MH75CBF9JFX4ZAD54N0W0R", "url": "http://localhost:8080/@admin/statuses/01F8MH75CBF9JFX4ZAD54N0W0R", "replies_count": 0, "reblogs_count": 0, "favourites_count": 1, "favourited": true, "reblogged": false, "muted": false, "bookmarked": true, "pinned": false, "content": "hello world! #welcome ! first post on the instance :rainbow: !", "reblog": null, "application": { "name": "superseriousbusiness", "website": "https://superserious.business" }, "account": { "id": "01F8MH17FWEB39HZJ76B6VXSKF", "username": "admin", "acct": "admin", "display_name": "", "locked": false, "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, "role": "admin" }, "media_attachments": [ { "id": "01F8MH6NEM8D7527KZAECTCR76", "type": "image", "url": "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/original/01F8MH6NEM8D7527KZAECTCR76.jpg", "text_url": "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/original/01F8MH6NEM8D7527KZAECTCR76.jpg", "preview_url": "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/small/01F8MH6NEM8D7527KZAECTCR76.jpg", "remote_url": null, "preview_remote_url": null, "meta": { "original": { "width": 1200, "height": 630, "size": "1200x630", "aspect": 1.9047619 }, "small": { "width": 256, "height": 134, "size": "256x134", "aspect": 1.9104477 }, "focus": { "x": 0, "y": 0 } }, "description": "Black and white image of some 50's style text saying: Welcome On Board", "blurhash": "LNJRdVM{00Rj%Mayt7j[4nWBofRj" } ], "mentions": [], "tags": [ { "name": "welcome", "url": "http://localhost:8080/tags/welcome" } ], "emojis": [ { "shortcode": "rainbow", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "visible_in_picker": true, "category": "reactions" } ], "card": null, "poll": null, "text": "hello world! #welcome ! first post on the instance :rainbow: !" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestStatusToFrontendUnknownLanguage() { testStatus := >smodel.Status{} *testStatus = *suite.testStatuses["admin_account_status_1"] testStatus.Language = "" requestingAccount := suite.testAccounts["local_account_1"] apiStatus, err := suite.typeconverter.StatusToAPIStatus(context.Background(), testStatus, requestingAccount) suite.NoError(err) b, err := json.MarshalIndent(apiStatus, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01F8MH75CBF9JFX4ZAD54N0W0R", "created_at": "2021-10-20T11:36:45.000Z", "in_reply_to_id": null, "in_reply_to_account_id": null, "sensitive": false, "spoiler_text": "", "visibility": "public", "language": null, "uri": "http://localhost:8080/users/admin/statuses/01F8MH75CBF9JFX4ZAD54N0W0R", "url": "http://localhost:8080/@admin/statuses/01F8MH75CBF9JFX4ZAD54N0W0R", "replies_count": 0, "reblogs_count": 0, "favourites_count": 1, "favourited": true, "reblogged": false, "muted": false, "bookmarked": true, "pinned": false, "content": "hello world! #welcome ! first post on the instance :rainbow: !", "reblog": null, "application": { "name": "superseriousbusiness", "website": "https://superserious.business" }, "account": { "id": "01F8MH17FWEB39HZJ76B6VXSKF", "username": "admin", "acct": "admin", "display_name": "", "locked": false, "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, "role": "admin" }, "media_attachments": [ { "id": "01F8MH6NEM8D7527KZAECTCR76", "type": "image", "url": "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/original/01F8MH6NEM8D7527KZAECTCR76.jpg", "text_url": "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/original/01F8MH6NEM8D7527KZAECTCR76.jpg", "preview_url": "http://localhost:8080/fileserver/01F8MH17FWEB39HZJ76B6VXSKF/attachment/small/01F8MH6NEM8D7527KZAECTCR76.jpg", "remote_url": null, "preview_remote_url": null, "meta": { "original": { "width": 1200, "height": 630, "size": "1200x630", "aspect": 1.9047619 }, "small": { "width": 256, "height": 134, "size": "256x134", "aspect": 1.9104477 }, "focus": { "x": 0, "y": 0 } }, "description": "Black and white image of some 50's style text saying: Welcome On Board", "blurhash": "LNJRdVM{00Rj%Mayt7j[4nWBofRj" } ], "mentions": [], "tags": [ { "name": "welcome", "url": "http://localhost:8080/tags/welcome" } ], "emojis": [ { "shortcode": "rainbow", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "visible_in_picker": true, "category": "reactions" } ], "card": null, "poll": null, "text": "hello world! #welcome ! first post on the instance :rainbow: !" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestVideoAttachmentToFrontend() { testAttachment := suite.testAttachments["local_account_1_status_4_attachment_2"] apiAttachment, err := suite.typeconverter.AttachmentToAPIAttachment(context.Background(), testAttachment) suite.NoError(err) b, err := json.MarshalIndent(apiAttachment, "", " ") suite.NoError(err) suite.Equal(`{ "id": "01CDR64G398ADCHXK08WWTHEZ5", "type": "video", "url": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01CDR64G398ADCHXK08WWTHEZ5.mp4", "text_url": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01CDR64G398ADCHXK08WWTHEZ5.mp4", "preview_url": "http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/small/01CDR64G398ADCHXK08WWTHEZ5.jpg", "remote_url": null, "preview_remote_url": null, "meta": { "original": { "width": 720, "height": 404, "frame_rate": "30/1", "duration": 15.033334, "bitrate": 1206522 }, "small": { "width": 720, "height": 404, "size": "720x404", "aspect": 1.7821782 } }, "description": "A cow adorably licking another cow!" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestInstanceToFrontend() { testInstance := >smodel.Instance{ CreatedAt: testrig.TimeMustParse("2021-10-20T11:36:45Z"), UpdatedAt: testrig.TimeMustParse("2021-10-20T11:36:45Z"), Domain: "example.org", Title: "example instance", URI: "https://example.org", ShortDescription: "a little description", Description: "a much longer description", ContactEmail: "someone@example.org", Version: "software-from-hell 0.666", } apiInstance, err := suite.typeconverter.InstanceToAPIInstance(context.Background(), testInstance) suite.NoError(err) b, err := json.MarshalIndent(apiInstance, "", " ") suite.NoError(err) suite.Equal(`{ "uri": "https://example.org", "title": "example instance", "description": "a much longer description", "short_description": "a little description", "email": "someone@example.org", "version": "software-from-hell 0.666", "registrations": false, "approval_required": false, "invites_enabled": false, "thumbnail": "", "max_toot_chars": 0 }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestInstanceToFrontendWithAdminAccount() { testInstance := >smodel.Instance{ CreatedAt: testrig.TimeMustParse("2021-10-20T11:36:45Z"), UpdatedAt: testrig.TimeMustParse("2021-10-20T11:36:45Z"), Domain: "example.org", Title: "example instance", URI: "https://example.org", ShortDescription: "a little description", Description: "a much longer description", ContactEmail: "someone@example.org", ContactAccountID: suite.testAccounts["remote_account_2"].ID, Version: "software-from-hell 0.666", } apiInstance, err := suite.typeconverter.InstanceToAPIInstance(context.Background(), testInstance) suite.NoError(err) b, err := json.MarshalIndent(apiInstance, "", " ") suite.NoError(err) suite.Equal(`{ "uri": "https://example.org", "title": "example instance", "description": "a much longer description", "short_description": "a little description", "email": "someone@example.org", "version": "software-from-hell 0.666", "registrations": false, "approval_required": false, "invites_enabled": false, "thumbnail": "", "contact_account": { "id": "01FHMQX3GAABWSM0S2VZEC2SWC", "username": "Some_User", "acct": "Some_User@example.org", "display_name": "some user", "locked": true, "bot": false, "created_at": "2020-08-10T12:13:28.000Z", "note": "i'm a real son of a gun", "url": "http://example.org/@Some_User", "avatar": "", "avatar_static": "", "header": "http://localhost:8080/assets/default_header.png", "header_static": "http://localhost:8080/assets/default_header.png", "followers_count": 0, "following_count": 0, "statuses_count": 0, "last_status_at": null, "emojis": [], "fields": [] }, "max_toot_chars": 0 }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestEmojiToFrontend() { emoji, err := suite.typeconverter.EmojiToAPIEmoji(context.Background(), suite.testEmojis["rainbow"]) suite.NoError(err) b, err := json.MarshalIndent(emoji, "", " ") suite.NoError(err) suite.Equal(`{ "shortcode": "rainbow", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "visible_in_picker": true, "category": "reactions" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestEmojiToFrontendAdmin1() { emoji, err := suite.typeconverter.EmojiToAdminAPIEmoji(context.Background(), suite.testEmojis["rainbow"]) suite.NoError(err) b, err := json.MarshalIndent(emoji, "", " ") suite.NoError(err) suite.Equal(`{ "shortcode": "rainbow", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01F8MH9H8E4VG3KDYJR9EGPXCQ.png", "visible_in_picker": true, "category": "reactions", "id": "01F8MH9H8E4VG3KDYJR9EGPXCQ", "disabled": false, "updated_at": "2021-09-20T10:40:37.000Z", "total_file_size": 47115, "content_type": "image/png", "uri": "http://localhost:8080/emoji/01F8MH9H8E4VG3KDYJR9EGPXCQ" }`, string(b)) } func (suite *InternalToFrontendTestSuite) TestEmojiToFrontendAdmin2() { emoji, err := suite.typeconverter.EmojiToAdminAPIEmoji(context.Background(), suite.testEmojis["yell"]) suite.NoError(err) b, err := json.MarshalIndent(emoji, "", " ") suite.NoError(err) suite.Equal(`{ "shortcode": "yell", "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01GD5KP5CQEE1R3X43Y1EHS2CW.png", "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/emoji/static/01GD5KP5CQEE1R3X43Y1EHS2CW.png", "visible_in_picker": false, "id": "01GD5KP5CQEE1R3X43Y1EHS2CW", "disabled": false, "domain": "fossbros-anonymous.io", "updated_at": "2020-03-18T12:12:00.000Z", "total_file_size": 21697, "content_type": "image/png", "uri": "http://fossbros-anonymous.io/emoji/01GD5KP5CQEE1R3X43Y1EHS2CW" }`, string(b)) } func TestInternalToFrontendTestSuite(t *testing.T) { suite.Run(t, new(InternalToFrontendTestSuite)) }