diff options
Diffstat (limited to 'test')
21 files changed, 1278 insertions, 423 deletions
| diff --git a/test/captcha_test.exs b/test/captcha_test.exs index ac1d846e8..1ab9019ab 100644 --- a/test/captcha_test.exs +++ b/test/captcha_test.exs @@ -61,7 +61,7 @@ defmodule Pleroma.CaptchaTest do        assert is_binary(answer)        assert :ok = Native.validate(token, answer, answer) -      assert {:error, "Invalid CAPTCHA"} == Native.validate(token, answer, answer <> "foobar") +      assert {:error, :invalid} == Native.validate(token, answer, answer <> "foobar")      end    end @@ -78,6 +78,7 @@ defmodule Pleroma.CaptchaTest do        assert is_binary(answer)        assert :ok = Captcha.validate(token, "63615261b77f5354fb8c4e4986477555", answer) +      Cachex.del(:used_captcha_cache, token)      end      test "doesn't validate invalid answer" do @@ -92,7 +93,7 @@ defmodule Pleroma.CaptchaTest do        assert is_binary(answer) -      assert {:error, "Invalid answer data"} = +      assert {:error, :invalid_answer_data} =                 Captcha.validate(token, "63615261b77f5354fb8c4e4986477555", answer <> "foobar")      end @@ -108,7 +109,7 @@ defmodule Pleroma.CaptchaTest do        assert is_binary(answer) -      assert {:error, "Invalid answer data"} = +      assert {:error, :invalid_answer_data} =                 Captcha.validate(token, "63615261b77f5354fb8c4e4986477555", nil)      end    end diff --git a/test/fixtures/tesla_mock/craigmaloney.json b/test/fixtures/tesla_mock/craigmaloney.json new file mode 100644 index 000000000..56ea9c7c3 --- /dev/null +++ b/test/fixtures/tesla_mock/craigmaloney.json @@ -0,0 +1,112 @@ +{ +    "@context": [ +        "https://www.w3.org/ns/activitystreams", +        "https://w3id.org/security/v1", +        { +            "CacheFile": "pt:CacheFile", +            "Hashtag": "as:Hashtag", +            "Infohash": "pt:Infohash", +            "RsaSignature2017": "https://w3id.org/security#RsaSignature2017", +            "category": "sc:category", +            "commentsEnabled": { +                "@id": "pt:commentsEnabled", +                "@type": "sc:Boolean" +            }, +            "downloadEnabled": { +                "@id": "pt:downloadEnabled", +                "@type": "sc:Boolean" +            }, +            "expires": "sc:expires", +            "fps": { +                "@id": "pt:fps", +                "@type": "sc:Number" +            }, +            "language": "sc:inLanguage", +            "licence": "sc:license", +            "originallyPublishedAt": "sc:datePublished", +            "position": { +                "@id": "pt:position", +                "@type": "sc:Number" +            }, +            "pt": "https://joinpeertube.org/ns#", +            "sc": "http://schema.org#", +            "sensitive": "as:sensitive", +            "size": { +                "@id": "pt:size", +                "@type": "sc:Number" +            }, +            "startTimestamp": { +                "@id": "pt:startTimestamp", +                "@type": "sc:Number" +            }, +            "state": { +                "@id": "pt:state", +                "@type": "sc:Number" +            }, +            "stopTimestamp": { +                "@id": "pt:stopTimestamp", +                "@type": "sc:Number" +            }, +            "subtitleLanguage": "sc:subtitleLanguage", +            "support": { +                "@id": "pt:support", +                "@type": "sc:Text" +            }, +            "uuid": "sc:identifier", +            "views": { +                "@id": "pt:views", +                "@type": "sc:Number" +            }, +            "waitTranscoding": { +                "@id": "pt:waitTranscoding", +                "@type": "sc:Boolean" +            } +        }, +        { +            "comments": { +                "@id": "as:comments", +                "@type": "@id" +            }, +            "dislikes": { +                "@id": "as:dislikes", +                "@type": "@id" +            }, +            "likes": { +                "@id": "as:likes", +                "@type": "@id" +            }, +            "playlists": { +                "@id": "pt:playlists", +                "@type": "@id" +            }, +            "shares": { +                "@id": "as:shares", +                "@type": "@id" +            } +        } +    ], +    "endpoints": { +        "sharedInbox": "https://peertube.social/inbox" +    }, +    "followers": "https://peertube.social/accounts/craigmaloney/followers", +    "following": "https://peertube.social/accounts/craigmaloney/following", +    "icon": { +        "mediaType": "image/png", +        "type": "Image", +        "url": "https://peertube.social/lazy-static/avatars/87bd694b-95bc-4066-83f4-bddfcd2b9caa.png" +    }, +    "id": "https://peertube.social/accounts/craigmaloney", +    "inbox": "https://peertube.social/accounts/craigmaloney/inbox", +    "name": "Craig Maloney", +    "outbox": "https://peertube.social/accounts/craigmaloney/outbox", +    "playlists": "https://peertube.social/accounts/craigmaloney/playlists", +    "preferredUsername": "craigmaloney", +    "publicKey": { +        "id": "https://peertube.social/accounts/craigmaloney#main-key", +        "owner": "https://peertube.social/accounts/craigmaloney", +        "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9qvGIYUW01yc8CCsrwxK\n5OXlV5s7EbNWY8tJr/p1oGuELZwAnG2XKxtdbvgcCT+YxL5uRXIdCFIIIKrzRFr/\nHfS0mOgNT9u3gu+SstCNgtatciT0RVP77yiC3b2NHq1NRRvvVhzQb4cpIWObIxqh\nb2ypDClTc7XaKtgmQCbwZlGyZMT+EKz/vustD6BlpGsglRkm7iES6s1PPGb1BU+n\nS94KhbS2DOFiLcXCVWt0QarokIIuKznp4+xP1axKyP+SkT5AHx08Nd5TYFb2C1Jl\nz0WD/1q0mAN62m7QrA3SQPUgB+wWD+S3Nzf7FwNPiP4srbBgxVEUnji/r9mQ6BXC\nrQIDAQAB\n-----END PUBLIC KEY-----" +    }, +    "summary": null, +    "type": "Person", +    "url": "https://peertube.social/accounts/craigmaloney" +} diff --git a/test/fixtures/tesla_mock/peertube-social.json b/test/fixtures/tesla_mock/peertube-social.json new file mode 100644 index 000000000..0e996ba35 --- /dev/null +++ b/test/fixtures/tesla_mock/peertube-social.json @@ -0,0 +1,234 @@ +{ +    "@context": [ +        "https://www.w3.org/ns/activitystreams", +        "https://w3id.org/security/v1", +        { +            "CacheFile": "pt:CacheFile", +            "Hashtag": "as:Hashtag", +            "Infohash": "pt:Infohash", +            "RsaSignature2017": "https://w3id.org/security#RsaSignature2017", +            "category": "sc:category", +            "commentsEnabled": { +                "@id": "pt:commentsEnabled", +                "@type": "sc:Boolean" +            }, +            "downloadEnabled": { +                "@id": "pt:downloadEnabled", +                "@type": "sc:Boolean" +            }, +            "expires": "sc:expires", +            "fps": { +                "@id": "pt:fps", +                "@type": "sc:Number" +            }, +            "language": "sc:inLanguage", +            "licence": "sc:license", +            "originallyPublishedAt": "sc:datePublished", +            "position": { +                "@id": "pt:position", +                "@type": "sc:Number" +            }, +            "pt": "https://joinpeertube.org/ns#", +            "sc": "http://schema.org#", +            "sensitive": "as:sensitive", +            "size": { +                "@id": "pt:size", +                "@type": "sc:Number" +            }, +            "startTimestamp": { +                "@id": "pt:startTimestamp", +                "@type": "sc:Number" +            }, +            "state": { +                "@id": "pt:state", +                "@type": "sc:Number" +            }, +            "stopTimestamp": { +                "@id": "pt:stopTimestamp", +                "@type": "sc:Number" +            }, +            "subtitleLanguage": "sc:subtitleLanguage", +            "support": { +                "@id": "pt:support", +                "@type": "sc:Text" +            }, +            "uuid": "sc:identifier", +            "views": { +                "@id": "pt:views", +                "@type": "sc:Number" +            }, +            "waitTranscoding": { +                "@id": "pt:waitTranscoding", +                "@type": "sc:Boolean" +            } +        }, +        { +            "comments": { +                "@id": "as:comments", +                "@type": "@id" +            }, +            "dislikes": { +                "@id": "as:dislikes", +                "@type": "@id" +            }, +            "likes": { +                "@id": "as:likes", +                "@type": "@id" +            }, +            "playlists": { +                "@id": "pt:playlists", +                "@type": "@id" +            }, +            "shares": { +                "@id": "as:shares", +                "@type": "@id" +            } +        } +    ], +    "attributedTo": [ +        { +            "id": "https://peertube.social/accounts/craigmaloney", +            "type": "Person" +        }, +        { +            "id": "https://peertube.social/video-channels/9909c7d9-6b5b-4aae-9164-c1af7229c91c", +            "type": "Group" +        } +    ], +    "category": { +        "identifier": "15", +        "name": "Science & Technology" +    }, +    "cc": [ +        "https://peertube.social/accounts/craigmaloney/followers" +    ], +    "comments": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/comments", +    "commentsEnabled": true, +    "content": "Support this and our other Michigan!/usr/group videos and meetings. Learn more at http://mug.org/membership\n\nTwenty Years in Jail: FreeBSD's Jails, Then and Now\n\nJails started as a limited virtualization system, but over the last two years they've...", +    "dislikes": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/dislikes", +    "downloadEnabled": true, +    "duration": "PT5151S", +    "icon": { +        "height": 122, +        "mediaType": "image/jpeg", +        "type": "Image", +        "url": "https://peertube.social/static/thumbnails/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe.jpg", +        "width": 223 +    }, +    "id": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", +    "language": { +        "identifier": "en", +        "name": "English" +    }, +    "licence": { +        "identifier": "1", +        "name": "Attribution" +    }, +    "likes": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/likes", +    "mediaType": "text/markdown", +    "name": "Twenty Years in Jail: FreeBSD's Jails, Then and Now", +    "originallyPublishedAt": "2019-08-13T00:00:00.000Z", +    "published": "2020-02-12T01:06:08.054Z", +    "sensitive": false, +    "shares": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/announces", +    "state": 1, +    "subtitleLanguage": [], +    "support": "Learn more at http://mug.org", +    "tag": [ +        { +            "name": "linux", +            "type": "Hashtag" +        }, +        { +            "name": "mug.org", +            "type": "Hashtag" +        }, +        { +            "name": "open", +            "type": "Hashtag" +        }, +        { +            "name": "oss", +            "type": "Hashtag" +        }, +        { +            "name": "source", +            "type": "Hashtag" +        } +    ], +    "to": [ +        "https://www.w3.org/ns/activitystreams#Public" +    ], +    "type": "Video", +    "updated": "2020-02-15T15:01:09.474Z", +    "url": [ +        { +            "href": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", +            "mediaType": "text/html", +            "type": "Link" +        }, +        { +            "fps": 30, +            "height": 240, +            "href": "https://peertube.social/static/webseed/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.mp4", +            "mediaType": "video/mp4", +            "size": 119465800, +            "type": "Link" +        }, +        { +            "height": 240, +            "href": "https://peertube.social/static/torrents/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.torrent", +            "mediaType": "application/x-bittorrent", +            "type": "Link" +        }, +        { +            "height": 240, +            "href": "magnet:?xs=https%3A%2F%2Fpeertube.social%2Fstatic%2Ftorrents%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.torrent&xt=urn:btih:b3365331a8543bf48d09add56d7fe4b1cbbb5659&dn=Twenty+Years+in+Jail%3A+FreeBSD's+Jails%2C+Then+and+Now&tr=wss%3A%2F%2Fpeertube.social%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.social%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.social%2Fstatic%2Fwebseed%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.mp4", +            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet", +            "type": "Link" +        }, +        { +            "fps": 30, +            "height": 360, +            "href": "https://peertube.social/static/webseed/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.mp4", +            "mediaType": "video/mp4", +            "size": 143930318, +            "type": "Link" +        }, +        { +            "height": 360, +            "href": "https://peertube.social/static/torrents/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.torrent", +            "mediaType": "application/x-bittorrent", +            "type": "Link" +        }, +        { +            "height": 360, +            "href": "magnet:?xs=https%3A%2F%2Fpeertube.social%2Fstatic%2Ftorrents%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.torrent&xt=urn:btih:0d37b23c98cb0d89e28b5dc8f49b3c97a041e569&dn=Twenty+Years+in+Jail%3A+FreeBSD's+Jails%2C+Then+and+Now&tr=wss%3A%2F%2Fpeertube.social%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.social%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.social%2Fstatic%2Fwebseed%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.mp4", +            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet", +            "type": "Link" +        }, +        { +            "fps": 30, +            "height": 480, +            "href": "https://peertube.social/static/webseed/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.mp4", +            "mediaType": "video/mp4", +            "size": 130530754, +            "type": "Link" +        }, +        { +            "height": 480, +            "href": "https://peertube.social/static/torrents/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.torrent", +            "mediaType": "application/x-bittorrent", +            "type": "Link" +        }, +        { +            "height": 480, +            "href": "magnet:?xs=https%3A%2F%2Fpeertube.social%2Fstatic%2Ftorrents%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.torrent&xt=urn:btih:3a13ff822ad9494165eff6167183ddaaabc1372a&dn=Twenty+Years+in+Jail%3A+FreeBSD's+Jails%2C+Then+and+Now&tr=wss%3A%2F%2Fpeertube.social%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.social%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.social%2Fstatic%2Fwebseed%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.mp4", +            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet", +            "type": "Link" +        } +    ], +    "uuid": "278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", +    "views": 2, +    "waitTranscoding": false +} diff --git a/test/instance_static/add/shortcode.png b/test/instance_static/add/shortcode.pngBinary files differ new file mode 100644 index 000000000..8f50fa023 --- /dev/null +++ b/test/instance_static/add/shortcode.png diff --git a/test/instance_static/emoji/pack_bad_sha/blank.png b/test/instance_static/emoji/pack_bad_sha/blank.pngBinary files differ new file mode 100644 index 000000000..8f50fa023 --- /dev/null +++ b/test/instance_static/emoji/pack_bad_sha/blank.png diff --git a/test/instance_static/emoji/pack_bad_sha/pack.json b/test/instance_static/emoji/pack_bad_sha/pack.json new file mode 100644 index 000000000..35caf4298 --- /dev/null +++ b/test/instance_static/emoji/pack_bad_sha/pack.json @@ -0,0 +1,13 @@ +{ +    "pack": { +        "license": "Test license", +        "homepage": "https://pleroma.social", +        "description": "Test description", +        "can-download": true, +        "share-files": true, +        "download-sha256": "57482F30674FD3DE821FF48C81C00DA4D4AF1F300209253684ABA7075E5FC238" +    }, +    "files": { +        "blank": "blank.png" +    } +}
\ No newline at end of file diff --git a/test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip b/test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zipBinary files differ new file mode 100644 index 000000000..148446c64 --- /dev/null +++ b/test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip diff --git a/test/instance_static/emoji/test_pack/pack.json b/test/instance_static/emoji/test_pack/pack.json index 5a8ee75f9..481891b08 100644 --- a/test/instance_static/emoji/test_pack/pack.json +++ b/test/instance_static/emoji/test_pack/pack.json @@ -1,13 +1,11 @@  { +    "files": { +        "blank": "blank.png" +    },      "pack": { -        "license": "Test license", -        "homepage": "https://pleroma.social",          "description": "Test description", - +        "homepage": "https://pleroma.social", +        "license": "Test license",          "share-files": true -    }, - -    "files": { -        "blank": "blank.png"      } -} +}
\ No newline at end of file diff --git a/test/instance_static/emoji/test_pack_nonshared/pack.json b/test/instance_static/emoji/test_pack_nonshared/pack.json index b96781f81..93d643a5f 100644 --- a/test/instance_static/emoji/test_pack_nonshared/pack.json +++ b/test/instance_static/emoji/test_pack_nonshared/pack.json @@ -3,14 +3,11 @@          "license": "Test license",          "homepage": "https://pleroma.social",          "description": "Test description", -          "fallback-src": "https://nonshared-pack",          "fallback-src-sha256": "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF", -          "share-files": false      }, -      "files": {          "blank": "blank.png"      } -} +}
\ No newline at end of file diff --git a/test/notification_test.exs b/test/notification_test.exs index a7f53e319..0e9ffcb18 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -362,6 +362,16 @@ defmodule Pleroma.NotificationTest do        notification_id = notification.id        assert [%{id: ^notification_id}] = Notification.for_user(followed_user)      end + +    test "dismisses the notification on follow request rejection" do +      clear_config([:notifications, :enable_follow_request_notifications], true) +      user = insert(:user, locked: true) +      follower = insert(:user) +      {:ok, _, _, _follow_activity} = CommonAPI.follow(follower, user) +      assert [notification] = Notification.for_user(user) +      {:ok, _follower} = CommonAPI.reject_follow_request(follower, user) +      assert [] = Notification.for_user(user) +    end    end    describe "get notification" do @@ -669,6 +679,37 @@ defmodule Pleroma.NotificationTest do        assert [other_user] == disabled_receivers        refute other_user in enabled_receivers      end + +    test "it returns non-following domain-blocking recipient in disabled recipients list" do +      blocked_domain = "blocked.domain" +      user = insert(:user, %{ap_id: "https://#{blocked_domain}/@actor"}) +      other_user = insert(:user) + +      {:ok, other_user} = User.block_domain(other_user, blocked_domain) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}!"}) + +      {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert [] == enabled_receivers +      assert [other_user] == disabled_receivers +    end + +    test "it returns following domain-blocking recipient in enabled recipients list" do +      blocked_domain = "blocked.domain" +      user = insert(:user, %{ap_id: "https://#{blocked_domain}/@actor"}) +      other_user = insert(:user) + +      {:ok, other_user} = User.block_domain(other_user, blocked_domain) +      {:ok, other_user} = User.follow(other_user, user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}!"}) + +      {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert [other_user] == enabled_receivers +      assert [] == disabled_receivers +    end    end    describe "notification lifecycle" do @@ -931,7 +972,7 @@ defmodule Pleroma.NotificationTest do        assert Notification.for_user(user) == []      end -    test "it doesn't return notifications for blocked domain" do +    test "it doesn't return notifications for domain-blocked non-followed user" do        user = insert(:user)        blocked = insert(:user, ap_id: "http://some-domain.com")        {:ok, user} = User.block_domain(user, "some-domain.com") @@ -941,6 +982,18 @@ defmodule Pleroma.NotificationTest do        assert Notification.for_user(user) == []      end +    test "it returns notifications for domain-blocked but followed user" do +      user = insert(:user) +      blocked = insert(:user, ap_id: "http://some-domain.com") + +      {:ok, user} = User.block_domain(user, "some-domain.com") +      {:ok, _} = User.follow(user, blocked) + +      {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) + +      assert length(Notification.for_user(user)) == 1 +    end +      test "it doesn't return notifications for muted thread" do        user = insert(:user)        another_user = insert(:user) @@ -971,7 +1024,8 @@ defmodule Pleroma.NotificationTest do        assert Enum.empty?(Notification.for_user(user, %{with_muted: true}))      end -    test "it doesn't return notifications from a domain-blocked user when with_muted is set" do +    test "when with_muted is set, " <> +           "it doesn't return notifications from a domain-blocked non-followed user" do        user = insert(:user)        blocked = insert(:user, ap_id: "http://some-domain.com")        {:ok, user} = User.block_domain(user, "some-domain.com") diff --git a/test/support/captcha_mock.ex b/test/support/captcha_mock.ex index 6dae94edf..7b0c1d5af 100644 --- a/test/support/captcha_mock.ex +++ b/test/support/captcha_mock.ex @@ -6,12 +6,16 @@ defmodule Pleroma.Captcha.Mock do    alias Pleroma.Captcha.Service    @behaviour Service +  @solution "63615261b77f5354fb8c4e4986477555" + +  def solution, do: @solution +    @impl Service    def new,      do: %{        type: :mock,        token: "afa1815e14e29355e6c8f6b143a39fa2", -      answer_data: "63615261b77f5354fb8c4e4986477555", +      answer_data: @solution,        url: "https://example.org/captcha.png"      } diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 20cb2b3d1..9624cb0f7 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -308,6 +308,22 @@ defmodule HttpRequestMock do       }}    end +  def get("https://peertube.social/accounts/craigmaloney", _, _, _) do +    {:ok, +     %Tesla.Env{ +       status: 200, +       body: File.read!("test/fixtures/tesla_mock/craigmaloney.json") +     }} +  end + +  def get("https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", _, _, _) do +    {:ok, +     %Tesla.Env{ +       status: 200, +       body: File.read!("test/fixtures/tesla_mock/peertube-social.json") +     }} +  end +    def get("https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39", _, _, [          {"accept", "application/activity+json"}        ]) do diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index eca526604..6b5913f95 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -765,51 +765,87 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      end    end -  describe "POST /users/:nickname/outbox" do -    test "it rejects posts from other users / unauthenticated users", %{conn: conn} do -      data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!() +  describe "POST /users/:nickname/outbox (C2S)" do +    setup do +      [ +        activity: %{ +          "@context" => "https://www.w3.org/ns/activitystreams", +          "type" => "Create", +          "object" => %{"type" => "Note", "content" => "AP C2S test"}, +          "to" => "https://www.w3.org/ns/activitystreams#Public", +          "cc" => [] +        } +      ] +    end + +    test "it rejects posts from other users / unauthenticated users", %{ +      conn: conn, +      activity: activity +    } do        user = insert(:user)        other_user = insert(:user)        conn = put_req_header(conn, "content-type", "application/activity+json")        conn -      |> post("/users/#{user.nickname}/outbox", data) +      |> post("/users/#{user.nickname}/outbox", activity)        |> json_response(403)        conn        |> assign(:user, other_user) -      |> post("/users/#{user.nickname}/outbox", data) +      |> post("/users/#{user.nickname}/outbox", activity)        |> json_response(403)      end -    test "it inserts an incoming create activity into the database", %{conn: conn} do -      data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!() +    test "it inserts an incoming create activity into the database", %{ +      conn: conn, +      activity: activity +    } do        user = insert(:user) -      conn = +      result =          conn          |> assign(:user, user)          |> put_req_header("content-type", "application/activity+json") -        |> post("/users/#{user.nickname}/outbox", data) - -      result = json_response(conn, 201) +        |> post("/users/#{user.nickname}/outbox", activity) +        |> json_response(201)        assert Activity.get_by_ap_id(result["id"]) +      assert result["object"] +      assert %Object{data: object} = Object.normalize(result["object"]) +      assert object["content"] == activity["object"]["content"]      end -    test "it rejects an incoming activity with bogus type", %{conn: conn} do -      data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!() +    test "it inserts an incoming sensitive activity into the database", %{ +      conn: conn, +      activity: activity +    } do        user = insert(:user) +      object = Map.put(activity["object"], "sensitive", true) +      activity = Map.put(activity, "object", object) -      data = -        data -        |> Map.put("type", "BadType") +      result = +        conn +        |> assign(:user, user) +        |> put_req_header("content-type", "application/activity+json") +        |> post("/users/#{user.nickname}/outbox", activity) +        |> json_response(201) + +      assert Activity.get_by_ap_id(result["id"]) +      assert result["object"] +      assert %Object{data: object} = Object.normalize(result["object"]) +      assert object["sensitive"] == activity["object"]["sensitive"] +      assert object["content"] == activity["object"]["content"] +    end + +    test "it rejects an incoming activity with bogus type", %{conn: conn, activity: activity} do +      user = insert(:user) +      activity = Map.put(activity, "type", "BadType")        conn =          conn          |> assign(:user, user)          |> put_req_header("content-type", "application/activity+json") -        |> post("/users/#{user.nickname}/outbox", data) +        |> post("/users/#{user.nickname}/outbox", activity)        assert json_response(conn, 400)      end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 6057e360a..10d86ee45 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -1221,6 +1221,35 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        :error = Transmogrifier.handle_incoming(data)      end +    test "skip converting the content when it is nil" do +      object_id = "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe" + +      {:ok, object} = Fetcher.fetch_and_contain_remote_object_from_id(object_id) + +      result = +        Pleroma.Web.ActivityPub.Transmogrifier.fix_object(Map.merge(object, %{"content" => nil})) + +      assert result["content"] == nil +    end + +    test "it converts content of object to html" do +      object_id = "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe" + +      {:ok, %{"content" => content_markdown}} = +        Fetcher.fetch_and_contain_remote_object_from_id(object_id) + +      {:ok, %Pleroma.Object{data: %{"content" => content}} = object} = +        Fetcher.fetch_object_from_id(object_id) + +      assert content_markdown == +               "Support this and our other Michigan!/usr/group videos and meetings. Learn more at http://mug.org/membership\n\nTwenty Years in Jail: FreeBSD's Jails, Then and Now\n\nJails started as a limited virtualization system, but over the last two years they've..." + +      assert content == +               "<p>Support this and our other Michigan!/usr/group videos and meetings. Learn more at <a href=\"http://mug.org/membership\">http://mug.org/membership</a></p><p>Twenty Years in Jail: FreeBSD’s Jails, Then and Now</p><p>Jails started as a limited virtualization system, but over the last two years they’ve…</p>" + +      assert object.data["mediaType"] == "text/html" +    end +      test "it remaps video URLs as attachments if necessary" do        {:ok, object} =          Fetcher.fetch_object_from_id( diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index f80dbf8dd..1862a9589 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -1347,9 +1347,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        {:ok, %{id: report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        response = @@ -1374,16 +1374,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        {:ok, %{id: report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        {:ok, %{id: second_report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel very offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel very offended", +          status_ids: [activity.id]          })        %{ @@ -1523,9 +1523,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        {:ok, %{id: report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        response = @@ -1547,15 +1547,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        {:ok, %{id: first_report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        {:ok, %{id: second_report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I don't like this user" +          account_id: target_user.id, +          comment: "I don't like this user"          })        CommonAPI.update_report_state(second_report_id, "closed") @@ -3431,9 +3431,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        {:ok, %{id: report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ diff --git a/test/web/admin_api/views/report_view_test.exs b/test/web/admin_api/views/report_view_test.exs index 5db6629f2..8cfa1dcfa 100644 --- a/test/web/admin_api/views/report_view_test.exs +++ b/test/web/admin_api/views/report_view_test.exs @@ -15,7 +15,7 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, activity} = CommonAPI.report(user, %{"account_id" => other_user.id}) +    {:ok, activity} = CommonAPI.report(user, %{account_id: other_user.id})      expected = %{        content: nil, @@ -48,7 +48,7 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "toot"})      {:ok, report_activity} = -      CommonAPI.report(user, %{"account_id" => other_user.id, "status_ids" => [activity.id]}) +      CommonAPI.report(user, %{account_id: other_user.id, status_ids: [activity.id]})      other_user = Pleroma.User.get_by_id(other_user.id) @@ -81,7 +81,7 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, activity} = CommonAPI.report(user, %{"account_id" => other_user.id}) +    {:ok, activity} = CommonAPI.report(user, %{account_id: other_user.id})      {:ok, activity} = CommonAPI.update_report_state(activity.id, "closed")      assert %{state: "closed"} = @@ -94,8 +94,8 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do      {:ok, activity} =        CommonAPI.report(user, %{ -        "account_id" => other_user.id, -        "comment" => "posts are too good for this instance" +        account_id: other_user.id, +        comment: "posts are too good for this instance"        })      assert %{content: "posts are too good for this instance"} = @@ -108,8 +108,8 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do      {:ok, activity} =        CommonAPI.report(user, %{ -        "account_id" => other_user.id, -        "comment" => "" +        account_id: other_user.id, +        comment: ""        })      data = Map.put(activity.data, "content", "<script> alert('hecked :D:D:D:D:D:D:D') </script>") @@ -125,8 +125,8 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do      {:ok, activity} =        CommonAPI.report(user, %{ -        "account_id" => other_user.id, -        "comment" => "" +        account_id: other_user.id, +        comment: ""        })      Pleroma.User.delete(other_user) diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 1758662b0..c6ccc02c4 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -485,9 +485,9 @@ defmodule Pleroma.Web.CommonAPITest do        comment = "foobar"        report_data = %{ -        "account_id" => target_user.id, -        "comment" => comment, -        "status_ids" => [activity.id] +        account_id: target_user.id, +        comment: comment, +        status_ids: [activity.id]        }        note_obj = %{ @@ -517,9 +517,9 @@ defmodule Pleroma.Web.CommonAPITest do        {:ok, %Activity{id: report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        {:ok, report} = CommonAPI.update_report_state(report_id, "resolved") @@ -538,9 +538,9 @@ defmodule Pleroma.Web.CommonAPITest do        {:ok, %Activity{id: report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        assert CommonAPI.update_report_state(report_id, "test") == {:error, "Unsupported state"} @@ -552,16 +552,16 @@ defmodule Pleroma.Web.CommonAPITest do        {:ok, %Activity{id: first_report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel offended", +          status_ids: [activity.id]          })        {:ok, %Activity{id: second_report_id}} =          CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel very offended!", -          "status_ids" => [activity.id] +          account_id: target_user.id, +          comment: "I feel very offended!", +          status_ids: [activity.id]          })        {:ok, report_ids} = diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index ba70ba66c..b9da7e924 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -925,7 +925,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> Map.put(:remote_ip, {127, 0, 0, 5})          |> post("/api/v1/accounts", Map.delete(valid_params, :email)) -      assert json_response_and_validate_schema(res, 400) == %{"error" => "Missing parameters"} +      assert json_response_and_validate_schema(res, 400) == +               %{"error" => "Missing parameter: email"}        res =          conn @@ -1093,6 +1094,91 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end    end +  describe "create account with enabled captcha" do +    setup %{conn: conn} do +      app_token = insert(:oauth_token, user: nil) + +      conn = +        conn +        |> put_req_header("authorization", "Bearer " <> app_token.token) +        |> put_req_header("content-type", "multipart/form-data") + +      [conn: conn] +    end + +    setup do: clear_config([Pleroma.Captcha, :enabled], true) + +    test "creates an account and returns 200 if captcha is valid", %{conn: conn} do +      %{token: token, answer_data: answer_data} = Pleroma.Captcha.new() + +      params = %{ +        username: "lain", +        email: "lain@example.org", +        password: "PlzDontHackLain", +        agreement: true, +        captcha_solution: Pleroma.Captcha.Mock.solution(), +        captcha_token: token, +        captcha_answer_data: answer_data +      } + +      assert %{ +               "access_token" => access_token, +               "created_at" => _, +               "scope" => ["read"], +               "token_type" => "Bearer" +             } = +               conn +               |> post("/api/v1/accounts", params) +               |> json_response_and_validate_schema(:ok) + +      assert Token |> Repo.get_by(token: access_token) |> Repo.preload(:user) |> Map.get(:user) + +      Cachex.del(:used_captcha_cache, token) +    end + +    test "returns 400 if any captcha field is not provided", %{conn: conn} do +      captcha_fields = [:captcha_solution, :captcha_token, :captcha_answer_data] + +      valid_params = %{ +        username: "lain", +        email: "lain@example.org", +        password: "PlzDontHackLain", +        agreement: true, +        captcha_solution: "xx", +        captcha_token: "xx", +        captcha_answer_data: "xx" +      } + +      for field <- captcha_fields do +        expected = %{ +          "error" => "{\"captcha\":[\"Invalid CAPTCHA (Missing parameter: #{field})\"]}" +        } + +        assert expected == +                 conn +                 |> post("/api/v1/accounts", Map.delete(valid_params, field)) +                 |> json_response_and_validate_schema(:bad_request) +      end +    end + +    test "returns an error if captcha is invalid", %{conn: conn} do +      params = %{ +        username: "lain", +        email: "lain@example.org", +        password: "PlzDontHackLain", +        agreement: true, +        captcha_solution: "cofe", +        captcha_token: "cofe", +        captcha_answer_data: "cofe" +      } + +      assert %{"error" => "{\"captcha\":[\"Invalid answer data\"]}"} == +               conn +               |> post("/api/v1/accounts", params) +               |> json_response_and_validate_schema(:bad_request) +    end +  end +    describe "GET /api/v1/accounts/:id/lists - account_lists" do      test "returns lists to which the account belongs" do        %{user: user, conn: conn} = oauth_access(["read:lists"]) diff --git a/test/web/mastodon_api/controllers/report_controller_test.exs b/test/web/mastodon_api/controllers/report_controller_test.exs index 34ec8119e..21b037237 100644 --- a/test/web/mastodon_api/controllers/report_controller_test.exs +++ b/test/web/mastodon_api/controllers/report_controller_test.exs @@ -22,8 +22,9 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do    test "submit a basic report", %{conn: conn, target_user: target_user} do      assert %{"action_taken" => false, "id" => _} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"account_id" => target_user.id}) -             |> json_response(200) +             |> json_response_and_validate_schema(200)    end    test "submit a report with statuses and comment", %{ @@ -33,23 +34,25 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do    } do      assert %{"action_taken" => false, "id" => _} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{                 "account_id" => target_user.id,                 "status_ids" => [activity.id],                 "comment" => "bad status!",                 "forward" => "false"               }) -             |> json_response(200) +             |> json_response_and_validate_schema(200)    end    test "account_id is required", %{      conn: conn,      activity: activity    } do -    assert %{"error" => "Valid `account_id` required"} = +    assert %{"error" => "Missing field: account_id."} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"status_ids" => [activity.id]}) -             |> json_response(400) +             |> json_response_and_validate_schema(400)    end    test "comment must be up to the size specified in the config", %{ @@ -63,17 +66,21 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do      assert ^error =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"account_id" => target_user.id, "comment" => comment}) -             |> json_response(400) +             |> json_response_and_validate_schema(400)    end    test "returns error when account is not exist", %{      conn: conn,      activity: activity    } do -    conn = post(conn, "/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"}) +    conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"}) -    assert json_response(conn, 400) == %{"error" => "Account not found"} +    assert json_response_and_validate_schema(conn, 400) == %{"error" => "Account not found"}    end    test "doesn't fail if an admin has no email", %{conn: conn, target_user: target_user} do @@ -81,7 +88,8 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do      assert %{"action_taken" => false, "id" => _} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"account_id" => target_user.id}) -             |> json_response(200) +             |> json_response_and_validate_schema(200)    end  end diff --git a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs index 4246eb400..d343256fe 100644 --- a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs @@ -8,212 +8,298 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do    import Tesla.Mock    import Pleroma.Factory -  @emoji_dir_path Path.join( -                    Pleroma.Config.get!([:instance, :static_dir]), -                    "emoji" -                  ) +  @emoji_path Path.join( +                Pleroma.Config.get!([:instance, :static_dir]), +                "emoji" +              )    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) -  test "shared & non-shared pack information in list_packs is ok" do -    conn = build_conn() -    resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) - -    assert Map.has_key?(resp, "test_pack") +  setup do +    admin = insert(:user, is_admin: true) +    token = insert(:oauth_admin_token, user: admin) -    pack = resp["test_pack"] +    admin_conn = +      build_conn() +      |> assign(:user, admin) +      |> assign(:token, token) -    assert Map.has_key?(pack["pack"], "download-sha256") -    assert pack["pack"]["can-download"] +    Pleroma.Emoji.reload() +    {:ok, %{admin_conn: admin_conn}} +  end -    assert pack["files"] == %{"blank" => "blank.png"} +  test "GET /api/pleroma/emoji/packs", %{conn: conn} do +    resp = conn |> get("/api/pleroma/emoji/packs") |> json_response(200) -    # Non-shared pack +    shared = resp["test_pack"] +    assert shared["files"] == %{"blank" => "blank.png"} +    assert Map.has_key?(shared["pack"], "download-sha256") +    assert shared["pack"]["can-download"] +    assert shared["pack"]["share-files"] -    assert Map.has_key?(resp, "test_pack_nonshared") +    non_shared = resp["test_pack_nonshared"] +    assert non_shared["pack"]["share-files"] == false +    assert non_shared["pack"]["can-download"] == false +  end -    pack = resp["test_pack_nonshared"] +  describe "GET /api/pleroma/emoji/packs/remote" do +    test "shareable instance", %{admin_conn: admin_conn, conn: conn} do +      resp = +        conn +        |> get("/api/pleroma/emoji/packs") +        |> json_response(200) -    refute pack["pack"]["shared"] -    refute pack["pack"]["can-download"] -  end +      mock(fn +        %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> +          json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) -  test "listing remote packs" do -    conn = build_conn() +        %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> +          json(%{metadata: %{features: ["shareable_emoji_packs"]}}) -    resp = -      build_conn() -      |> get(emoji_api_path(conn, :list_packs)) -      |> json_response(200) +        %{method: :get, url: "https://example.com/api/pleroma/emoji/packs"} -> +          json(resp) +      end) -    mock(fn -      %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> -        json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) +      assert admin_conn +             |> get("/api/pleroma/emoji/packs/remote", %{ +               url: "https://example.com" +             }) +             |> json_response(200) == resp +    end -      %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> -        json(%{metadata: %{features: ["shareable_emoji_packs"]}}) +    test "non shareable instance", %{admin_conn: admin_conn} do +      mock(fn +        %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> +          json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) -      %{method: :get, url: "https://example.com/api/pleroma/emoji/packs"} -> -        json(resp) -    end) +        %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> +          json(%{metadata: %{features: []}}) +      end) -    assert conn -           |> post(emoji_api_path(conn, :list_from), %{instance_address: "https://example.com"}) -           |> json_response(200) == resp +      assert admin_conn +             |> get("/api/pleroma/emoji/packs/remote", %{url: "https://example.com"}) +             |> json_response(500) == %{ +               "error" => "The requested instance does not support sharing emoji packs" +             } +    end    end -  test "downloading a shared pack from download_shared" do -    conn = build_conn() +  describe "GET /api/pleroma/emoji/packs/:name/archive" do +    test "download shared pack", %{conn: conn} do +      resp = +        conn +        |> get("/api/pleroma/emoji/packs/test_pack/archive") +        |> response(200) + +      {:ok, arch} = :zip.unzip(resp, [:memory]) -    resp = -      conn -      |> get(emoji_api_path(conn, :download_shared, "test_pack")) -      |> response(200) +      assert Enum.find(arch, fn {n, _} -> n == 'pack.json' end) +      assert Enum.find(arch, fn {n, _} -> n == 'blank.png' end) +    end -    {:ok, arch} = :zip.unzip(resp, [:memory]) +    test "non existing pack", %{conn: conn} do +      assert conn +             |> get("/api/pleroma/emoji/packs/test_pack_for_import/archive") +             |> json_response(:not_found) == %{ +               "error" => "Pack test_pack_for_import does not exist" +             } +    end -    assert Enum.find(arch, fn {n, _} -> n == 'pack.json' end) -    assert Enum.find(arch, fn {n, _} -> n == 'blank.png' end) +    test "non downloadable pack", %{conn: conn} do +      assert conn +             |> get("/api/pleroma/emoji/packs/test_pack_nonshared/archive") +             |> json_response(:forbidden) == %{ +               "error" => +                 "Pack test_pack_nonshared cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing" +             } +    end    end -  test "downloading shared & unshared packs from another instance, deleting them" do -    on_exit(fn -> -      File.rm_rf!("#{@emoji_dir_path}/test_pack2") -      File.rm_rf!("#{@emoji_dir_path}/test_pack_nonshared2") -    end) +  describe "POST /api/pleroma/emoji/packs/download" do +    test "shared pack from remote and non shared from fallback-src", %{ +      admin_conn: admin_conn, +      conn: conn +    } do +      mock(fn +        %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> +          json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) -    mock(fn -      %{method: :get, url: "https://old-instance/.well-known/nodeinfo"} -> -        json(%{links: [%{href: "https://old-instance/nodeinfo/2.1.json"}]}) +        %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> +          json(%{metadata: %{features: ["shareable_emoji_packs"]}}) -      %{method: :get, url: "https://old-instance/nodeinfo/2.1.json"} -> -        json(%{metadata: %{features: []}}) +        %{ +          method: :get, +          url: "https://example.com/api/pleroma/emoji/packs/test_pack" +        } -> +          conn +          |> get("/api/pleroma/emoji/packs/test_pack") +          |> json_response(200) +          |> json() -      %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> -        json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) +        %{ +          method: :get, +          url: "https://example.com/api/pleroma/emoji/packs/test_pack/archive" +        } -> +          conn +          |> get("/api/pleroma/emoji/packs/test_pack/archive") +          |> response(200) +          |> text() -      %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> -        json(%{metadata: %{features: ["shareable_emoji_packs"]}}) +        %{ +          method: :get, +          url: "https://example.com/api/pleroma/emoji/packs/test_pack_nonshared" +        } -> +          conn +          |> get("/api/pleroma/emoji/packs/test_pack_nonshared") +          |> json_response(200) +          |> json() -      %{ -        method: :get, -        url: "https://example.com/api/pleroma/emoji/packs/list" -      } -> -        conn = build_conn() +        %{ +          method: :get, +          url: "https://nonshared-pack" +        } -> +          text(File.read!("#{@emoji_path}/test_pack_nonshared/nonshared.zip")) +      end) -        conn -        |> get(emoji_api_path(conn, :list_packs)) -        |> json_response(200) -        |> json() +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/download", %{ +               url: "https://example.com", +               name: "test_pack", +               as: "test_pack2" +             }) +             |> json_response(200) == "ok" -      %{ -        method: :get, -        url: "https://example.com/api/pleroma/emoji/packs/download_shared/test_pack" -      } -> -        conn = build_conn() +      assert File.exists?("#{@emoji_path}/test_pack2/pack.json") +      assert File.exists?("#{@emoji_path}/test_pack2/blank.png") -        conn -        |> get(emoji_api_path(conn, :download_shared, "test_pack")) -        |> response(200) -        |> text() +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/test_pack2") +             |> json_response(200) == "ok" -      %{ -        method: :get, -        url: "https://nonshared-pack" -      } -> -        text(File.read!("#{@emoji_dir_path}/test_pack_nonshared/nonshared.zip")) -    end) +      refute File.exists?("#{@emoji_path}/test_pack2") -    admin = insert(:user, is_admin: true) +      assert admin_conn +             |> post( +               "/api/pleroma/emoji/packs/download", +               %{ +                 url: "https://example.com", +                 name: "test_pack_nonshared", +                 as: "test_pack_nonshared2" +               } +             ) +             |> json_response(200) == "ok" -    conn = -      build_conn() -      |> assign(:user, admin) -      |> assign(:token, insert(:oauth_admin_token, user: admin, scopes: ["admin:write"])) - -    assert (conn -            |> put_req_header("content-type", "application/json") -            |> post( -              emoji_api_path( -                conn, -                :save_from -              ), -              %{ -                instance_address: "https://old-instance", -                pack_name: "test_pack", -                as: "test_pack2" -              } -              |> Jason.encode!() -            ) -            |> json_response(500))["error"] =~ "does not support" - -    assert conn -           |> put_req_header("content-type", "application/json") -           |> post( -             emoji_api_path( -               conn, -               :save_from -             ), -             %{ -               instance_address: "https://example.com", -               pack_name: "test_pack", -               as: "test_pack2" +      assert File.exists?("#{@emoji_path}/test_pack_nonshared2/pack.json") +      assert File.exists?("#{@emoji_path}/test_pack_nonshared2/blank.png") + +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/test_pack_nonshared2") +             |> json_response(200) == "ok" + +      refute File.exists?("#{@emoji_path}/test_pack_nonshared2") +    end + +    test "nonshareable instance", %{admin_conn: admin_conn} do +      mock(fn +        %{method: :get, url: "https://old-instance/.well-known/nodeinfo"} -> +          json(%{links: [%{href: "https://old-instance/nodeinfo/2.1.json"}]}) + +        %{method: :get, url: "https://old-instance/nodeinfo/2.1.json"} -> +          json(%{metadata: %{features: []}}) +      end) + +      assert admin_conn +             |> post( +               "/api/pleroma/emoji/packs/download", +               %{ +                 url: "https://old-instance", +                 name: "test_pack", +                 as: "test_pack2" +               } +             ) +             |> json_response(500) == %{ +               "error" => "The requested instance does not support sharing emoji packs"               } -             |> Jason.encode!() -           ) -           |> json_response(200) == "ok" - -    assert File.exists?("#{@emoji_dir_path}/test_pack2/pack.json") -    assert File.exists?("#{@emoji_dir_path}/test_pack2/blank.png") - -    assert conn -           |> delete(emoji_api_path(conn, :delete, "test_pack2")) -           |> json_response(200) == "ok" - -    refute File.exists?("#{@emoji_dir_path}/test_pack2") - -    # non-shared, downloaded from the fallback URL - -    assert conn -           |> put_req_header("content-type", "application/json") -           |> post( -             emoji_api_path( -               conn, -               :save_from -             ), -             %{ -               instance_address: "https://example.com", -               pack_name: "test_pack_nonshared", -               as: "test_pack_nonshared2" +    end + +    test "checksum fail", %{admin_conn: admin_conn} do +      mock(fn +        %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> +          json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) + +        %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> +          json(%{metadata: %{features: ["shareable_emoji_packs"]}}) + +        %{ +          method: :get, +          url: "https://example.com/api/pleroma/emoji/packs/pack_bad_sha" +        } -> +          %Tesla.Env{ +            status: 200, +            body: Pleroma.Emoji.Pack.load_pack("pack_bad_sha") |> Jason.encode!() +          } + +        %{ +          method: :get, +          url: "https://example.com/api/pleroma/emoji/packs/pack_bad_sha/archive" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip") +          } +      end) + +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/download", %{ +               url: "https://example.com", +               name: "pack_bad_sha", +               as: "pack_bad_sha2" +             }) +             |> json_response(:internal_server_error) == %{ +               "error" => "SHA256 for the pack doesn't match the one sent by the server"               } -             |> Jason.encode!() -           ) -           |> json_response(200) == "ok" +    end + +    test "other error", %{admin_conn: admin_conn} do +      mock(fn +        %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> +          json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) -    assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/pack.json") -    assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/blank.png") +        %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> +          json(%{metadata: %{features: ["shareable_emoji_packs"]}}) -    assert conn -           |> delete(emoji_api_path(conn, :delete, "test_pack_nonshared2")) -           |> json_response(200) == "ok" +        %{ +          method: :get, +          url: "https://example.com/api/pleroma/emoji/packs/test_pack" +        } -> +          %Tesla.Env{ +            status: 200, +            body: Pleroma.Emoji.Pack.load_pack("test_pack") |> Jason.encode!() +          } +      end) -    refute File.exists?("#{@emoji_dir_path}/test_pack_nonshared2") +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/download", %{ +               url: "https://example.com", +               name: "test_pack", +               as: "test_pack2" +             }) +             |> json_response(:internal_server_error) == %{ +               "error" => +                 "The pack was not set as shared and there is no fallback src to download from" +             } +    end    end -  describe "updating pack metadata" do +  describe "PATCH /api/pleroma/emoji/packs/:name" do      setup do -      pack_file = "#{@emoji_dir_path}/test_pack/pack.json" +      pack_file = "#{@emoji_path}/test_pack/pack.json"        original_content = File.read!(pack_file)        on_exit(fn ->          File.write!(pack_file, original_content)        end) -      admin = insert(:user, is_admin: true) -      %{conn: conn} = oauth_access(["admin:write"], user: admin) -        {:ok, -       admin: admin, -       conn: conn,         pack_file: pack_file,         new_data: %{           "license" => "Test license changed", @@ -224,15 +310,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do      end      test "for a pack without a fallback source", ctx do -      conn = ctx[:conn] - -      assert conn -             |> post( -               emoji_api_path(conn, :update_metadata, "test_pack"), -               %{ -                 "new_data" => ctx[:new_data] -               } -             ) +      assert ctx[:admin_conn] +             |> patch("/api/pleroma/emoji/packs/test_pack", %{"metadata" => ctx[:new_data]})               |> json_response(200) == ctx[:new_data]        assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == ctx[:new_data] @@ -244,7 +323,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do            method: :get,            url: "https://nonshared-pack"          } -> -          text(File.read!("#{@emoji_dir_path}/test_pack_nonshared/nonshared.zip")) +          text(File.read!("#{@emoji_path}/test_pack_nonshared/nonshared.zip"))        end)        new_data = Map.put(ctx[:new_data], "fallback-src", "https://nonshared-pack") @@ -256,15 +335,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do            "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF"          ) -      conn = ctx[:conn] - -      assert conn -             |> post( -               emoji_api_path(conn, :update_metadata, "test_pack"), -               %{ -                 "new_data" => new_data -               } -             ) +      assert ctx[:admin_conn] +             |> patch("/api/pleroma/emoji/packs/test_pack", %{metadata: new_data})               |> json_response(200) == new_data_with_sha        assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha @@ -282,181 +354,377 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do        new_data = Map.put(ctx[:new_data], "fallback-src", "https://nonshared-pack") -      conn = ctx[:conn] - -      assert (conn -              |> post( -                emoji_api_path(conn, :update_metadata, "test_pack"), -                %{ -                  "new_data" => new_data -                } -              ) -              |> json_response(:bad_request))["error"] =~ "does not have all" +      assert ctx[:admin_conn] +             |> patch("/api/pleroma/emoji/packs/test_pack", %{metadata: new_data}) +             |> json_response(:bad_request) == %{ +               "error" => "The fallback archive does not have all files specified in pack.json" +             }      end    end -  test "updating pack files" do -    pack_file = "#{@emoji_dir_path}/test_pack/pack.json" -    original_content = File.read!(pack_file) +  describe "POST/PATCH/DELETE /api/pleroma/emoji/packs/:name/files" do +    setup do +      pack_file = "#{@emoji_path}/test_pack/pack.json" +      original_content = File.read!(pack_file) -    on_exit(fn -> -      File.write!(pack_file, original_content) +      on_exit(fn -> +        File.write!(pack_file, original_content) +      end) -      File.rm_rf!("#{@emoji_dir_path}/test_pack/blank_url.png") -      File.rm_rf!("#{@emoji_dir_path}/test_pack/dir") -      File.rm_rf!("#{@emoji_dir_path}/test_pack/dir_2") -    end) +      :ok +    end -    admin = insert(:user, is_admin: true) -    %{conn: conn} = oauth_access(["admin:write"], user: admin) - -    same_name = %{ -      "action" => "add", -      "shortcode" => "blank", -      "filename" => "dir/blank.png", -      "file" => %Plug.Upload{ -        filename: "blank.png", -        path: "#{@emoji_dir_path}/test_pack/blank.png" -      } -    } - -    different_name = %{same_name | "shortcode" => "blank_2"} - -    assert (conn -            |> post(emoji_api_path(conn, :update_file, "test_pack"), same_name) -            |> json_response(:conflict))["error"] =~ "already exists" - -    assert conn -           |> post(emoji_api_path(conn, :update_file, "test_pack"), different_name) -           |> json_response(200) == %{"blank" => "blank.png", "blank_2" => "dir/blank.png"} - -    assert File.exists?("#{@emoji_dir_path}/test_pack/dir/blank.png") - -    assert conn -           |> post(emoji_api_path(conn, :update_file, "test_pack"), %{ -             "action" => "update", -             "shortcode" => "blank_2", -             "new_shortcode" => "blank_3", -             "new_filename" => "dir_2/blank_3.png" -           }) -           |> json_response(200) == %{"blank" => "blank.png", "blank_3" => "dir_2/blank_3.png"} - -    refute File.exists?("#{@emoji_dir_path}/test_pack/dir/") -    assert File.exists?("#{@emoji_dir_path}/test_pack/dir_2/blank_3.png") - -    assert conn -           |> post(emoji_api_path(conn, :update_file, "test_pack"), %{ -             "action" => "remove", -             "shortcode" => "blank_3" -           }) -           |> json_response(200) == %{"blank" => "blank.png"} - -    refute File.exists?("#{@emoji_dir_path}/test_pack/dir_2/") - -    mock(fn -      %{ -        method: :get, -        url: "https://test-blank/blank_url.png" -      } -> -        text(File.read!("#{@emoji_dir_path}/test_pack/blank.png")) -    end) +    test "create shortcode exists", %{admin_conn: admin_conn} do +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank", +               filename: "dir/blank.png", +               file: %Plug.Upload{ +                 filename: "blank.png", +                 path: "#{@emoji_path}/test_pack/blank.png" +               } +             }) +             |> json_response(:conflict) == %{ +               "error" => "An emoji with the \"blank\" shortcode already exists" +             } +    end -    # The name should be inferred from the URL ending -    from_url = %{ -      "action" => "add", -      "shortcode" => "blank_url", -      "file" => "https://test-blank/blank_url.png" -    } +    test "don't rewrite old emoji", %{admin_conn: admin_conn} do +      on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/dir/") end) -    assert conn -           |> post(emoji_api_path(conn, :update_file, "test_pack"), from_url) -           |> json_response(200) == %{ -             "blank" => "blank.png", -             "blank_url" => "blank_url.png" -           } +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank2", +               filename: "dir/blank.png", +               file: %Plug.Upload{ +                 filename: "blank.png", +                 path: "#{@emoji_path}/test_pack/blank.png" +               } +             }) +             |> json_response(200) == %{"blank" => "blank.png", "blank2" => "dir/blank.png"} + +      assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") + +      assert admin_conn +             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank", +               new_shortcode: "blank2", +               new_filename: "dir_2/blank_3.png" +             }) +             |> json_response(:conflict) == %{ +               "error" => +                 "New shortcode \"blank2\" is already used. If you want to override emoji use 'force' option" +             } +    end + +    test "rewrite old emoji with force option", %{admin_conn: admin_conn} do +      on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/dir_2/") end) + +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank2", +               filename: "dir/blank.png", +               file: %Plug.Upload{ +                 filename: "blank.png", +                 path: "#{@emoji_path}/test_pack/blank.png" +               } +             }) +             |> json_response(200) == %{"blank" => "blank.png", "blank2" => "dir/blank.png"} + +      assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") + +      assert admin_conn +             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank2", +               new_shortcode: "blank3", +               new_filename: "dir_2/blank_3.png", +               force: true +             }) +             |> json_response(200) == %{ +               "blank" => "blank.png", +               "blank3" => "dir_2/blank_3.png" +             } + +      assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") +    end + +    test "with empty filename", %{admin_conn: admin_conn} do +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank2", +               filename: "", +               file: %Plug.Upload{ +                 filename: "blank.png", +                 path: "#{@emoji_path}/test_pack/blank.png" +               } +             }) +             |> json_response(:bad_request) == %{ +               "error" => "pack name, shortcode or filename cannot be empty" +             } +    end + +    test "add file with not loaded pack", %{admin_conn: admin_conn} do +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/not_loaded/files", %{ +               shortcode: "blank2", +               filename: "dir/blank.png", +               file: %Plug.Upload{ +                 filename: "blank.png", +                 path: "#{@emoji_path}/test_pack/blank.png" +               } +             }) +             |> json_response(:bad_request) == %{ +               "error" => "pack \"not_loaded\" is not found" +             } +    end + +    test "remove file with not loaded pack", %{admin_conn: admin_conn} do +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/not_loaded/files", %{shortcode: "blank3"}) +             |> json_response(:bad_request) == %{"error" => "pack \"not_loaded\" is not found"} +    end + +    test "remove file with empty shortcode", %{admin_conn: admin_conn} do +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/not_loaded/files", %{shortcode: ""}) +             |> json_response(:bad_request) == %{ +               "error" => "pack name or shortcode cannot be empty" +             } +    end + +    test "update file with not loaded pack", %{admin_conn: admin_conn} do +      assert admin_conn +             |> patch("/api/pleroma/emoji/packs/not_loaded/files", %{ +               shortcode: "blank4", +               new_shortcode: "blank3", +               new_filename: "dir_2/blank_3.png" +             }) +             |> json_response(:bad_request) == %{"error" => "pack \"not_loaded\" is not found"} +    end + +    test "new with shortcode as file with update", %{admin_conn: admin_conn} do +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank4", +               filename: "dir/blank.png", +               file: %Plug.Upload{ +                 filename: "blank.png", +                 path: "#{@emoji_path}/test_pack/blank.png" +               } +             }) +             |> json_response(200) == %{"blank" => "blank.png", "blank4" => "dir/blank.png"} + +      assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") + +      assert admin_conn +             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank4", +               new_shortcode: "blank3", +               new_filename: "dir_2/blank_3.png" +             }) +             |> json_response(200) == %{"blank3" => "dir_2/blank_3.png", "blank" => "blank.png"} + +      refute File.exists?("#{@emoji_path}/test_pack/dir/") +      assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") -    assert File.exists?("#{@emoji_dir_path}/test_pack/blank_url.png") +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/test_pack/files", %{shortcode: "blank3"}) +             |> json_response(200) == %{"blank" => "blank.png"} -    assert conn -           |> post(emoji_api_path(conn, :update_file, "test_pack"), %{ -             "action" => "remove", -             "shortcode" => "blank_url" -           }) -           |> json_response(200) == %{"blank" => "blank.png"} +      refute File.exists?("#{@emoji_path}/test_pack/dir_2/") -    refute File.exists?("#{@emoji_dir_path}/test_pack/blank_url.png") +      on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/dir") end) +    end + +    test "new with shortcode from url", %{admin_conn: admin_conn} do +      mock(fn +        %{ +          method: :get, +          url: "https://test-blank/blank_url.png" +        } -> +          text(File.read!("#{@emoji_path}/test_pack/blank.png")) +      end) + +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank_url", +               file: "https://test-blank/blank_url.png" +             }) +             |> json_response(200) == %{ +               "blank_url" => "blank_url.png", +               "blank" => "blank.png" +             } + +      assert File.exists?("#{@emoji_path}/test_pack/blank_url.png") + +      on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/blank_url.png") end) +    end + +    test "new without shortcode", %{admin_conn: admin_conn} do +      on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/shortcode.png") end) + +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +               file: %Plug.Upload{ +                 filename: "shortcode.png", +                 path: "#{Pleroma.Config.get([:instance, :static_dir])}/add/shortcode.png" +               } +             }) +             |> json_response(200) == %{"shortcode" => "shortcode.png", "blank" => "blank.png"} +    end + +    test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/test_pack/files", %{shortcode: "blank2"}) +             |> json_response(:bad_request) == %{"error" => "Emoji \"blank2\" does not exist"} +    end + +    test "update non existing emoji", %{admin_conn: admin_conn} do +      assert admin_conn +             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank2", +               new_shortcode: "blank3", +               new_filename: "dir_2/blank_3.png" +             }) +             |> json_response(:bad_request) == %{"error" => "Emoji \"blank2\" does not exist"} +    end + +    test "update with empty shortcode", %{admin_conn: admin_conn} do +      assert admin_conn +             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +               shortcode: "blank", +               new_filename: "dir_2/blank_3.png" +             }) +             |> json_response(:bad_request) == %{ +               "error" => "new_shortcode or new_filename cannot be empty" +             } +    end    end -  test "creating and deleting a pack" do -    on_exit(fn -> -      File.rm_rf!("#{@emoji_dir_path}/test_created") -    end) +  describe "POST/DELETE /api/pleroma/emoji/packs/:name" do +    test "creating and deleting a pack", %{admin_conn: admin_conn} do +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_created") +             |> json_response(200) == "ok" -    admin = insert(:user, is_admin: true) -    %{conn: conn} = oauth_access(["admin:write"], user: admin) - -    assert conn -           |> put_req_header("content-type", "application/json") -           |> put( -             emoji_api_path( -               conn, -               :create, -               "test_created" -             ) -           ) -           |> json_response(200) == "ok" +      assert File.exists?("#{@emoji_path}/test_created/pack.json") + +      assert Jason.decode!(File.read!("#{@emoji_path}/test_created/pack.json")) == %{ +               "pack" => %{}, +               "files" => %{} +             } -    assert File.exists?("#{@emoji_dir_path}/test_created/pack.json") +      assert admin_conn +             |> delete("/api/pleroma/emoji/packs/test_created") +             |> json_response(200) == "ok" -    assert Jason.decode!(File.read!("#{@emoji_dir_path}/test_created/pack.json")) == %{ -             "pack" => %{}, -             "files" => %{} -           } +      refute File.exists?("#{@emoji_path}/test_created/pack.json") +    end + +    test "if pack exists", %{admin_conn: admin_conn} do +      path = Path.join(@emoji_path, "test_created") +      File.mkdir(path) +      pack_file = Jason.encode!(%{files: %{}, pack: %{}}) +      File.write!(Path.join(path, "pack.json"), pack_file) + +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/test_created") +             |> json_response(:conflict) == %{ +               "error" => "A pack named \"test_created\" already exists" +             } + +      on_exit(fn -> File.rm_rf(path) end) +    end + +    test "with empty name", %{admin_conn: admin_conn} do +      assert admin_conn +             |> post("/api/pleroma/emoji/packs/ ") +             |> json_response(:bad_request) == %{"error" => "pack name cannot be empty"} +    end +  end -    assert conn -           |> delete(emoji_api_path(conn, :delete, "test_created")) -           |> json_response(200) == "ok" +  test "deleting nonexisting pack", %{admin_conn: admin_conn} do +    assert admin_conn +           |> delete("/api/pleroma/emoji/packs/non_existing") +           |> json_response(:not_found) == %{"error" => "Pack non_existing does not exist"} +  end -    refute File.exists?("#{@emoji_dir_path}/test_created/pack.json") +  test "deleting with empty name", %{admin_conn: admin_conn} do +    assert admin_conn +           |> delete("/api/pleroma/emoji/packs/ ") +           |> json_response(:bad_request) == %{"error" => "pack name cannot be empty"}    end -  test "filesystem import" do +  test "filesystem import", %{admin_conn: admin_conn, conn: conn} do      on_exit(fn -> -      File.rm!("#{@emoji_dir_path}/test_pack_for_import/emoji.txt") -      File.rm!("#{@emoji_dir_path}/test_pack_for_import/pack.json") +      File.rm!("#{@emoji_path}/test_pack_for_import/emoji.txt") +      File.rm!("#{@emoji_path}/test_pack_for_import/pack.json")      end) -    conn = build_conn() -    resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) +    resp = conn |> get("/api/pleroma/emoji/packs") |> json_response(200)      refute Map.has_key?(resp, "test_pack_for_import") -    admin = insert(:user, is_admin: true) -    %{conn: conn} = oauth_access(["admin:write"], user: admin) - -    assert conn -           |> post(emoji_api_path(conn, :import_from_fs)) +    assert admin_conn +           |> get("/api/pleroma/emoji/packs/import")             |> json_response(200) == ["test_pack_for_import"] -    resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) +    resp = conn |> get("/api/pleroma/emoji/packs") |> json_response(200)      assert resp["test_pack_for_import"]["files"] == %{"blank" => "blank.png"} -    File.rm!("#{@emoji_dir_path}/test_pack_for_import/pack.json") -    refute File.exists?("#{@emoji_dir_path}/test_pack_for_import/pack.json") +    File.rm!("#{@emoji_path}/test_pack_for_import/pack.json") +    refute File.exists?("#{@emoji_path}/test_pack_for_import/pack.json") -    emoji_txt_content = "blank, blank.png, Fun\n\nblank2, blank.png" +    emoji_txt_content = """ +    blank, blank.png, Fun +    blank2, blank.png +    foo, /emoji/test_pack_for_import/blank.png +    bar +    """ -    File.write!("#{@emoji_dir_path}/test_pack_for_import/emoji.txt", emoji_txt_content) +    File.write!("#{@emoji_path}/test_pack_for_import/emoji.txt", emoji_txt_content) -    assert conn -           |> post(emoji_api_path(conn, :import_from_fs)) +    assert admin_conn +           |> get("/api/pleroma/emoji/packs/import")             |> json_response(200) == ["test_pack_for_import"] -    resp = build_conn() |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) +    resp = conn |> get("/api/pleroma/emoji/packs") |> json_response(200)      assert resp["test_pack_for_import"]["files"] == %{               "blank" => "blank.png", -             "blank2" => "blank.png" +             "blank2" => "blank.png", +             "foo" => "blank.png"             }    end + +  describe "GET /api/pleroma/emoji/packs/:name" do +    test "shows pack.json", %{conn: conn} do +      assert %{ +               "files" => %{"blank" => "blank.png"}, +               "pack" => %{ +                 "can-download" => true, +                 "description" => "Test description", +                 "download-sha256" => _, +                 "homepage" => "https://pleroma.social", +                 "license" => "Test license", +                 "share-files" => true +               } +             } = +               conn +               |> get("/api/pleroma/emoji/packs/test_pack") +               |> json_response(200) +    end + +    test "non existing pack", %{conn: conn} do +      assert conn +             |> get("/api/pleroma/emoji/packs/non_existing") +             |> json_response(:not_found) == %{"error" => "Pack non_existing does not exist"} +    end + +    test "error name", %{conn: conn} do +      assert conn +             |> get("/api/pleroma/emoji/packs/ ") +             |> json_response(:bad_request) == %{"error" => "pack name cannot be empty"} +    end +  end  end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 7926a0757..368533292 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -18,7 +18,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it registers a new user and returns the user." do      data = %{ -      :nickname => "lain", +      :username => "lain",        :email => "lain@wired.jp",        :fullname => "lain iwakura",        :password => "bear", @@ -35,7 +35,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it registers a new user with empty string in bio and returns the user." do      data = %{ -      :nickname => "lain", +      :username => "lain",        :email => "lain@wired.jp",        :fullname => "lain iwakura",        :bio => "", @@ -60,7 +60,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      end      data = %{ -      :nickname => "lain", +      :username => "lain",        :email => "lain@wired.jp",        :fullname => "lain iwakura",        :bio => "", @@ -87,7 +87,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it registers a new user and parses mentions in the bio" do      data1 = %{ -      :nickname => "john", +      :username => "john",        :email => "john@gmail.com",        :fullname => "John Doe",        :bio => "test", @@ -98,7 +98,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user1} = TwitterAPI.register_user(data1)      data2 = %{ -      :nickname => "lain", +      :username => "lain",        :email => "lain@wired.jp",        :fullname => "lain iwakura",        :bio => "@john test", @@ -123,7 +123,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:ok, invite} = UserInviteToken.create_invite()        data = %{ -        :nickname => "vinny", +        :username => "vinny",          :email => "pasta@pizza.vs",          :fullname => "Vinny Vinesauce",          :bio => "streamer", @@ -145,7 +145,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      test "returns error on invalid token" do        data = %{ -        :nickname => "GrimReaper", +        :username => "GrimReaper",          :email => "death@reapers.afterlife",          :fullname => "Reaper Grim",          :bio => "Your time has come", @@ -165,7 +165,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        UserInviteToken.update_invite!(invite, used: true)        data = %{ -        :nickname => "GrimReaper", +        :username => "GrimReaper",          :email => "death@reapers.afterlife",          :fullname => "Reaper Grim",          :bio => "Your time has come", @@ -186,7 +186,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      setup do        data = %{ -        :nickname => "vinny", +        :username => "vinny",          :email => "pasta@pizza.vs",          :fullname => "Vinny Vinesauce",          :bio => "streamer", @@ -250,7 +250,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        UserInviteToken.update_invite!(invite, uses: 99)        data = %{ -        :nickname => "vinny", +        :username => "vinny",          :email => "pasta@pizza.vs",          :fullname => "Vinny Vinesauce",          :bio => "streamer", @@ -269,7 +269,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do                 AccountView.render("show.json", %{user: fetched_user})        data = %{ -        :nickname => "GrimReaper", +        :username => "GrimReaper",          :email => "death@reapers.afterlife",          :fullname => "Reaper Grim",          :bio => "Your time has come", @@ -292,7 +292,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100})        data = %{ -        :nickname => "vinny", +        :username => "vinny",          :email => "pasta@pizza.vs",          :fullname => "Vinny Vinesauce",          :bio => "streamer", @@ -317,7 +317,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        UserInviteToken.update_invite!(invite, uses: 99)        data = %{ -        :nickname => "vinny", +        :username => "vinny",          :email => "pasta@pizza.vs",          :fullname => "Vinny Vinesauce",          :bio => "streamer", @@ -335,7 +335,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do                 AccountView.render("show.json", %{user: fetched_user})        data = %{ -        :nickname => "GrimReaper", +        :username => "GrimReaper",          :email => "death@reapers.afterlife",          :fullname => "Reaper Grim",          :bio => "Your time has come", @@ -355,7 +355,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do          UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100})        data = %{ -        :nickname => "GrimReaper", +        :username => "GrimReaper",          :email => "death@reapers.afterlife",          :fullname => "Reaper Grim",          :bio => "Your time has come", @@ -377,7 +377,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        UserInviteToken.update_invite!(invite, uses: 100)        data = %{ -        :nickname => "GrimReaper", +        :username => "GrimReaper",          :email => "death@reapers.afterlife",          :fullname => "Reaper Grim",          :bio => "Your time has come", @@ -395,16 +395,15 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it returns the error on registration problems" do      data = %{ -      :nickname => "lain", +      :username => "lain",        :email => "lain@wired.jp",        :fullname => "lain iwakura", -      :bio => "close the world.", -      :password => "bear" +      :bio => "close the world."      } -    {:error, error_object} = TwitterAPI.register_user(data) +    {:error, error} = TwitterAPI.register_user(data) -    assert is_binary(error_object[:error]) +    assert is_binary(error)      refute User.get_cached_by_nickname("lain")    end | 
