move to 2.5.5
[anni] / test / pleroma / web / push / impl_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 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, async: true
7
8   import Pleroma.Factory
9
10   alias Pleroma.Notification
11   alias Pleroma.Object
12   alias Pleroma.User
13   alias Pleroma.Web.ActivityPub.ActivityPub
14   alias Pleroma.Web.CommonAPI
15   alias Pleroma.Web.Push.Impl
16   alias Pleroma.Web.Push.Subscription
17
18   setup do
19     Tesla.Mock.mock(fn
20       %{method: :post, url: "https://example.com/example/1234"} ->
21         %Tesla.Env{status: 200}
22
23       %{method: :post, url: "https://example.com/example/not_found"} ->
24         %Tesla.Env{status: 400}
25
26       %{method: :post, url: "https://example.com/example/bad"} ->
27         %Tesla.Env{status: 100}
28     end)
29
30     :ok
31   end
32
33   @sub %{
34     endpoint: "https://example.com/example/1234",
35     keys: %{
36       auth: "8eDyX_uCN0XRhSbY5hs7Hg==",
37       p256dh:
38         "BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA="
39     }
40   }
41   @api_key "BASgACIHpN1GYgzSRp"
42   @message "@Bob: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini..."
43
44   test "performs sending notifications" do
45     user = insert(:user)
46     user2 = insert(:user)
47     insert(:push_subscription, user: user, data: %{alerts: %{"mention" => true}})
48     insert(:push_subscription, user: user2, data: %{alerts: %{"mention" => true}})
49
50     insert(:push_subscription,
51       user: user,
52       data: %{alerts: %{"follow" => true, "mention" => true}}
53     )
54
55     insert(:push_subscription,
56       user: user,
57       data: %{alerts: %{"follow" => true, "mention" => false}}
58     )
59
60     {:ok, activity} = CommonAPI.post(user, %{status: "<Lorem ipsum dolor sit amet."})
61
62     notif =
63       insert(:notification,
64         user: user,
65         activity: activity,
66         type: "mention"
67       )
68
69     assert Impl.perform(notif) == {:ok, [:ok, :ok]}
70   end
71
72   @tag capture_log: true
73   test "returns error if notif does not match " do
74     assert Impl.perform(%{}) == {:error, :unknown_type}
75   end
76
77   test "successful message sending" do
78     assert Impl.push_message(@message, @sub, @api_key, %Subscription{}) == :ok
79   end
80
81   @tag capture_log: true
82   test "fail message sending" do
83     assert Impl.push_message(
84              @message,
85              Map.merge(@sub, %{endpoint: "https://example.com/example/bad"}),
86              @api_key,
87              %Subscription{}
88            ) == :error
89   end
90
91   test "delete subscription if result send message between 400..500" do
92     subscription = insert(:push_subscription)
93
94     assert Impl.push_message(
95              @message,
96              Map.merge(@sub, %{endpoint: "https://example.com/example/not_found"}),
97              @api_key,
98              subscription
99            ) == :ok
100
101     refute Pleroma.Repo.get(Subscription, subscription.id)
102   end
103
104   test "deletes subscription when token has been deleted" do
105     subscription = insert(:push_subscription)
106
107     Pleroma.Repo.delete(subscription.token)
108
109     refute Pleroma.Repo.get(Subscription, subscription.id)
110   end
111
112   test "renders title and body for create activity" do
113     user = insert(:user, nickname: "Bob")
114
115     {:ok, activity} =
116       CommonAPI.post(user, %{
117         status:
118           "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
119       })
120
121     object = Object.normalize(activity, fetch: false)
122
123     assert Impl.format_body(
124              %{
125                activity: activity
126              },
127              user,
128              object
129            ) ==
130              "@Bob: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini..."
131
132     assert Impl.format_title(%{activity: activity, type: "mention"}) ==
133              "New Mention"
134   end
135
136   test "renders title and body for follow activity" do
137     user = insert(:user, nickname: "Bob")
138     other_user = insert(:user)
139     {:ok, _, _, activity} = CommonAPI.follow(user, other_user)
140     object = Object.normalize(activity, fetch: false)
141
142     assert Impl.format_body(%{activity: activity, type: "follow"}, user, object) ==
143              "@Bob has followed you"
144
145     assert Impl.format_title(%{activity: activity, type: "follow"}) ==
146              "New Follower"
147   end
148
149   test "renders title and body for announce activity" do
150     user = insert(:user)
151
152     {:ok, activity} =
153       CommonAPI.post(user, %{
154         status:
155           "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
156       })
157
158     {:ok, announce_activity} = CommonAPI.repeat(activity.id, user)
159     object = Object.normalize(activity, fetch: false)
160
161     assert Impl.format_body(%{activity: announce_activity}, user, object) ==
162              "@#{user.nickname} repeated: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini..."
163
164     assert Impl.format_title(%{activity: announce_activity, type: "reblog"}) ==
165              "New Repeat"
166   end
167
168   test "renders title and body for like activity" do
169     user = insert(:user, nickname: "Bob")
170
171     {:ok, activity} =
172       CommonAPI.post(user, %{
173         status:
174           "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
175       })
176
177     {:ok, activity} = CommonAPI.favorite(user, activity.id)
178     object = Object.normalize(activity, fetch: false)
179
180     assert Impl.format_body(%{activity: activity, type: "favourite"}, user, object) ==
181              "@Bob has favorited your post"
182
183     assert Impl.format_title(%{activity: activity, type: "favourite"}) ==
184              "New Favorite"
185   end
186
187   test "renders title and body for pleroma:emoji_reaction activity" do
188     user = insert(:user, nickname: "Bob")
189
190     {:ok, activity} =
191       CommonAPI.post(user, %{
192         status: "This post is a really good post!"
193       })
194
195     {:ok, activity} = CommonAPI.react_with_emoji(activity.id, user, "👍")
196     object = Object.normalize(activity, fetch: false)
197
198     assert Impl.format_body(%{activity: activity, type: "pleroma:emoji_reaction"}, user, object) ==
199              "@Bob reacted with 👍"
200
201     assert Impl.format_title(%{activity: activity, type: "pleroma:emoji_reaction"}) ==
202              "New Reaction"
203   end
204
205   test "renders title and body for update activity" do
206     user = insert(:user)
207
208     {:ok, activity} = CommonAPI.post(user, %{status: "lorem ipsum"})
209
210     {:ok, activity} = CommonAPI.update(user, activity, %{status: "edited status"})
211     object = Object.normalize(activity, fetch: false)
212
213     assert Impl.format_body(%{activity: activity, type: "update"}, user, object) ==
214              "@#{user.nickname} edited a status"
215
216     assert Impl.format_title(%{activity: activity, type: "update"}) ==
217              "New Update"
218   end
219
220   test "renders title for create activity with direct visibility" do
221     user = insert(:user, nickname: "Bob")
222
223     {:ok, activity} =
224       CommonAPI.post(user, %{
225         visibility: "direct",
226         status: "This is just between you and me, pal"
227       })
228
229     assert Impl.format_title(%{activity: activity}) ==
230              "New Direct Message"
231   end
232
233   describe "build_content/3" do
234     test "builds content for chat messages" do
235       user = insert(:user)
236       recipient = insert(:user)
237
238       {:ok, chat} = CommonAPI.post_chat_message(user, recipient, "hey")
239       object = Object.normalize(chat, fetch: false)
240       [notification] = Notification.for_user(recipient)
241
242       res = Impl.build_content(notification, user, object)
243
244       assert res == %{
245                body: "@#{user.nickname}: hey",
246                title: "New Chat Message"
247              }
248     end
249
250     test "builds content for chat messages with no content" do
251       user = insert(:user)
252       recipient = insert(:user)
253
254       file = %Plug.Upload{
255         content_type: "image/jpeg",
256         path: Path.absname("test/fixtures/image.jpg"),
257         filename: "an_image.jpg"
258       }
259
260       {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
261
262       {:ok, chat} = CommonAPI.post_chat_message(user, recipient, nil, media_id: upload.id)
263       object = Object.normalize(chat, fetch: false)
264       [notification] = Notification.for_user(recipient)
265
266       res = Impl.build_content(notification, user, object)
267
268       assert res == %{
269                body: "@#{user.nickname}: (Attachment)",
270                title: "New Chat Message"
271              }
272     end
273
274     test "hides contents of notifications when option enabled" do
275       user = insert(:user, nickname: "Bob")
276
277       user2 =
278         insert(:user, nickname: "Rob", notification_settings: %{hide_notification_contents: true})
279
280       {:ok, activity} =
281         CommonAPI.post(user, %{
282           visibility: "direct",
283           status: "<Lorem ipsum dolor sit amet."
284         })
285
286       notif = insert(:notification, user: user2, activity: activity)
287
288       actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
289       object = Object.normalize(activity, fetch: false)
290
291       assert Impl.build_content(notif, actor, object) == %{
292                body: "New Direct Message"
293              }
294
295       {:ok, activity} =
296         CommonAPI.post(user, %{
297           visibility: "public",
298           status: "<Lorem ipsum dolor sit amet."
299         })
300
301       notif = insert(:notification, user: user2, activity: activity, type: "mention")
302
303       actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
304       object = Object.normalize(activity, fetch: false)
305
306       assert Impl.build_content(notif, actor, object) == %{
307                body: "New Mention"
308              }
309
310       {:ok, activity} = CommonAPI.favorite(user, activity.id)
311
312       notif = insert(:notification, user: user2, activity: activity, type: "favourite")
313
314       actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
315       object = Object.normalize(activity, fetch: false)
316
317       assert Impl.build_content(notif, actor, object) == %{
318                body: "New Favorite"
319              }
320     end
321
322     test "returns regular content when hiding contents option disabled" do
323       user = insert(:user, nickname: "Bob")
324
325       user2 =
326         insert(:user, nickname: "Rob", notification_settings: %{hide_notification_contents: false})
327
328       {:ok, activity} =
329         CommonAPI.post(user, %{
330           visibility: "direct",
331           status:
332             "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
333         })
334
335       notif = insert(:notification, user: user2, activity: activity)
336
337       actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
338       object = Object.normalize(activity, fetch: false)
339
340       assert Impl.build_content(notif, actor, object) == %{
341                body:
342                  "@Bob: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini...",
343                title: "New Direct Message"
344              }
345
346       {:ok, activity} =
347         CommonAPI.post(user, %{
348           visibility: "public",
349           status:
350             "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
351         })
352
353       notif = insert(:notification, user: user2, activity: activity, type: "mention")
354
355       actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
356       object = Object.normalize(activity, fetch: false)
357
358       assert Impl.build_content(notif, actor, object) == %{
359                body:
360                  "@Bob: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini...",
361                title: "New Mention"
362              }
363
364       {:ok, activity} = CommonAPI.favorite(user, activity.id)
365
366       notif = insert(:notification, user: user2, activity: activity, type: "favourite")
367
368       actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
369       object = Object.normalize(activity, fetch: false)
370
371       assert Impl.build_content(notif, actor, object) == %{
372                body: "@Bob has favorited your post",
373                title: "New Favorite"
374              }
375     end
376   end
377 end