1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 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)
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 @tag capture_log: true
148 test "Move notification" do
149 old_user = insert(:user)
150 new_user = insert(:user, also_known_as: [old_user.ap_id])
151 follower = insert(:user)
153 old_user_url = old_user.ap_id
156 File.read!("test/fixtures/users_mock/localhost.json")
157 |> String.replace("{{nickname}}", old_user.nickname)
161 %{method: :get, url: ^old_user_url} ->
162 %Tesla.Env{status: 200, body: body}
165 User.follow(follower, old_user)
166 Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
167 Pleroma.Tests.ObanHelpers.perform_all()
169 old_user = refresh_record(old_user)
170 new_user = refresh_record(new_user)
172 [notification] = Notification.for_user(follower)
175 id: to_string(notification.id),
176 pleroma: %{is_seen: false, is_muted: false},
178 account: AccountView.render("show.json", %{user: old_user, for: follower}),
179 target: AccountView.render("show.json", %{user: new_user, for: follower}),
180 created_at: Utils.to_masto_date(notification.inserted_at)
183 test_notifications_rendering([notification], follower, [expected])
186 test "EmojiReact notification" do
188 other_user = insert(:user)
190 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
191 {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
193 activity = Repo.get(Activity, activity.id)
195 [notification] = Notification.for_user(user)
200 id: to_string(notification.id),
201 pleroma: %{is_seen: false, is_muted: false},
202 type: "pleroma:emoji_reaction",
204 account: AccountView.render("show.json", %{user: other_user, for: user}),
205 status: StatusView.render("show.json", %{activity: activity, for: user}),
206 created_at: Utils.to_masto_date(notification.inserted_at)
209 test_notifications_rendering([notification], user, [expected])
212 test "Report notification" do
213 reporting_user = insert(:user)
214 reported_user = insert(:user)
215 {:ok, moderator_user} = insert(:user) |> User.admin_api_update(%{is_moderator: true})
217 {:ok, activity} = CommonAPI.report(reporting_user, %{account_id: reported_user.id})
218 {:ok, [notification]} = Notification.create_notifications(activity)
221 id: to_string(notification.id),
222 pleroma: %{is_seen: false, is_muted: false},
223 type: "pleroma:report",
224 account: AccountView.render("show.json", %{user: reporting_user, for: moderator_user}),
225 created_at: Utils.to_masto_date(notification.inserted_at),
226 report: ReportView.render("show.json", Report.extract_report_info(activity))
229 test_notifications_rendering([notification], moderator_user, [expected])
232 test "muted notification" do
234 another_user = insert(:user)
236 {:ok, _} = Pleroma.UserRelationship.create_mute(user, another_user)
237 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
238 {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)
239 {:ok, [notification]} = Notification.create_notifications(favorite_activity)
240 create_activity = Activity.get_by_id(create_activity.id)
243 id: to_string(notification.id),
244 pleroma: %{is_seen: true, is_muted: true},
246 account: AccountView.render("show.json", %{user: another_user, for: user}),
247 status: StatusView.render("show.json", %{activity: create_activity, for: user}),
248 created_at: Utils.to_masto_date(notification.inserted_at)
251 test_notifications_rendering([notification], user, [expected])