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.Push.ImplTest do
8 alias Pleroma.Notification
11 alias Pleroma.Web.ActivityPub.ActivityPub
12 alias Pleroma.Web.CommonAPI
13 alias Pleroma.Web.Push.Impl
14 alias Pleroma.Web.Push.Subscription
15 alias Pleroma.Web.WebPushHttpClientMock
18 import Pleroma.Factory
22 %{method: :post, url: "https://example.com/example/1234"} ->
23 %Tesla.Env{status: 200}
25 %{method: :post, url: "https://example.com/example/not_found"} ->
26 %Tesla.Env{status: 400}
28 %{method: :post, url: "https://example.com/example/bad"} ->
29 %Tesla.Env{status: 100}
36 endpoint: "https://example.com/example/1234",
38 auth: "8eDyX_uCN0XRhSbY5hs7Hg==",
40 "BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA="
43 @api_key "BASgACIHpN1GYgzSRp"
44 @message "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
46 test "performs sending notifications" do
49 insert(:push_subscription, user: user, data: %{alerts: %{"mention" => true}})
50 insert(:push_subscription, user: user2, data: %{alerts: %{"mention" => true}})
52 insert(:push_subscription,
54 data: %{alerts: %{"follow" => true, "mention" => true}}
57 insert(:push_subscription,
59 data: %{alerts: %{"follow" => true, "mention" => false}}
62 {:ok, activity} = CommonAPI.post(user, %{status: "<Lorem ipsum dolor sit amet."})
71 assert Impl.perform(notif) == {:ok, [:ok, :ok]}
74 @tag capture_log: true
75 test "returns error if notif does not match " do
76 assert Impl.perform(%{}) == {:error, :unknown_type}
79 test "successful message sending" do
80 assert Impl.push_message(@message, @sub, @api_key, %Subscription{}) == :ok
83 test_with_mock "uses WebPushHttpClientMock as an HTTP client", WebPushHttpClientMock,
84 post: fn _, _, _ -> {:ok, %{status_code: 200}} end do
85 Impl.push_message(@message, @sub, @api_key, %Subscription{})
86 assert_called(WebPushHttpClientMock.post("https://example.com/example/1234", :_, :_))
89 test_with_mock "uses Pleroma.HTTP as an HTTP client", Pleroma.HTTP,
90 post: fn _, _, _ -> {:ok, %{status_code: 200}} end do
91 client = Application.get_env(:web_push_encryption, :http_client)
92 on_exit(fn -> Application.put_env(:web_push_encryption, :http_client, client) end)
93 Application.put_env(:web_push_encryption, :http_client, Pleroma.HTTP)
95 Impl.push_message(@message, @sub, @api_key, %Subscription{})
96 assert_called(Pleroma.HTTP.post("https://example.com/example/1234", :_, :_))
99 @tag capture_log: true
100 test "fail message sending" do
101 assert Impl.push_message(
103 Map.merge(@sub, %{endpoint: "https://example.com/example/bad"}),
109 test "delete subscription if result send message between 400..500" do
110 subscription = insert(:push_subscription)
112 assert Impl.push_message(
114 Map.merge(@sub, %{endpoint: "https://example.com/example/not_found"}),
119 refute Pleroma.Repo.get(Subscription, subscription.id)
122 test "deletes subscription when token has been deleted" do
123 subscription = insert(:push_subscription)
125 Pleroma.Repo.delete(subscription.token)
127 refute Pleroma.Repo.get(Subscription, subscription.id)
130 test "renders title and body for create activity" do
131 user = insert(:user, nickname: "Bob")
134 CommonAPI.post(user, %{
136 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
139 object = Object.normalize(activity)
141 assert Impl.format_body(
148 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
150 assert Impl.format_title(%{activity: activity, type: "mention"}) ==
154 test "renders title and body for follow activity" do
155 user = insert(:user, nickname: "Bob")
156 other_user = insert(:user)
157 {:ok, _, _, activity} = CommonAPI.follow(user, other_user)
158 object = Object.normalize(activity, false)
160 assert Impl.format_body(%{activity: activity, type: "follow"}, user, object) ==
161 "@Bob has followed you"
163 assert Impl.format_title(%{activity: activity, type: "follow"}) ==
167 test "renders title and body for announce activity" do
171 CommonAPI.post(user, %{
173 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
176 {:ok, announce_activity} = CommonAPI.repeat(activity.id, user)
177 object = Object.normalize(activity)
179 assert Impl.format_body(%{activity: announce_activity}, user, object) ==
180 "@#{user.nickname} repeated: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
182 assert Impl.format_title(%{activity: announce_activity, type: "reblog"}) ==
186 test "renders title and body for like activity" do
187 user = insert(:user, nickname: "Bob")
190 CommonAPI.post(user, %{
192 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
195 {:ok, activity} = CommonAPI.favorite(user, activity.id)
196 object = Object.normalize(activity)
198 assert Impl.format_body(%{activity: activity, type: "favourite"}, user, object) ==
199 "@Bob has favorited your post"
201 assert Impl.format_title(%{activity: activity, type: "favourite"}) ==
205 test "renders title for create activity with direct visibility" do
206 user = insert(:user, nickname: "Bob")
209 CommonAPI.post(user, %{
210 visibility: "direct",
211 status: "This is just between you and me, pal"
214 assert Impl.format_title(%{activity: activity}) ==
218 describe "build_content/3" do
219 test "builds content for chat messages" do
221 recipient = insert(:user)
223 {:ok, chat} = CommonAPI.post_chat_message(user, recipient, "hey")
224 object = Object.normalize(chat, false)
225 [notification] = Notification.for_user(recipient)
227 res = Impl.build_content(notification, user, object)
230 body: "@#{user.nickname}: hey",
231 title: "New Chat Message"
235 test "builds content for chat messages with no content" do
237 recipient = insert(:user)
240 content_type: "image/jpg",
241 path: Path.absname("test/fixtures/image.jpg"),
242 filename: "an_image.jpg"
245 {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
247 {:ok, chat} = CommonAPI.post_chat_message(user, recipient, nil, media_id: upload.id)
248 object = Object.normalize(chat, false)
249 [notification] = Notification.for_user(recipient)
251 res = Impl.build_content(notification, user, object)
254 body: "@#{user.nickname}: (Attachment)",
255 title: "New Chat Message"
259 test "hides contents of notifications when option enabled" do
260 user = insert(:user, nickname: "Bob")
263 insert(:user, nickname: "Rob", notification_settings: %{hide_notification_contents: true})
266 CommonAPI.post(user, %{
267 visibility: "direct",
268 status: "<Lorem ipsum dolor sit amet."
271 notif = insert(:notification, user: user2, activity: activity)
273 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
274 object = Object.normalize(activity)
276 assert Impl.build_content(notif, actor, object) == %{
277 body: "New Direct Message"
281 CommonAPI.post(user, %{
282 visibility: "public",
283 status: "<Lorem ipsum dolor sit amet."
286 notif = insert(:notification, user: user2, activity: activity, type: "mention")
288 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
289 object = Object.normalize(activity)
291 assert Impl.build_content(notif, actor, object) == %{
295 {:ok, activity} = CommonAPI.favorite(user, activity.id)
297 notif = insert(:notification, user: user2, activity: activity, type: "favourite")
299 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
300 object = Object.normalize(activity)
302 assert Impl.build_content(notif, actor, object) == %{
307 test "returns regular content when hiding contents option disabled" do
308 user = insert(:user, nickname: "Bob")
311 insert(:user, nickname: "Rob", notification_settings: %{hide_notification_contents: false})
314 CommonAPI.post(user, %{
315 visibility: "direct",
317 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
320 notif = insert(:notification, user: user2, activity: activity)
322 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
323 object = Object.normalize(activity)
325 assert Impl.build_content(notif, actor, object) == %{
327 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
328 title: "New Direct Message"
332 CommonAPI.post(user, %{
333 visibility: "public",
335 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
338 notif = insert(:notification, user: user2, activity: activity, type: "mention")
340 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
341 object = Object.normalize(activity)
343 assert Impl.build_content(notif, actor, object) == %{
345 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
349 {:ok, activity} = CommonAPI.favorite(user, activity.id)
351 notif = insert(:notification, user: user2, activity: activity, type: "favourite")
353 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
354 object = Object.normalize(activity)
356 assert Impl.build_content(notif, actor, object) == %{
357 body: "@Bob has favorited your post",
358 title: "New Favorite"