Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

642 satır
23KB

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