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.CommonAPI
16 alias Pleroma.Web.CommonAPI.Utils
17 alias Pleroma.Web.MastodonAPI.AccountView
18 alias Pleroma.Web.MastodonAPI.NotificationView
19 alias Pleroma.Web.MastodonAPI.StatusView
20 alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
21 import Pleroma.Factory
23 defp test_notifications_rendering(notifications, user, expected_result) do
24 result = NotificationView.render("index.json", %{notifications: notifications, for: user})
26 assert expected_result == result
29 NotificationView.render("index.json", %{
30 notifications: notifications,
35 assert expected_result == result
38 test "ChatMessage notification" do
40 recipient = insert(:user)
41 {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "what's up my dude")
43 {:ok, [notification]} = Notification.create_notifications(activity)
45 object = Object.normalize(activity)
46 chat = Chat.get(recipient.id, user.ap_id)
48 cm_ref = MessageReference.for_chat_and_object(chat, object)
51 id: to_string(notification.id),
52 pleroma: %{is_seen: false, is_muted: false},
53 type: "pleroma:chat_mention",
54 account: AccountView.render("show.json", %{user: user, for: recipient}),
55 chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
56 created_at: Utils.to_masto_date(notification.inserted_at)
59 test_notifications_rendering([notification], recipient, [expected])
62 test "Mention notification" do
64 mentioned_user = insert(:user)
65 {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{mentioned_user.nickname}"})
66 {:ok, [notification]} = Notification.create_notifications(activity)
67 user = User.get_cached_by_id(user.id)
70 id: to_string(notification.id),
71 pleroma: %{is_seen: false, is_muted: false},
74 AccountView.render("show.json", %{
78 status: StatusView.render("show.json", %{activity: activity, for: mentioned_user}),
79 created_at: Utils.to_masto_date(notification.inserted_at)
82 test_notifications_rendering([notification], mentioned_user, [expected])
85 test "Favourite notification" do
87 another_user = insert(:user)
88 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
89 {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)
90 {:ok, [notification]} = Notification.create_notifications(favorite_activity)
91 create_activity = Activity.get_by_id(create_activity.id)
94 id: to_string(notification.id),
95 pleroma: %{is_seen: false, is_muted: false},
97 account: AccountView.render("show.json", %{user: another_user, for: user}),
98 status: StatusView.render("show.json", %{activity: create_activity, for: user}),
99 created_at: Utils.to_masto_date(notification.inserted_at)
102 test_notifications_rendering([notification], user, [expected])
105 test "Reblog notification" do
107 another_user = insert(:user)
108 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
109 {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, another_user)
110 {:ok, [notification]} = Notification.create_notifications(reblog_activity)
111 reblog_activity = Activity.get_by_id(create_activity.id)
114 id: to_string(notification.id),
115 pleroma: %{is_seen: false, is_muted: false},
117 account: AccountView.render("show.json", %{user: another_user, for: user}),
118 status: StatusView.render("show.json", %{activity: reblog_activity, for: user}),
119 created_at: Utils.to_masto_date(notification.inserted_at)
122 test_notifications_rendering([notification], user, [expected])
125 test "Follow notification" do
126 follower = insert(:user)
127 followed = insert(:user)
128 {:ok, follower, followed, _activity} = CommonAPI.follow(follower, followed)
129 notification = Notification |> Repo.one() |> Repo.preload(:activity)
132 id: to_string(notification.id),
133 pleroma: %{is_seen: false, is_muted: false},
135 account: AccountView.render("show.json", %{user: follower, for: followed}),
136 created_at: Utils.to_masto_date(notification.inserted_at)
139 test_notifications_rendering([notification], followed, [expected])
141 User.perform(:delete, follower)
142 refute Repo.one(Notification)
145 @tag capture_log: true
146 test "Move notification" do
147 old_user = insert(:user)
148 new_user = insert(:user, also_known_as: [old_user.ap_id])
149 follower = insert(:user)
151 old_user_url = old_user.ap_id
154 File.read!("test/fixtures/users_mock/localhost.json")
155 |> String.replace("{{nickname}}", old_user.nickname)
159 %{method: :get, url: ^old_user_url} ->
160 %Tesla.Env{status: 200, body: body}
163 User.follow(follower, old_user)
164 Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
165 Pleroma.Tests.ObanHelpers.perform_all()
167 old_user = refresh_record(old_user)
168 new_user = refresh_record(new_user)
170 [notification] = Notification.for_user(follower)
173 id: to_string(notification.id),
174 pleroma: %{is_seen: false, is_muted: false},
176 account: AccountView.render("show.json", %{user: old_user, for: follower}),
177 target: AccountView.render("show.json", %{user: new_user, for: follower}),
178 created_at: Utils.to_masto_date(notification.inserted_at)
181 test_notifications_rendering([notification], follower, [expected])
184 test "EmojiReact notification" do
186 other_user = insert(:user)
188 {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
189 {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
191 activity = Repo.get(Activity, activity.id)
193 [notification] = Notification.for_user(user)
198 id: to_string(notification.id),
199 pleroma: %{is_seen: false, is_muted: false},
200 type: "pleroma:emoji_reaction",
202 account: AccountView.render("show.json", %{user: other_user, for: user}),
203 status: StatusView.render("show.json", %{activity: activity, for: user}),
204 created_at: Utils.to_masto_date(notification.inserted_at)
207 test_notifications_rendering([notification], user, [expected])
210 test "muted notification" do
212 another_user = insert(:user)
214 {:ok, _} = Pleroma.UserRelationship.create_mute(user, another_user)
215 {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
216 {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)
217 {:ok, [notification]} = Notification.create_notifications(favorite_activity)
218 create_activity = Activity.get_by_id(create_activity.id)
221 id: to_string(notification.id),
222 pleroma: %{is_seen: true, is_muted: true},
224 account: AccountView.render("show.json", %{user: another_user, for: user}),
225 status: StatusView.render("show.json", %{activity: create_activity, for: user}),
226 created_at: Utils.to_masto_date(notification.inserted_at)
229 test_notifications_rendering([notification], user, [expected])