1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
10 alias Pleroma.Chat.MessageReference
11 alias Pleroma.Notification
15 alias Pleroma.Web.AdminAPI.Report
16 alias Pleroma.Web.AdminAPI.ReportView
17 alias Pleroma.Web.CommonAPI
18 alias Pleroma.Web.CommonAPI.Utils
19 alias Pleroma.Web.MastodonAPI.AccountView
20 alias Pleroma.Web.MastodonAPI.NotificationView
21 alias Pleroma.Web.MastodonAPI.StatusView
22 alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
23 import Pleroma.Factory
25 defp test_notifications_rendering(notifications, user, expected_result) do
26 result = NotificationView.render("index.json", %{notifications: notifications, for: user})
28 assert expected_result == result
31 NotificationView.render("index.json", %{
32 notifications: notifications,
37 assert expected_result == result
40 test "ChatMessage notification" do
42 recipient = insert(:user)
43 {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "what's up my dude")
45 {:ok, [notification]} = Notification.create_notifications(activity)
47 object = Object.normalize(activity, fetch: false)
48 chat = Chat.get(recipient.id, user.ap_id)
50 cm_ref = MessageReference.for_chat_and_object(chat, object)
53 id: to_string(notification.id),
54 pleroma: %{is_seen: false, is_muted: false},
55 type: "pleroma:chat_mention",
56 account: AccountView.render("show.json", %{user: user, for: recipient}),
57 chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
58 created_at: Utils.to_masto_date(notification.inserted_at)
61 test_notifications_rendering([notification], recipient, [expected])
64 test "Mention notification" do
66 mentioned_user = insert(:user)
67 {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{mentioned_user.nickname}"})
68 {:ok, [notification]} = Notification.create_notifications(activity)
69 user = User.get_cached_by_id(user.id)
72 id: to_string(notification.id),
73 pleroma: %{is_seen: false, is_muted: false},
76 AccountView.render("show.json", %{
80 status: StatusView.render("show.json", %{activity: activity, for: mentioned_user}),
81 created_at: Utils.to_masto_date(notification.inserted_at)
84 test_notifications_rendering([notification], mentioned_user, [expected])
87 test "Favourite notification" do
89 another_user = insert(:user)
90 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
91 {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)
92 {:ok, [notification]} = Notification.create_notifications(favorite_activity)
93 create_activity = Activity.get_by_id(create_activity.id)
96 id: to_string(notification.id),
97 pleroma: %{is_seen: false, is_muted: false},
99 account: AccountView.render("show.json", %{user: another_user, for: user}),
100 status: StatusView.render("show.json", %{activity: create_activity, for: user}),
101 created_at: Utils.to_masto_date(notification.inserted_at)
104 test_notifications_rendering([notification], user, [expected])
107 test "Reblog notification" do
109 another_user = insert(:user)
110 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
111 {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, another_user)
112 {:ok, [notification]} = Notification.create_notifications(reblog_activity)
113 reblog_activity = Activity.get_by_id(create_activity.id)
116 id: to_string(notification.id),
117 pleroma: %{is_seen: false, is_muted: false},
119 account: AccountView.render("show.json", %{user: another_user, for: user}),
120 status: StatusView.render("show.json", %{activity: reblog_activity, for: user}),
121 created_at: Utils.to_masto_date(notification.inserted_at)
124 test_notifications_rendering([notification], user, [expected])
127 test "Follow notification" do
128 follower = insert(:user)
129 followed = insert(:user)
130 {:ok, follower, followed, _activity} = CommonAPI.follow(follower, followed)
131 notification = Notification |> Repo.one() |> Repo.preload(:activity)
134 id: to_string(notification.id),
135 pleroma: %{is_seen: false, is_muted: false},
137 account: AccountView.render("show.json", %{user: follower, for: followed}),
138 created_at: Utils.to_masto_date(notification.inserted_at)
141 test_notifications_rendering([notification], followed, [expected])
143 User.perform(:delete, follower)
144 refute Repo.one(Notification)
147 test "Move notification" do
148 old_user = insert(:user)
149 new_user = insert(:user, also_known_as: [old_user.ap_id])
150 follower = insert(:user)
152 User.follow(follower, old_user)
153 Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
154 Pleroma.Tests.ObanHelpers.perform_all()
156 old_user = refresh_record(old_user)
157 new_user = refresh_record(new_user)
159 [notification] = Notification.for_user(follower)
162 id: to_string(notification.id),
163 pleroma: %{is_seen: false, is_muted: false},
165 account: AccountView.render("show.json", %{user: old_user, for: follower}),
166 target: AccountView.render("show.json", %{user: new_user, for: follower}),
167 created_at: Utils.to_masto_date(notification.inserted_at)
170 test_notifications_rendering([notification], follower, [expected])
173 test "EmojiReact notification" do
175 other_user = insert(:user)
177 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
178 {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
180 activity = Repo.get(Activity, activity.id)
182 [notification] = Notification.for_user(user)
187 id: to_string(notification.id),
188 pleroma: %{is_seen: false, is_muted: false},
189 type: "pleroma:emoji_reaction",
192 account: AccountView.render("show.json", %{user: other_user, for: user}),
193 status: StatusView.render("show.json", %{activity: activity, for: user}),
194 created_at: Utils.to_masto_date(notification.inserted_at)
197 test_notifications_rendering([notification], user, [expected])
200 test "EmojiReact notification with custom emoji" do
202 other_user = insert(:user)
204 {:ok, activity} = CommonAPI.post(user, %{status: "#morb"})
205 {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, ":100a:")
207 activity = Repo.get(Activity, activity.id)
209 [notification] = Notification.for_user(user)
214 id: to_string(notification.id),
215 pleroma: %{is_seen: false, is_muted: false},
216 type: "pleroma:emoji_reaction",
218 emoji_url: "http://localhost:4001/emoji/100a.png",
219 account: AccountView.render("show.json", %{user: other_user, for: user}),
220 status: StatusView.render("show.json", %{activity: activity, for: user}),
221 created_at: Utils.to_masto_date(notification.inserted_at)
224 test_notifications_rendering([notification], user, [expected])
227 test "Poll notification" do
229 activity = insert(:question_activity, user: user)
230 {:ok, [notification]} = Notification.create_poll_notifications(activity)
233 id: to_string(notification.id),
234 pleroma: %{is_seen: false, is_muted: false},
237 AccountView.render("show.json", %{
241 status: StatusView.render("show.json", %{activity: activity, for: user}),
242 created_at: Utils.to_masto_date(notification.inserted_at)
245 test_notifications_rendering([notification], user, [expected])
248 test "Report notification" do
249 reporting_user = insert(:user)
250 reported_user = insert(:user)
251 {:ok, moderator_user} = insert(:user) |> User.admin_api_update(%{is_moderator: true})
253 {:ok, activity} = CommonAPI.report(reporting_user, %{account_id: reported_user.id})
254 {:ok, [notification]} = Notification.create_notifications(activity)
257 id: to_string(notification.id),
258 pleroma: %{is_seen: false, is_muted: false},
259 type: "pleroma:report",
260 account: AccountView.render("show.json", %{user: reporting_user, for: moderator_user}),
261 created_at: Utils.to_masto_date(notification.inserted_at),
262 report: ReportView.render("show.json", Report.extract_report_info(activity))
265 test_notifications_rendering([notification], moderator_user, [expected])
268 test "muted notification" do
270 another_user = insert(:user)
272 {:ok, _} = Pleroma.UserRelationship.create_mute(user, another_user)
273 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
274 {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)
275 {:ok, [notification]} = Notification.create_notifications(favorite_activity)
276 create_activity = Activity.get_by_id(create_activity.id)
279 id: to_string(notification.id),
280 pleroma: %{is_seen: true, is_muted: true},
282 account: AccountView.render("show.json", %{user: another_user, for: user}),
283 status: StatusView.render("show.json", %{activity: create_activity, for: user}),
284 created_at: Utils.to_masto_date(notification.inserted_at)
287 test_notifications_rendering([notification], user, [expected])