logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

impl_test.exs (12215B)


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