Use mediaproxy for emoji notifications if enabled
[akkoma] / test / pleroma / web / mastodon_api / views / notification_view_test.exs
index 8070c03c950032c64f2b833fd3d14cb638a47937..b5e36c86b3a6fa12b11e2c368dcb41383a040768 100644 (file)
@@ -12,6 +12,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
   alias Pleroma.Object
   alias Pleroma.Repo
   alias Pleroma.User
+  alias Pleroma.Web.ActivityPub.Builder
+  alias Pleroma.Web.ActivityPub.Pipeline
   alias Pleroma.Web.AdminAPI.Report
   alias Pleroma.Web.AdminAPI.ReportView
   alias Pleroma.Web.CommonAPI
@@ -19,6 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.NotificationView
   alias Pleroma.Web.MastodonAPI.StatusView
+  alias Pleroma.Web.MediaProxy
   alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
   import Pleroma.Factory
 
@@ -188,6 +191,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       pleroma: %{is_seen: false, is_muted: false},
       type: "pleroma:emoji_reaction",
       emoji: "☕",
+      emoji_url: nil,
       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)
@@ -196,6 +200,74 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
     test_notifications_rendering([notification], user, [expected])
   end
 
+  test "EmojiReact notification with custom emoji" do
+    user = insert(:user)
+    other_user = insert(:user)
+
+    {:ok, activity} = CommonAPI.post(user, %{status: "#morb"})
+    {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, ":100a:")
+
+    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: ":100a:",
+      emoji_url: "http://localhost:4001/emoji/100a.png",
+      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)
+    }
+
+    test_notifications_rendering([notification], user, [expected])
+  end
+
+  test "EmojiReact notification with remote custom emoji" do
+    proxyBaseUrl = "https://cache.pleroma.social"
+    clear_config([:media_proxy, :base_url], proxyBaseUrl)
+
+    for testProxy <- [true, false] do
+      clear_config([:media_proxy, :enabled], testProxy)
+
+      user = insert(:user)
+      other_user = insert(:user, local: false)
+
+      {:ok, activity} = CommonAPI.post(user, %{status: "#morb"})
+      {:ok, emoji_react, _} = Builder.emoji_react(other_user, Object.normalize(activity, fetch: false), ":100a:")
+
+      remoteUrl = "http://evil.website/emoji/100a.png"
+      [tag] = emoji_react["tag"]
+      tag = put_in(tag["id"], remoteUrl)
+      tag = put_in(tag["icon"]["url"], remoteUrl)
+      emoji_react = put_in(emoji_react["tag"], [tag])
+
+      {:ok, _activity, _} = Pipeline.common_pipeline(emoji_react, local: false)
+
+      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: ":100a:",
+        emoji_url: (if testProxy, do: MediaProxy.encode_url(remoteUrl), else: remoteUrl),
+        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)
+      }
+      test_notifications_rendering([notification], user, [expected])
+    end
+  end
+
   test "Poll notification" do
     user = insert(:user)
     activity = insert(:question_activity, user: user)