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
10 alias Pleroma.Web.CommonAPI
11 alias Pleroma.Web.Push.Impl
12 alias Pleroma.Web.Push.Subscription
14 import Pleroma.Factory
17 Tesla.Mock.mock_global(fn
18 %{method: :post, url: "https://example.com/example/1234"} ->
19 %Tesla.Env{status: 200}
21 %{method: :post, url: "https://example.com/example/not_found"} ->
22 %Tesla.Env{status: 400}
24 %{method: :post, url: "https://example.com/example/bad"} ->
25 %Tesla.Env{status: 100}
32 endpoint: "https://example.com/example/1234",
34 auth: "8eDyX_uCN0XRhSbY5hs7Hg==",
36 "BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA="
39 @api_key "BASgACIHpN1GYgzSRp"
40 @message "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
42 test "performs sending notifications" do
45 insert(:push_subscription, user: user, data: %{alerts: %{"mention" => true}})
46 insert(:push_subscription, user: user2, data: %{alerts: %{"mention" => true}})
48 insert(:push_subscription,
50 data: %{alerts: %{"follow" => true, "mention" => true}}
53 insert(:push_subscription,
55 data: %{alerts: %{"follow" => true, "mention" => false}}
58 {:ok, activity} = CommonAPI.post(user, %{"status" => "<Lorem ipsum dolor sit amet."})
66 assert Impl.perform(notif) == {:ok, [:ok, :ok]}
69 @tag capture_log: true
70 test "returns error if notif does not match " do
71 assert Impl.perform(%{}) == {:error, :unknown_type}
74 test "successful message sending" do
75 assert Impl.push_message(@message, @sub, @api_key, %Subscription{}) == :ok
78 @tag capture_log: true
79 test "fail message sending" do
80 assert Impl.push_message(
82 Map.merge(@sub, %{endpoint: "https://example.com/example/bad"}),
88 test "delete subscription if result send message between 400..500" do
89 subscription = insert(:push_subscription)
91 assert Impl.push_message(
93 Map.merge(@sub, %{endpoint: "https://example.com/example/not_found"}),
98 refute Pleroma.Repo.get(Subscription, subscription.id)
101 test "deletes subscription when token has been deleted" do
102 subscription = insert(:push_subscription)
104 Pleroma.Repo.delete(subscription.token)
106 refute Pleroma.Repo.get(Subscription, subscription.id)
109 test "renders title and body for create activity" do
110 user = insert(:user, nickname: "Bob")
113 CommonAPI.post(user, %{
115 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
118 object = Object.normalize(activity)
120 assert Impl.format_body(
127 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
129 assert Impl.format_title(%{activity: activity}) ==
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)
139 assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you"
141 assert Impl.format_title(%{activity: activity}) ==
145 test "renders title and body for announce activity" do
149 CommonAPI.post(user, %{
151 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
154 {:ok, announce_activity, _} = CommonAPI.repeat(activity.id, user)
155 object = Object.normalize(activity)
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..."
160 assert Impl.format_title(%{activity: announce_activity}) ==
164 test "renders title and body for like activity" do
165 user = insert(:user, nickname: "Bob")
168 CommonAPI.post(user, %{
170 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
173 {:ok, activity} = CommonAPI.favorite(user, activity.id)
174 object = Object.normalize(activity)
176 assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has favorited your post"
178 assert Impl.format_title(%{activity: activity}) ==
182 test "renders title for create activity with direct visibility" do
183 user = insert(:user, nickname: "Bob")
186 CommonAPI.post(user, %{
187 "visibility" => "direct",
188 "status" => "This is just between you and me, pal"
191 assert Impl.format_title(%{activity: activity}) ==
195 describe "build_content/3" do
196 test "returns info content for direct message with enabled privacy option" do
197 user = insert(:user, nickname: "Bob")
198 user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: true})
201 CommonAPI.post(user, %{
202 "visibility" => "direct",
203 "status" => "<Lorem ipsum dolor sit amet."
206 notif = insert(:notification, user: user2, activity: activity)
208 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
209 object = Object.normalize(activity)
211 assert Impl.build_content(notif, actor, object) == %{
213 title: "New Direct Message"
217 test "returns regular content for direct message with disabled privacy option" do
218 user = insert(:user, nickname: "Bob")
219 user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: false})
222 CommonAPI.post(user, %{
223 "visibility" => "direct",
225 "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
228 notif = insert(:notification, user: user2, activity: activity)
230 actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
231 object = Object.normalize(activity)
233 assert Impl.build_content(notif, actor, object) == %{
235 "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
236 title: "New Direct Message"