logo

pleroma

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

notification_controller_test.exs (25516B)


  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.MastodonAPI.NotificationControllerTest do
  5. use Pleroma.Web.ConnCase, async: false
  6. alias Pleroma.Notification
  7. alias Pleroma.Repo
  8. alias Pleroma.User
  9. alias Pleroma.Web.CommonAPI
  10. import Pleroma.Factory
  11. setup do
  12. Mox.stub_with(Pleroma.UnstubbedConfigMock, Pleroma.Config)
  13. :ok
  14. end
  15. test "does NOT render account/pleroma/relationship by default" do
  16. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  17. other_user = insert(:user)
  18. {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  19. {:ok, [_notification]} = Notification.create_notifications(activity)
  20. response =
  21. conn
  22. |> assign(:user, user)
  23. |> get("/api/v1/notifications")
  24. |> json_response_and_validate_schema(200)
  25. assert Enum.all?(response, fn n ->
  26. get_in(n, ["account", "pleroma", "relationship"]) == %{}
  27. end)
  28. end
  29. test "list of notifications" do
  30. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  31. other_user = insert(:user)
  32. {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  33. {:ok, [_notification]} = Notification.create_notifications(activity)
  34. conn =
  35. conn
  36. |> assign(:user, user)
  37. |> get("/api/v1/notifications")
  38. expected_response =
  39. "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{user.ap_id}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
  40. assert [%{"status" => %{"content" => response}} | _rest] =
  41. json_response_and_validate_schema(conn, 200)
  42. assert response == expected_response
  43. end
  44. test "by default, does not contain pleroma:chat_mention" do
  45. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  46. other_user = insert(:user)
  47. {:ok, _activity} = CommonAPI.post_chat_message(other_user, user, "hey")
  48. result =
  49. conn
  50. |> get("/api/v1/notifications")
  51. |> json_response_and_validate_schema(200)
  52. assert [] == result
  53. result =
  54. conn
  55. |> get("/api/v1/notifications?include_types[]=pleroma:chat_mention")
  56. |> json_response_and_validate_schema(200)
  57. assert [_] = result
  58. end
  59. test "by default, does not contain pleroma:report" do
  60. clear_config([:instance, :moderator_privileges], [:reports_manage_reports])
  61. user = insert(:user)
  62. other_user = insert(:user)
  63. third_user = insert(:user)
  64. {:ok, user} = user |> User.admin_api_update(%{is_moderator: true})
  65. %{conn: conn} = oauth_access(["read:notifications"], user: user)
  66. {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"})
  67. {:ok, _report} =
  68. CommonAPI.report(third_user, %{account_id: other_user.id, status_ids: [activity.id]})
  69. result =
  70. conn
  71. |> get("/api/v1/notifications")
  72. |> json_response_and_validate_schema(200)
  73. assert [] == result
  74. result =
  75. conn
  76. |> get("/api/v1/notifications?include_types[]=pleroma:report")
  77. |> json_response_and_validate_schema(200)
  78. assert [_] = result
  79. end
  80. test "Pleroma:report is hidden for non-privileged users" do
  81. clear_config([:instance, :moderator_privileges], [:reports_manage_reports])
  82. user = insert(:user)
  83. other_user = insert(:user)
  84. third_user = insert(:user)
  85. {:ok, user} = user |> User.admin_api_update(%{is_moderator: true})
  86. %{conn: conn} = oauth_access(["read:notifications"], user: user)
  87. {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"})
  88. {:ok, _report} =
  89. CommonAPI.report(third_user, %{account_id: other_user.id, status_ids: [activity.id]})
  90. result =
  91. conn
  92. |> get("/api/v1/notifications?include_types[]=pleroma:report")
  93. |> json_response_and_validate_schema(200)
  94. assert [_] = result
  95. clear_config([:instance, :moderator_privileges], [])
  96. result =
  97. conn
  98. |> get("/api/v1/notifications?include_types[]=pleroma:report")
  99. |> json_response_and_validate_schema(200)
  100. assert [] == result
  101. end
  102. test "excludes mentions from blockers when blockers_visible is false" do
  103. clear_config([:activitypub, :blockers_visible], false)
  104. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  105. blocker = insert(:user)
  106. {:ok, _} = CommonAPI.block(blocker, user)
  107. {:ok, activity} = CommonAPI.post(blocker, %{status: "hi @#{user.nickname}"})
  108. {:ok, [_notification]} = Notification.create_notifications(activity)
  109. conn =
  110. conn
  111. |> assign(:user, user)
  112. |> get("/api/v1/notifications")
  113. assert [] == json_response_and_validate_schema(conn, 200)
  114. end
  115. test "getting a single notification" do
  116. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  117. other_user = insert(:user)
  118. {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  119. {:ok, [notification]} = Notification.create_notifications(activity)
  120. conn = get(conn, "/api/v1/notifications/#{notification.id}")
  121. expected_response =
  122. "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{user.ap_id}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
  123. assert %{"status" => %{"content" => response}} = json_response_and_validate_schema(conn, 200)
  124. assert response == expected_response
  125. end
  126. test "dismissing a single notification (deprecated endpoint)" do
  127. %{user: user, conn: conn} = oauth_access(["write:notifications"])
  128. other_user = insert(:user)
  129. {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  130. {:ok, [notification]} = Notification.create_notifications(activity)
  131. conn =
  132. conn
  133. |> assign(:user, user)
  134. |> put_req_header("content-type", "application/json")
  135. |> post("/api/v1/notifications/dismiss", %{"id" => to_string(notification.id)})
  136. assert %{} = json_response_and_validate_schema(conn, 200)
  137. end
  138. test "dismissing a single notification" do
  139. %{user: user, conn: conn} = oauth_access(["write:notifications"])
  140. other_user = insert(:user)
  141. {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  142. {:ok, [notification]} = Notification.create_notifications(activity)
  143. conn =
  144. conn
  145. |> assign(:user, user)
  146. |> post("/api/v1/notifications/#{notification.id}/dismiss")
  147. assert %{} = json_response_and_validate_schema(conn, 200)
  148. end
  149. test "clearing all notifications" do
  150. %{user: user, conn: conn} = oauth_access(["write:notifications", "read:notifications"])
  151. other_user = insert(:user)
  152. {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  153. {:ok, [_notification]} = Notification.create_notifications(activity)
  154. ret_conn = post(conn, "/api/v1/notifications/clear")
  155. assert %{} = json_response_and_validate_schema(ret_conn, 200)
  156. ret_conn = get(conn, "/api/v1/notifications")
  157. assert all = json_response_and_validate_schema(ret_conn, 200)
  158. assert all == []
  159. end
  160. test "paginates notifications using min_id, since_id, max_id, and limit" do
  161. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  162. other_user = insert(:user)
  163. {:ok, activity1} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  164. {:ok, activity2} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  165. {:ok, activity3} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  166. {:ok, activity4} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  167. notification1_id = get_notification_id_by_activity(activity1)
  168. notification2_id = get_notification_id_by_activity(activity2)
  169. notification3_id = get_notification_id_by_activity(activity3)
  170. notification4_id = get_notification_id_by_activity(activity4)
  171. conn = assign(conn, :user, user)
  172. # min_id
  173. result =
  174. conn
  175. |> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}")
  176. |> json_response_and_validate_schema(:ok)
  177. assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
  178. # since_id
  179. result =
  180. conn
  181. |> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}")
  182. |> json_response_and_validate_schema(:ok)
  183. assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
  184. # max_id
  185. result =
  186. conn
  187. |> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}")
  188. |> json_response_and_validate_schema(:ok)
  189. assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
  190. end
  191. describe "exclude_visibilities" do
  192. test "filters notifications for mentions" do
  193. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  194. other_user = insert(:user)
  195. {:ok, public_activity} =
  196. CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "public"})
  197. {:ok, direct_activity} =
  198. CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "direct"})
  199. {:ok, unlisted_activity} =
  200. CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "unlisted"})
  201. {:ok, private_activity} =
  202. CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "private"})
  203. query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "private"]})
  204. conn_res = get(conn, "/api/v1/notifications?" <> query)
  205. assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
  206. assert id == direct_activity.id
  207. query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "direct"]})
  208. conn_res = get(conn, "/api/v1/notifications?" <> query)
  209. assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
  210. assert id == private_activity.id
  211. query = params_to_query(%{exclude_visibilities: ["public", "private", "direct"]})
  212. conn_res = get(conn, "/api/v1/notifications?" <> query)
  213. assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
  214. assert id == unlisted_activity.id
  215. query = params_to_query(%{exclude_visibilities: ["unlisted", "private", "direct"]})
  216. conn_res = get(conn, "/api/v1/notifications?" <> query)
  217. assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
  218. assert id == public_activity.id
  219. end
  220. test "filters notifications for Like activities" do
  221. user = insert(:user)
  222. %{user: other_user, conn: conn} = oauth_access(["read:notifications"])
  223. {:ok, public_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "public"})
  224. {:ok, direct_activity} =
  225. CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "direct"})
  226. {:ok, unlisted_activity} =
  227. CommonAPI.post(other_user, %{status: ".", visibility: "unlisted"})
  228. {:ok, private_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "private"})
  229. {:ok, _} = CommonAPI.favorite(user, public_activity.id)
  230. {:ok, _} = CommonAPI.favorite(user, direct_activity.id)
  231. {:ok, _} = CommonAPI.favorite(user, unlisted_activity.id)
  232. {:ok, _} = CommonAPI.favorite(user, private_activity.id)
  233. activity_ids =
  234. conn
  235. |> get("/api/v1/notifications?exclude_visibilities[]=direct")
  236. |> json_response_and_validate_schema(200)
  237. |> Enum.map(& &1["status"]["id"])
  238. assert public_activity.id in activity_ids
  239. assert unlisted_activity.id in activity_ids
  240. assert private_activity.id in activity_ids
  241. refute direct_activity.id in activity_ids
  242. activity_ids =
  243. conn
  244. |> get("/api/v1/notifications?exclude_visibilities[]=unlisted")
  245. |> json_response_and_validate_schema(200)
  246. |> Enum.map(& &1["status"]["id"])
  247. assert public_activity.id in activity_ids
  248. refute unlisted_activity.id in activity_ids
  249. assert private_activity.id in activity_ids
  250. assert direct_activity.id in activity_ids
  251. activity_ids =
  252. conn
  253. |> get("/api/v1/notifications?exclude_visibilities[]=private")
  254. |> json_response_and_validate_schema(200)
  255. |> Enum.map(& &1["status"]["id"])
  256. assert public_activity.id in activity_ids
  257. assert unlisted_activity.id in activity_ids
  258. refute private_activity.id in activity_ids
  259. assert direct_activity.id in activity_ids
  260. activity_ids =
  261. conn
  262. |> get("/api/v1/notifications?exclude_visibilities[]=public")
  263. |> json_response_and_validate_schema(200)
  264. |> Enum.map(& &1["status"]["id"])
  265. refute public_activity.id in activity_ids
  266. assert unlisted_activity.id in activity_ids
  267. assert private_activity.id in activity_ids
  268. assert direct_activity.id in activity_ids
  269. end
  270. test "filters notifications for Announce activities" do
  271. user = insert(:user)
  272. %{user: other_user, conn: conn} = oauth_access(["read:notifications"])
  273. {:ok, public_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "public"})
  274. {:ok, unlisted_activity} =
  275. CommonAPI.post(other_user, %{status: ".", visibility: "unlisted"})
  276. {:ok, _} = CommonAPI.repeat(public_activity.id, user)
  277. {:ok, _} = CommonAPI.repeat(unlisted_activity.id, user)
  278. activity_ids =
  279. conn
  280. |> get("/api/v1/notifications?exclude_visibilities[]=unlisted")
  281. |> json_response_and_validate_schema(200)
  282. |> Enum.map(& &1["status"]["id"])
  283. assert public_activity.id in activity_ids
  284. refute unlisted_activity.id in activity_ids
  285. end
  286. test "doesn't return less than the requested amount of records when the user's reply is liked" do
  287. user = insert(:user)
  288. %{user: other_user, conn: conn} = oauth_access(["read:notifications"])
  289. {:ok, mention} =
  290. CommonAPI.post(user, %{status: "@#{other_user.nickname}", visibility: "public"})
  291. {:ok, activity} = CommonAPI.post(user, %{status: ".", visibility: "public"})
  292. {:ok, reply} =
  293. CommonAPI.post(other_user, %{
  294. status: ".",
  295. visibility: "public",
  296. in_reply_to_status_id: activity.id
  297. })
  298. {:ok, _favorite} = CommonAPI.favorite(user, reply.id)
  299. activity_ids =
  300. conn
  301. |> get("/api/v1/notifications?exclude_visibilities[]=direct&limit=2")
  302. |> json_response_and_validate_schema(200)
  303. |> Enum.map(& &1["status"]["id"])
  304. assert [reply.id, mention.id] == activity_ids
  305. end
  306. end
  307. test "filters notifications using exclude_types" do
  308. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  309. other_user = insert(:user)
  310. {:ok, mention_activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"})
  311. {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
  312. {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id)
  313. {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, other_user)
  314. {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user)
  315. mention_notification_id = get_notification_id_by_activity(mention_activity)
  316. favorite_notification_id = get_notification_id_by_activity(favorite_activity)
  317. reblog_notification_id = get_notification_id_by_activity(reblog_activity)
  318. follow_notification_id = get_notification_id_by_activity(follow_activity)
  319. query = params_to_query(%{exclude_types: ["mention", "favourite", "reblog"]})
  320. conn_res = get(conn, "/api/v1/notifications?" <> query)
  321. assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200)
  322. query = params_to_query(%{exclude_types: ["favourite", "reblog", "follow"]})
  323. conn_res = get(conn, "/api/v1/notifications?" <> query)
  324. assert [%{"id" => ^mention_notification_id}] =
  325. json_response_and_validate_schema(conn_res, 200)
  326. query = params_to_query(%{exclude_types: ["reblog", "follow", "mention"]})
  327. conn_res = get(conn, "/api/v1/notifications?" <> query)
  328. assert [%{"id" => ^favorite_notification_id}] =
  329. json_response_and_validate_schema(conn_res, 200)
  330. query = params_to_query(%{exclude_types: ["follow", "mention", "favourite"]})
  331. conn_res = get(conn, "/api/v1/notifications?" <> query)
  332. assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200)
  333. end
  334. test "filters notifications using types" do
  335. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  336. other_user = insert(:user)
  337. {:ok, mention_activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"})
  338. {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
  339. {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id)
  340. {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, other_user)
  341. {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user)
  342. mention_notification_id = get_notification_id_by_activity(mention_activity)
  343. favorite_notification_id = get_notification_id_by_activity(favorite_activity)
  344. reblog_notification_id = get_notification_id_by_activity(reblog_activity)
  345. follow_notification_id = get_notification_id_by_activity(follow_activity)
  346. conn_res = get(conn, "/api/v1/notifications?types[]=follow")
  347. assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200)
  348. conn_res = get(conn, "/api/v1/notifications?types[]=mention")
  349. assert [%{"id" => ^mention_notification_id}] =
  350. json_response_and_validate_schema(conn_res, 200)
  351. conn_res = get(conn, "/api/v1/notifications?types[]=favourite")
  352. assert [%{"id" => ^favorite_notification_id}] =
  353. json_response_and_validate_schema(conn_res, 200)
  354. conn_res = get(conn, "/api/v1/notifications?types[]=reblog")
  355. assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200)
  356. result = conn |> get("/api/v1/notifications") |> json_response_and_validate_schema(200)
  357. assert length(result) == 4
  358. query = params_to_query(%{types: ["follow", "mention", "favourite", "reblog"]})
  359. result =
  360. conn
  361. |> get("/api/v1/notifications?" <> query)
  362. |> json_response_and_validate_schema(200)
  363. assert length(result) == 4
  364. end
  365. test "filtering falls back to include_types" do
  366. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  367. other_user = insert(:user)
  368. {:ok, _activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"})
  369. {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"})
  370. {:ok, _activity} = CommonAPI.favorite(other_user, create_activity.id)
  371. {:ok, _activity} = CommonAPI.repeat(create_activity.id, other_user)
  372. {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user)
  373. follow_notification_id = get_notification_id_by_activity(follow_activity)
  374. conn_res = get(conn, "/api/v1/notifications?include_types[]=follow")
  375. assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200)
  376. end
  377. test "destroy multiple" do
  378. %{user: user, conn: conn} = oauth_access(["read:notifications", "write:notifications"])
  379. other_user = insert(:user)
  380. {:ok, activity1} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  381. {:ok, activity2} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
  382. {:ok, activity3} = CommonAPI.post(user, %{status: "hi @#{other_user.nickname}"})
  383. {:ok, activity4} = CommonAPI.post(user, %{status: "hi @#{other_user.nickname}"})
  384. notification1_id = get_notification_id_by_activity(activity1)
  385. notification2_id = get_notification_id_by_activity(activity2)
  386. notification3_id = get_notification_id_by_activity(activity3)
  387. notification4_id = get_notification_id_by_activity(activity4)
  388. result =
  389. conn
  390. |> get("/api/v1/notifications")
  391. |> json_response_and_validate_schema(:ok)
  392. assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result
  393. conn2 =
  394. conn
  395. |> assign(:user, other_user)
  396. |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:notifications"]))
  397. result =
  398. conn2
  399. |> get("/api/v1/notifications")
  400. |> json_response_and_validate_schema(:ok)
  401. assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
  402. query = params_to_query(%{ids: [notification1_id, notification2_id]})
  403. conn_destroy = delete(conn, "/api/v1/notifications/destroy_multiple?" <> query)
  404. assert json_response_and_validate_schema(conn_destroy, 200) == %{}
  405. result =
  406. conn2
  407. |> get("/api/v1/notifications")
  408. |> json_response_and_validate_schema(:ok)
  409. assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
  410. end
  411. test "doesn't see notifications after muting user with notifications" do
  412. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  413. user2 = insert(:user)
  414. {:ok, _, _, _} = CommonAPI.follow(user, user2)
  415. {:ok, _} = CommonAPI.post(user2, %{status: "hey @#{user.nickname}"})
  416. ret_conn = get(conn, "/api/v1/notifications")
  417. assert length(json_response_and_validate_schema(ret_conn, 200)) == 1
  418. {:ok, _user_relationships} = User.mute(user, user2)
  419. conn = get(conn, "/api/v1/notifications")
  420. assert json_response_and_validate_schema(conn, 200) == []
  421. end
  422. test "see notifications after muting user without notifications" do
  423. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  424. user2 = insert(:user)
  425. {:ok, _, _, _} = CommonAPI.follow(user, user2)
  426. {:ok, _} = CommonAPI.post(user2, %{status: "hey @#{user.nickname}"})
  427. ret_conn = get(conn, "/api/v1/notifications")
  428. assert length(json_response_and_validate_schema(ret_conn, 200)) == 1
  429. {:ok, _user_relationships} = User.mute(user, user2, %{notifications: false})
  430. conn = get(conn, "/api/v1/notifications")
  431. assert length(json_response_and_validate_schema(conn, 200)) == 1
  432. end
  433. test "see notifications after muting user with notifications and with_muted parameter" do
  434. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  435. user2 = insert(:user)
  436. {:ok, _, _, _} = CommonAPI.follow(user, user2)
  437. {:ok, _} = CommonAPI.post(user2, %{status: "hey @#{user.nickname}"})
  438. ret_conn = get(conn, "/api/v1/notifications")
  439. assert length(json_response_and_validate_schema(ret_conn, 200)) == 1
  440. {:ok, _user_relationships} = User.mute(user, user2)
  441. conn = get(conn, "/api/v1/notifications?with_muted=true")
  442. assert length(json_response_and_validate_schema(conn, 200)) == 1
  443. end
  444. test "see move notifications" do
  445. old_user = insert(:user)
  446. new_user = insert(:user, also_known_as: [old_user.ap_id])
  447. %{user: follower, conn: conn} = oauth_access(["read:notifications"])
  448. User.follow(follower, old_user)
  449. Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
  450. Pleroma.Tests.ObanHelpers.perform_all()
  451. conn = get(conn, "/api/v1/notifications")
  452. assert length(json_response_and_validate_schema(conn, 200)) == 1
  453. end
  454. describe "link headers" do
  455. test "preserves parameters in link headers" do
  456. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  457. other_user = insert(:user)
  458. {:ok, activity1} =
  459. CommonAPI.post(other_user, %{
  460. status: "hi @#{user.nickname}",
  461. visibility: "public"
  462. })
  463. {:ok, activity2} =
  464. CommonAPI.post(other_user, %{
  465. status: "hi @#{user.nickname}",
  466. visibility: "public"
  467. })
  468. notification1 = Repo.get_by(Notification, activity_id: activity1.id)
  469. notification2 = Repo.get_by(Notification, activity_id: activity2.id)
  470. conn =
  471. conn
  472. |> assign(:user, user)
  473. |> get("/api/v1/notifications?limit=5")
  474. assert [link_header] = get_resp_header(conn, "link")
  475. assert link_header =~ ~r/limit=5/
  476. assert link_header =~ ~r/min_id=#{notification2.id}/
  477. assert link_header =~ ~r/max_id=#{notification1.id}/
  478. end
  479. end
  480. describe "from specified user" do
  481. test "account_id" do
  482. %{user: user, conn: conn} = oauth_access(["read:notifications"])
  483. %{id: account_id} = other_user1 = insert(:user)
  484. other_user2 = insert(:user)
  485. {:ok, _activity} = CommonAPI.post(other_user1, %{status: "hi @#{user.nickname}"})
  486. {:ok, _activity} = CommonAPI.post(other_user2, %{status: "bye @#{user.nickname}"})
  487. assert [%{"account" => %{"id" => ^account_id}}] =
  488. conn
  489. |> assign(:user, user)
  490. |> get("/api/v1/notifications?account_id=#{account_id}")
  491. |> json_response_and_validate_schema(200)
  492. assert %{"error" => "Account is not found"} =
  493. conn
  494. |> assign(:user, user)
  495. |> get("/api/v1/notifications?account_id=cofe")
  496. |> json_response_and_validate_schema(404)
  497. end
  498. end
  499. defp get_notification_id_by_activity(%{id: id}) do
  500. Notification
  501. |> Repo.get_by(activity_id: id)
  502. |> Map.get(:id)
  503. |> to_string()
  504. end
  505. defp params_to_query(%{} = params) do
  506. Enum.map_join(params, "&", fn
  507. {k, v} when is_list(v) -> Enum.map_join(v, "&", &"#{k}[]=#{&1}")
  508. {k, v} -> k <> "=" <> v
  509. end)
  510. end
  511. end