8fb7faaa51f9aaa481e36af30a73765f26c7058a
[akkoma] / test / web / push / impl_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.Push.ImplTest do
6 use Pleroma.DataCase
7
8 alias Pleroma.Notification
9 alias Pleroma.Object
10 alias Pleroma.User
11 alias Pleroma.Web.CommonAPI
12 alias Pleroma.Web.Push.Impl
13 alias Pleroma.Web.Push.Subscription
14
15 import Pleroma.Factory
16
17 setup do
18 Tesla.Mock.mock(fn
19 %{method: :post, url: "https://example.com/example/1234"} ->
20 %Tesla.Env{status: 200}
21
22 %{method: :post, url: "https://example.com/example/not_found"} ->
23 %Tesla.Env{status: 400}
24
25 %{method: :post, url: "https://example.com/example/bad"} ->
26 %Tesla.Env{status: 100}
27 end)
28
29 :ok
30 end
31
32 @sub %{
33 endpoint: "https://example.com/example/1234",
34 keys: %{
35 auth: "8eDyX_uCN0XRhSbY5hs7Hg==",
36 p256dh:
37 "BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA="
38 }
39 }
40 @api_key "BASgACIHpN1GYgzSRp"
41 @message "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
42
43 test "performs sending notifications" do
44 user = insert(:user)
45 user2 = insert(:user)
46 insert(:push_subscription, user: user, data: %{alerts: %{"mention" => true}})
47 insert(:push_subscription, user: user2, data: %{alerts: %{"mention" => true}})
48
49 insert(:push_subscription,
50 user: user,
51 data: %{alerts: %{"follow" => true, "mention" => true}}
52 )
53
54 insert(:push_subscription,
55 user: user,
56 data: %{alerts: %{"follow" => true, "mention" => false}}
57 )
58
59 {:ok, activity} = CommonAPI.post(user, %{status: "<Lorem ipsum dolor sit amet."})
60
61 notif =
62 insert(:notification,
63 user: user,
64 activity: activity,
65 type: "mention"
66 )
67
68 assert Impl.perform(notif) == {:ok, [:ok, :ok]}
69 end
70
71 @tag capture_log: true
72 test "returns error if notif does not match " do
73 assert Impl.perform(%{}) == {:error, :unknown_type}
74 end
75
76 test "successful message sending" do
77 assert Impl.push_message(@message, @sub, @api_key, %Subscription{}) == :ok
78 end
79
80 @tag capture_log: true
81 test "fail message sending" do
82 assert Impl.push_message(
83 @message,
84 Map.merge(@sub, %{endpoint: "https://example.com/example/bad"}),
85 @api_key,
86 %Subscription{}
87 ) == :error
88 end
89
90 test "delete subscription if result send message between 400..500" do
91 subscription = insert(:push_subscription)
92
93 assert Impl.push_message(
94 @message,
95 Map.merge(@sub, %{endpoint: "https://example.com/example/not_found"}),
96 @api_key,
97 subscription
98 ) == :ok
99
100 refute Pleroma.Repo.get(Subscription, subscription.id)
101 end
102
103 test "deletes subscription when token has been deleted" do
104 subscription = insert(:push_subscription)
105
106 Pleroma.Repo.delete(subscription.token)
107
108 refute Pleroma.Repo.get(Subscription, subscription.id)
109 end
110
111 test "renders title and body for create activity" do
112 user = insert(:user, nickname: "Bob")
113
114 {:ok, activity} =
115 CommonAPI.post(user, %{
116 status:
117 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
118 })
119
120 object = Object.normalize(activity)
121
122 assert Impl.format_body(
123 %{
124 activity: activity
125 },
126 user,
127 object
128 ) ==
129 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
130
131 assert Impl.format_title(%{activity: activity, type: "mention"}) ==
132 "New Mention"
133 end
134
135 test "renders title and body for follow activity" do
136 user = insert(:user, nickname: "Bob")
137 other_user = insert(:user)
138 {:ok, _, _, activity} = CommonAPI.follow(user, other_user)
139 object = Object.normalize(activity, false)
140
141 assert Impl.format_body(%{activity: activity, type: "follow"}, user, object) ==
142 "@Bob has followed you"
143
144 assert Impl.format_title(%{activity: activity, type: "follow"}) ==
145 "New Follower"
146 end
147
148 test "renders title and body for announce activity" do
149 user = insert(:user)
150
151 {:ok, activity} =
152 CommonAPI.post(user, %{
153 status:
154 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
155 })
156
157 {:ok, announce_activity} = CommonAPI.repeat(activity.id, user)
158 object = Object.normalize(activity)
159
160 assert Impl.format_body(%{activity: announce_activity}, user, object) ==
161 "@#{user.nickname} repeated: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
162
163 assert Impl.format_title(%{activity: announce_activity, type: "reblog"}) ==
164 "New Repeat"
165 end
166
167 test "renders title and body for like activity" do
168 user = insert(:user, nickname: "Bob")
169
170 {:ok, activity} =
171 CommonAPI.post(user, %{
172 status:
173 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
174 })
175
176 {:ok, activity} = CommonAPI.favorite(user, activity.id)
177 object = Object.normalize(activity)
178
179 assert Impl.format_body(%{activity: activity, type: "favourite"}, user, object) ==
180 "@Bob has favorited your post"
181
182 assert Impl.format_title(%{activity: activity, type: "favourite"}) ==
183 "New Favorite"
184 end
185
186 test "renders title for create activity with direct visibility" do
187 user = insert(:user, nickname: "Bob")
188
189 {:ok, activity} =
190 CommonAPI.post(user, %{
191 visibility: "direct",
192 status: "This is just between you and me, pal"
193 })
194
195 assert Impl.format_title(%{activity: activity}) ==
196 "New Direct Message"
197 end
198
199 describe "build_content/3" do
200 test "builds content for chat messages" do
201 user = insert(:user)
202 recipient = insert(:user)
203
204 {:ok, chat} = CommonAPI.post_chat_message(user, recipient, "hey")
205 object = Object.normalize(chat, false)
206 [notification] = Notification.for_user(recipient)
207
208 res = Impl.build_content(notification, user, object)
209
210 assert res == %{
211 body: "@#{user.nickname}: hey",
212 title: "New Chat Message"
213 }
214 end
215
216 test "hides details for notifications when privacy option enabled" do
217 user = insert(:user, nickname: "Bob")
218 user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: true})
219
220 {:ok, activity} =
221 CommonAPI.post(user, %{
222 visibility: "direct",
223 status: "<Lorem ipsum dolor sit amet."
224 })
225
226 notif = insert(:notification, user: user2, activity: activity)
227
228 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
229 object = Object.normalize(activity)
230
231 assert Impl.build_content(notif, actor, object) == %{
232 body: "New Direct Message"
233 }
234
235 {:ok, activity} =
236 CommonAPI.post(user, %{
237 visibility: "public",
238 status: "<Lorem ipsum dolor sit amet."
239 })
240
241 notif = insert(:notification, user: user2, activity: activity, type: "mention")
242
243 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
244 object = Object.normalize(activity)
245
246 assert Impl.build_content(notif, actor, object) == %{
247 body: "New Mention"
248 }
249
250 {:ok, activity} = CommonAPI.favorite(user, activity.id)
251
252 notif = insert(:notification, user: user2, activity: activity, type: "favourite")
253
254 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
255 object = Object.normalize(activity)
256
257 assert Impl.build_content(notif, actor, object) == %{
258 body: "New Favorite"
259 }
260 end
261
262 test "returns regular content for notifications with privacy option disabled" do
263 user = insert(:user, nickname: "Bob")
264 user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: false})
265
266 {:ok, activity} =
267 CommonAPI.post(user, %{
268 visibility: "direct",
269 status:
270 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
271 })
272
273 notif = insert(:notification, user: user2, activity: activity)
274
275 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
276 object = Object.normalize(activity)
277
278 assert Impl.build_content(notif, actor, object) == %{
279 body:
280 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
281 title: "New Direct Message"
282 }
283
284 {:ok, activity} =
285 CommonAPI.post(user, %{
286 visibility: "public",
287 status:
288 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
289 })
290
291 notif = insert(:notification, user: user2, activity: activity, type: "mention")
292
293 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
294 object = Object.normalize(activity)
295
296 assert Impl.build_content(notif, actor, object) == %{
297 body:
298 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
299 title: "New Mention"
300 }
301
302 {:ok, activity} = CommonAPI.favorite(user, activity.id)
303
304 notif = insert(:notification, user: user2, activity: activity, type: "favourite")
305
306 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
307 object = Object.normalize(activity)
308
309 assert Impl.build_content(notif, actor, object) == %{
310 body: "@Bob has favorited your post",
311 title: "New Favorite"
312 }
313 end
314 end
315 end