Merge branch 'remake-remodel' into develop
[akkoma] / test / web / mastodon_api / views / notification_view_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
6 use Pleroma.DataCase
7
8 alias Pleroma.Activity
9 alias Pleroma.Notification
10 alias Pleroma.Repo
11 alias Pleroma.User
12 alias Pleroma.Web.CommonAPI
13 alias Pleroma.Web.CommonAPI.Utils
14 alias Pleroma.Web.MastodonAPI.AccountView
15 alias Pleroma.Web.MastodonAPI.NotificationView
16 alias Pleroma.Web.MastodonAPI.StatusView
17 import Pleroma.Factory
18
19 test "Mention notification" do
20 user = insert(:user)
21 mentioned_user = insert(:user)
22 {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{mentioned_user.nickname}"})
23 {:ok, [notification]} = Notification.create_notifications(activity)
24 user = User.get_cached_by_id(user.id)
25
26 expected = %{
27 id: to_string(notification.id),
28 pleroma: %{is_seen: false},
29 type: "mention",
30 account: AccountView.render("show.json", %{user: user, for: mentioned_user}),
31 status: StatusView.render("show.json", %{activity: activity, for: mentioned_user}),
32 created_at: Utils.to_masto_date(notification.inserted_at)
33 }
34
35 result =
36 NotificationView.render("index.json", %{notifications: [notification], for: mentioned_user})
37
38 assert [expected] == result
39 end
40
41 test "Favourite notification" do
42 user = insert(:user)
43 another_user = insert(:user)
44 {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"})
45 {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)
46 {:ok, [notification]} = Notification.create_notifications(favorite_activity)
47 create_activity = Activity.get_by_id(create_activity.id)
48
49 expected = %{
50 id: to_string(notification.id),
51 pleroma: %{is_seen: false},
52 type: "favourite",
53 account: AccountView.render("show.json", %{user: another_user, for: user}),
54 status: StatusView.render("show.json", %{activity: create_activity, for: user}),
55 created_at: Utils.to_masto_date(notification.inserted_at)
56 }
57
58 result = NotificationView.render("index.json", %{notifications: [notification], for: user})
59
60 assert [expected] == result
61 end
62
63 test "Reblog notification" do
64 user = insert(:user)
65 another_user = insert(:user)
66 {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"})
67 {:ok, reblog_activity, _object} = CommonAPI.repeat(create_activity.id, another_user)
68 {:ok, [notification]} = Notification.create_notifications(reblog_activity)
69 reblog_activity = Activity.get_by_id(create_activity.id)
70
71 expected = %{
72 id: to_string(notification.id),
73 pleroma: %{is_seen: false},
74 type: "reblog",
75 account: AccountView.render("show.json", %{user: another_user, for: user}),
76 status: StatusView.render("show.json", %{activity: reblog_activity, for: user}),
77 created_at: Utils.to_masto_date(notification.inserted_at)
78 }
79
80 result = NotificationView.render("index.json", %{notifications: [notification], for: user})
81
82 assert [expected] == result
83 end
84
85 test "Follow notification" do
86 follower = insert(:user)
87 followed = insert(:user)
88 {:ok, follower, followed, _activity} = CommonAPI.follow(follower, followed)
89 notification = Notification |> Repo.one() |> Repo.preload(:activity)
90
91 expected = %{
92 id: to_string(notification.id),
93 pleroma: %{is_seen: false},
94 type: "follow",
95 account: AccountView.render("show.json", %{user: follower, for: followed}),
96 created_at: Utils.to_masto_date(notification.inserted_at)
97 }
98
99 result =
100 NotificationView.render("index.json", %{notifications: [notification], for: followed})
101
102 assert [expected] == result
103
104 User.perform(:delete, follower)
105 notification = Notification |> Repo.one() |> Repo.preload(:activity)
106
107 assert [] ==
108 NotificationView.render("index.json", %{notifications: [notification], for: followed})
109 end
110
111 test "Move notification" do
112 old_user = insert(:user)
113 new_user = insert(:user, also_known_as: [old_user.ap_id])
114 follower = insert(:user)
115
116 User.follow(follower, old_user)
117 Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
118 Pleroma.Tests.ObanHelpers.perform_all()
119
120 old_user = refresh_record(old_user)
121 new_user = refresh_record(new_user)
122
123 [notification] = Notification.for_user(follower, %{with_move: true})
124
125 expected = %{
126 id: to_string(notification.id),
127 pleroma: %{is_seen: false},
128 type: "move",
129 account: AccountView.render("show.json", %{user: old_user, for: follower}),
130 target: AccountView.render("show.json", %{user: new_user, for: follower}),
131 created_at: Utils.to_masto_date(notification.inserted_at)
132 }
133
134 assert [expected] ==
135 NotificationView.render("index.json", %{notifications: [notification], for: follower})
136 end
137
138 test "EmojiReact notification" do
139 user = insert(:user)
140 other_user = insert(:user)
141
142 {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
143 {:ok, _activity, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
144
145 activity = Repo.get(Activity, activity.id)
146
147 [notification] = Notification.for_user(user)
148
149 assert notification
150
151 expected = %{
152 id: to_string(notification.id),
153 pleroma: %{is_seen: false},
154 type: "pleroma:emoji_reaction",
155 emoji: "☕",
156 account: AccountView.render("show.json", %{user: other_user, for: user}),
157 status: StatusView.render("show.json", %{activity: activity, for: user}),
158 created_at: Utils.to_masto_date(notification.inserted_at)
159 }
160
161 assert expected ==
162 NotificationView.render("show.json", %{notification: notification, for: user})
163 end
164 end