purge chat and shout endpoints
[akkoma] / test / pleroma / web / mastodon_api / views / notification_view_test.exs
index 2f6a808f1c540414b851e0791c37f868568b6eeb..803b1f438308355e4c6af57522a3d6bac0660a36 100644 (file)
@@ -1,23 +1,25 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
   use Pleroma.DataCase
 
   alias Pleroma.Activity
-  alias Pleroma.Chat
-  alias Pleroma.Chat.MessageReference
   alias Pleroma.Notification
   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
   alias Pleroma.Web.CommonAPI.Utils
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.NotificationView
   alias Pleroma.Web.MastodonAPI.StatusView
-  alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
+  alias Pleroma.Web.MediaProxy
   import Pleroma.Factory
 
   defp test_notifications_rendering(notifications, user, expected_result) do
@@ -35,30 +37,6 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
     assert expected_result == result
   end
 
-  test "ChatMessage notification" do
-    user = insert(:user)
-    recipient = insert(:user)
-    {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "what's up my dude")
-
-    {:ok, [notification]} = Notification.create_notifications(activity)
-
-    object = Object.normalize(activity)
-    chat = Chat.get(recipient.id, user.ap_id)
-
-    cm_ref = MessageReference.for_chat_and_object(chat, object)
-
-    expected = %{
-      id: to_string(notification.id),
-      pleroma: %{is_seen: false, is_muted: false},
-      type: "pleroma:chat_mention",
-      account: AccountView.render("show.json", %{user: user, for: recipient}),
-      chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
-      created_at: Utils.to_masto_date(notification.inserted_at)
-    }
-
-    test_notifications_rendering([notification], recipient, [expected])
-  end
-
   test "Mention notification" do
     user = insert(:user)
     mentioned_user = insert(:user)
@@ -142,24 +120,11 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
     refute Repo.one(Notification)
   end
 
-  @tag capture_log: true
   test "Move notification" do
     old_user = insert(:user)
     new_user = insert(:user, also_known_as: [old_user.ap_id])
     follower = insert(:user)
 
-    old_user_url = old_user.ap_id
-
-    body =
-      File.read!("test/fixtures/users_mock/localhost.json")
-      |> String.replace("{{nickname}}", old_user.nickname)
-      |> Jason.encode!()
-
-    Tesla.Mock.mock(fn
-      %{method: :get, url: ^old_user_url} ->
-        %Tesla.Env{status: 200, body: body}
-    end)
-
     User.follow(follower, old_user)
     Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
     Pleroma.Tests.ObanHelpers.perform_all()
@@ -199,6 +164,34 @@ 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)
+    }
+
+    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)
@@ -207,6 +200,91 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
     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)
+    {:ok, [notification]} = Notification.create_poll_notifications(activity)
+
+    expected = %{
+      id: to_string(notification.id),
+      pleroma: %{is_seen: false, is_muted: false},
+      type: "poll",
+      account:
+        AccountView.render("show.json", %{
+          user: 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 "Report notification" do
+    reporting_user = insert(:user)
+    reported_user = insert(:user)
+    {:ok, moderator_user} = insert(:user) |> User.admin_api_update(%{is_moderator: true})
+
+    {:ok, activity} = CommonAPI.report(reporting_user, %{account_id: reported_user.id})
+    {:ok, [notification]} = Notification.create_notifications(activity)
+
+    expected = %{
+      id: to_string(notification.id),
+      pleroma: %{is_seen: false, is_muted: false},
+      type: "pleroma:report",
+      account: AccountView.render("show.json", %{user: reporting_user, for: moderator_user}),
+      created_at: Utils.to_masto_date(notification.inserted_at),
+      report: ReportView.render("show.json", Report.extract_report_info(activity))
+    }
+
+    test_notifications_rendering([notification], moderator_user, [expected])
+  end
+
   test "muted notification" do
     user = insert(:user)
     another_user = insert(:user)