diff options
| author | Haelwenn <contact+git.pleroma.social@hacktivis.me> | 2023-03-16 08:00:00 +0000 | 
|---|---|---|
| committer | Haelwenn <contact+git.pleroma.social@hacktivis.me> | 2023-03-16 08:00:00 +0000 | 
| commit | 353538d16c40b7d845c3ca4a710ab525ff88734a (patch) | |
| tree | 69034c8227ef0c7ba598f1f93c977cbd0512225c /test | |
| parent | c3600b6104a5ec0dc1cc5674758df6b7f4aee881 (diff) | |
| parent | 2c2ea16b50a7b77b1d3f58722e45720dcf3c51b9 (diff) | |
| download | pleroma-353538d16c40b7d845c3ca4a710ab525ff88734a.tar.gz pleroma-353538d16c40b7d845c3ca4a710ab525ff88734a.zip | |
Merge branch 'pleroma-akkoma-emoji-port' into 'develop'
Custom emoji reactions support
See merge request pleroma/pleroma!3845
Diffstat (limited to 'test')
7 files changed, 363 insertions, 23 deletions
| diff --git a/test/fixtures/custom-emoji-reaction.json b/test/fixtures/custom-emoji-reaction.json new file mode 100644 index 000000000..003de0511 --- /dev/null +++ b/test/fixtures/custom-emoji-reaction.json @@ -0,0 +1,28 @@ +{ +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "Hashtag": "as:Hashtag" +    } +  ], +  "type": "Like", +  "id": "https://misskey.local.live/likes/917ocsybgp", +  "actor": "https://misskey.local.live/users/8x8yep20u2", +  "object": "https://pleroma.local.live/objects/89937a53-2692-4631-bb62-770091267391", +  "content": ":hanapog:", +  "_misskey_reaction": ":hanapog:", +  "tag": [ +    { +      "id": "https://misskey.local.live/emojis/hanapog", +      "type": "Emoji", +      "name": ":hanapog:", +      "updated": "2022-06-07T12:00:05.773Z", +      "icon": { +        "type": "Image", +        "mediaType": "image/png", +        "url": "https://misskey.local.live/files/webpublic-8f8a9768-7264-4171-88d6-2356aabeadcd" +      } +    } +  ] +} diff --git a/test/pleroma/web/activity_pub/object_validators/emoji_react_handling_test.exs b/test/pleroma/web/activity_pub/object_validators/emoji_react_handling_test.exs index bbdb09c4c..9bb291a38 100644 --- a/test/pleroma/web/activity_pub/object_validators/emoji_react_handling_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/emoji_react_handling_test.exs @@ -38,16 +38,70 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactHandlingTest do        assert {:content, {"can't be blank", [validation: :required]}} in cng.errors      end -    test "it is not valid with a non-emoji content field", %{valid_emoji_react: valid_emoji_react} do +    test "it is valid when custom emoji is used", %{valid_emoji_react: valid_emoji_react} do        without_emoji_content =          valid_emoji_react -        |> Map.put("content", "x") +        |> Map.put("content", ":hello:") +        |> Map.put("tag", [ +          %{ +            "type" => "Emoji", +            "name" => ":hello:", +            "icon" => %{"url" => "http://somewhere", "type" => "Image"} +          } +        ]) + +      {:ok, _, _} = ObjectValidator.validate(without_emoji_content, []) +    end + +    test "it is not valid when custom emoji don't have a matching tag", %{ +      valid_emoji_react: valid_emoji_react +    } do +      without_emoji_content = +        valid_emoji_react +        |> Map.put("content", ":hello:") +        |> Map.put("tag", [ +          %{ +            "type" => "Emoji", +            "name" => ":whoops:", +            "icon" => %{"url" => "http://somewhere", "type" => "Image"} +          } +        ]) + +      {:error, cng} = ObjectValidator.validate(without_emoji_content, []) + +      refute cng.valid? + +      assert {:tag, {"does not contain an Emoji tag", []}} in cng.errors +    end + +    test "it is not valid when custom emoji have no tags", %{ +      valid_emoji_react: valid_emoji_react +    } do +      without_emoji_content = +        valid_emoji_react +        |> Map.put("content", ":hello:") +        |> Map.put("tag", []) + +      {:error, cng} = ObjectValidator.validate(without_emoji_content, []) + +      refute cng.valid? + +      assert {:tag, {"does not contain an Emoji tag", []}} in cng.errors +    end + +    test "it is not valid when custom emoji doesn't match a shortcode format", %{ +      valid_emoji_react: valid_emoji_react +    } do +      without_emoji_content = +        valid_emoji_react +        |> Map.put("content", "hello") +        |> Map.put("tag", [])        {:error, cng} = ObjectValidator.validate(without_emoji_content, [])        refute cng.valid? -      assert {:content, {"must be a single character emoji", []}} in cng.errors +      assert {:tag, {"does not contain an Emoji tag", []}} in cng.errors      end    end  end diff --git a/test/pleroma/web/activity_pub/side_effects_test.exs b/test/pleroma/web/activity_pub/side_effects_test.exs index b24831e85..6820e23d0 100644 --- a/test/pleroma/web/activity_pub/side_effects_test.exs +++ b/test/pleroma/web/activity_pub/side_effects_test.exs @@ -453,7 +453,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do        object = Object.get_by_ap_id(emoji_react.data["object"])        assert object.data["reaction_count"] == 1 -      assert ["👌", [user.ap_id]] in object.data["reactions"] +      assert ["👌", [user.ap_id], nil] in object.data["reactions"]      end      test "creates a notification", %{emoji_react: emoji_react, poster: poster} do diff --git a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs index 83bf59c6f..f2e1cefa3 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs @@ -34,7 +34,56 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.EmojiReactHandlingTest do      object = Object.get_by_ap_id(data["object"])      assert object.data["reaction_count"] == 1 -    assert match?([["👌", _]], object.data["reactions"]) +    assert match?([["👌", _, nil]], object.data["reactions"]) +  end + +  test "it works for incoming custom emoji reactions" do +    user = insert(:user) +    other_user = insert(:user, local: false) +    {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + +    data = +      File.read!("test/fixtures/custom-emoji-reaction.json") +      |> Jason.decode!() +      |> Map.put("object", activity.data["object"]) +      |> Map.put("actor", other_user.ap_id) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    assert data["actor"] == other_user.ap_id +    assert data["type"] == "EmojiReact" +    assert data["id"] == "https://misskey.local.live/likes/917ocsybgp" +    assert data["object"] == activity.data["object"] +    assert data["content"] == ":hanapog:" + +    assert data["tag"] == [ +             %{ +               "id" => "https://misskey.local.live/emojis/hanapog", +               "type" => "Emoji", +               "name" => "hanapog", +               "updated" => "2022-06-07T12:00:05.773Z", +               "icon" => %{ +                 "type" => "Image", +                 "url" => +                   "https://misskey.local.live/files/webpublic-8f8a9768-7264-4171-88d6-2356aabeadcd" +               } +             } +           ] + +    object = Object.get_by_ap_id(data["object"]) + +    assert object.data["reaction_count"] == 1 + +    assert match?( +             [ +               [ +                 "hanapog", +                 _, +                 "https://misskey.local.live/files/webpublic-8f8a9768-7264-4171-88d6-2356aabeadcd" +               ] +             ], +             object.data["reactions"] +           )    end    test "it works for incoming unqualified emoji reactions" do @@ -65,7 +114,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.EmojiReactHandlingTest do      object = Object.get_by_ap_id(data["object"])      assert object.data["reaction_count"] == 1 -    assert match?([[^emoji, _]], object.data["reactions"]) +    assert match?([[^emoji, _, _]], object.data["reactions"])    end    test "it reject invalid emoji reactions" do diff --git a/test/pleroma/web/mastodon_api/views/notification_view_test.exs b/test/pleroma/web/mastodon_api/views/notification_view_test.exs index 6ea894691..ddbe4557f 100644 --- a/test/pleroma/web/mastodon_api/views/notification_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/notification_view_test.exs @@ -190,7 +190,47 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        emoji: "☕",        account: AccountView.render("show.json", %{user: other_user, for: user}),        status: StatusView.render("show.json", %{activity: activity, for: user}), -      created_at: Utils.to_masto_date(notification.inserted_at) +      created_at: Utils.to_masto_date(notification.inserted_at), +      emoji_url: nil +    } + +    test_notifications_rendering([notification], user, [expected]) +  end + +  test "EmojiReact custom emoji notification" do +    user = insert(:user) +    other_user = insert(:user) + +    note = +      insert(:note, +        user: user, +        data: %{ +          "reactions" => [ +            ["👍", [user.ap_id], nil], +            ["dinosaur", [user.ap_id], "http://localhost:4001/emoji/dino walking.gif"] +          ] +        } +      ) + +    activity = insert(:note_activity, note: note, user: user) + +    {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, "dinosaur") + +    activity = Repo.get(Activity, activity.id) + +    [notification] = Notification.for_user(user) + +    assert notification + +    expected = %{ +      id: to_string(notification.id), +      pleroma: %{is_seen: false, is_muted: false}, +      type: "pleroma:emoji_reaction", +      emoji: ":dinosaur:", +      account: AccountView.render("show.json", %{user: other_user, for: user}), +      status: StatusView.render("show.json", %{activity: activity, for: user}), +      created_at: Utils.to_masto_date(notification.inserted_at), +      emoji_url: "http://localhost:4001/emoji/dino walking.gif"      }      test_notifications_rendering([notification], user, [expected]) diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs index f76b115b7..a1f3e3e1d 100644 --- a/test/pleroma/web/mastodon_api/views/status_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs @@ -35,16 +35,26 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      {:ok, activity} = CommonAPI.post(user, %{status: "dae cofe??"})      {:ok, _} = CommonAPI.react_with_emoji(activity.id, user, "☕") +    {:ok, _} = CommonAPI.react_with_emoji(activity.id, user, ":dinosaur:")      {:ok, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵")      {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") +    {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, ":dinosaur:") +      activity = Repo.get(Activity, activity.id)      status = StatusView.render("show.json", activity: activity)      assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec())      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 2, me: false}, -             %{name: "🍵", count: 1, me: false} +             %{name: "☕", count: 2, me: false, url: nil, account_ids: [other_user.id, user.id]}, +             %{ +               count: 2, +               me: false, +               name: "dinosaur", +               url: "http://localhost:4001/emoji/dino walking.gif", +               account_ids: [other_user.id, user.id] +             }, +             %{name: "🍵", count: 1, me: false, url: nil, account_ids: [third_user.id]}             ]      status = StatusView.render("show.json", activity: activity, for: user) @@ -52,8 +62,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec())      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 2, me: true}, -             %{name: "🍵", count: 1, me: false} +             %{name: "☕", count: 2, me: true, url: nil, account_ids: [other_user.id, user.id]}, +             %{ +               count: 2, +               me: true, +               name: "dinosaur", +               url: "http://localhost:4001/emoji/dino walking.gif", +               account_ids: [other_user.id, user.id] +             }, +             %{name: "🍵", count: 1, me: false, url: nil, account_ids: [third_user.id]}             ]    end @@ -66,11 +83,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      |> Object.update_data(%{"reactions" => %{"☕" => [user.ap_id], "x" => 1}})      activity = Activity.get_by_id(activity.id) -      status = StatusView.render("show.json", activity: activity, for: user)      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 1, me: true} +             %{name: "☕", count: 1, me: true, url: nil, account_ids: [user.id]}             ]    end @@ -90,7 +106,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("show.json", activity: activity)      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 1, me: false} +             %{name: "☕", count: 1, me: false, url: nil, account_ids: [other_user.id]}             ]      status = StatusView.render("show.json", activity: activity, for: user) @@ -102,19 +118,25 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("show.json", activity: activity)      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 2, me: false} +             %{ +               name: "☕", +               count: 2, +               me: false, +               url: nil, +               account_ids: [third_user.id, other_user.id] +             }             ]      status = StatusView.render("show.json", activity: activity, for: user)      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 1, me: false} +             %{name: "☕", count: 1, me: false, url: nil, account_ids: [third_user.id]}             ]      status = StatusView.render("show.json", activity: activity, for: other_user)      assert status[:pleroma][:emoji_reactions] == [ -             %{name: "☕", count: 1, me: true} +             %{name: "☕", count: 1, me: true, url: nil, account_ids: [other_user.id]}             ]    end diff --git a/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs index 77c75b560..d81b47a6b 100644 --- a/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -17,23 +17,113 @@ defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do      user = insert(:user)      other_user = insert(:user) +    note = insert(:note, user: user, data: %{"reactions" => [["👍", [other_user.ap_id], nil]]}) +    activity = insert(:note_activity, note: note, user: user) + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/\u26A0") +      |> json_response_and_validate_schema(200) + +    assert %{"id" => id} = result +    assert to_string(activity.id) == id + +    assert result["pleroma"]["emoji_reactions"] == [ +             %{ +               "name" => "👍", +               "count" => 1, +               "me" => true, +               "url" => nil, +               "account_ids" => [other_user.id] +             }, +             %{ +               "name" => "\u26A0\uFE0F", +               "count" => 1, +               "me" => true, +               "url" => nil, +               "account_ids" => [other_user.id] +             } +           ] +      {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) +    ObanHelpers.perform_all() + +    # Reacting with a custom emoji      result =        conn        |> assign(:user, other_user)        |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) -      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") +      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:")        |> json_response_and_validate_schema(200) -    # We return the status, but this our implementation detail.      assert %{"id" => id} = result      assert to_string(activity.id) == id      assert result["pleroma"]["emoji_reactions"] == [ -             %{"name" => "☕", "count" => 1, "me" => true} +             %{ +               "name" => "dinosaur", +               "count" => 1, +               "me" => true, +               "url" => "http://localhost:4001/emoji/dino walking.gif", +               "account_ids" => [other_user.id] +             } +           ] + +    # Reacting with a remote emoji +    note = +      insert(:note, +        user: user, +        data: %{ +          "reactions" => [ +            ["👍", [other_user.ap_id], nil], +            ["wow", [other_user.ap_id], "https://remote/emoji/wow"] +          ] +        } +      ) + +    activity = insert(:note_activity, note: note, user: user) + +    result = +      conn +      |> assign(:user, user) +      |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:statuses"])) +      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/:wow@remote:") +      |> json_response(200) + +    assert result["pleroma"]["emoji_reactions"] == [ +             %{ +               "account_ids" => [other_user.id], +               "count" => 1, +               "me" => false, +               "name" => "👍", +               "url" => nil +             }, +             %{ +               "name" => "wow@remote", +               "count" => 2, +               "me" => true, +               "url" => "https://remote/emoji/wow", +               "account_ids" => [user.id, other_user.id] +             }             ] +    # Reacting with a remote custom emoji that hasn't been reacted with yet +    note = +      insert(:note, +        user: user +      ) + +    activity = insert(:note_activity, note: note, user: user) + +    assert conn +           |> assign(:user, user) +           |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:statuses"])) +           |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/:wow@remote:") +           |> json_response(400) +      # Reacting with a non-emoji      assert conn             |> assign(:user, other_user) @@ -46,8 +136,21 @@ defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) +    note = +      insert(:note, +        user: user, +        data: %{"reactions" => [["wow", [user.ap_id], "https://remote/emoji/wow"]]} +      ) + +    activity = insert(:note_activity, note: note, user: user) + +    ObanHelpers.perform_all() +      {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") +    {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, ":dinosaur:") + +    {:ok, _reaction_activity} = +      CommonAPI.react_with_emoji(activity.id, other_user, ":wow@remote:")      ObanHelpers.perform_all() @@ -60,11 +163,47 @@ defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do      assert %{"id" => id} = json_response_and_validate_schema(result, 200)      assert to_string(activity.id) == id +    # Remove custom emoji + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +      |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:") + +    assert %{"id" => id} = json_response_and_validate_schema(result, 200) +    assert to_string(activity.id) == id +      ObanHelpers.perform_all()      object = Object.get_by_ap_id(activity.data["object"]) -    assert object.data["reaction_count"] == 0 +    assert object.data["reaction_count"] == 2 + +    # Remove custom remote emoji +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +      |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/:wow@remote:") +      |> json_response(200) + +    assert result["pleroma"]["emoji_reactions"] == [ +             %{ +               "name" => "wow@remote", +               "count" => 1, +               "me" => false, +               "url" => "https://remote/emoji/wow", +               "account_ids" => [user.id] +             } +           ] + +    # Remove custom remote emoji that hasn't been reacted with yet +    assert conn +           |> assign(:user, other_user) +           |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) +           |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/:zoop@remote:") +           |> json_response(400)    end    test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do @@ -181,7 +320,15 @@ defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do      {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")      {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") -    assert [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = +    assert [ +             %{ +               "name" => "🎅", +               "count" => 1, +               "accounts" => [represented_user], +               "me" => false, +               "url" => nil +             } +           ] =               conn               |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")               |> json_response_and_validate_schema(200) | 
