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