Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
9.3KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do
  5. use Pleroma.Web.ConnCase
  6. alias Pleroma.Conversation.Participation
  7. alias Pleroma.Notification
  8. alias Pleroma.Object
  9. alias Pleroma.Repo
  10. alias Pleroma.User
  11. alias Pleroma.Web.CommonAPI
  12. import Pleroma.Factory
  13. test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
  14. user = insert(:user)
  15. other_user = insert(:user)
  16. {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
  17. result =
  18. conn
  19. |> assign(:user, other_user)
  20. |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
  21. |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕")
  22. |> json_response(200)
  23. # We return the status, but this our implementation detail.
  24. assert %{"id" => id} = result
  25. assert to_string(activity.id) == id
  26. assert result["pleroma"]["emoji_reactions"] == [
  27. %{"name" => "☕", "count" => 1, "me" => true}
  28. ]
  29. end
  30. test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
  31. user = insert(:user)
  32. other_user = insert(:user)
  33. {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
  34. {:ok, activity, _object} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
  35. result =
  36. conn
  37. |> assign(:user, other_user)
  38. |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
  39. |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕")
  40. assert %{"id" => id} = json_response(result, 200)
  41. assert to_string(activity.id) == id
  42. object = Object.normalize(activity)
  43. assert object.data["reaction_count"] == 0
  44. end
  45. test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do
  46. user = insert(:user)
  47. other_user = insert(:user)
  48. doomed_user = insert(:user)
  49. {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
  50. result =
  51. conn
  52. |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
  53. |> json_response(200)
  54. assert result == []
  55. {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
  56. {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅")
  57. User.perform(:delete, doomed_user)
  58. result =
  59. conn
  60. |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
  61. |> json_response(200)
  62. [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result
  63. assert represented_user["id"] == other_user.id
  64. result =
  65. conn
  66. |> assign(:user, other_user)
  67. |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"]))
  68. |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")
  69. |> json_response(200)
  70. assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] =
  71. result
  72. end
  73. test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
  74. user = insert(:user)
  75. other_user = insert(:user)
  76. {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
  77. result =
  78. conn
  79. |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")
  80. |> json_response(200)
  81. assert result == []
  82. {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
  83. {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
  84. result =
  85. conn
  86. |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")
  87. |> json_response(200)
  88. [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result
  89. assert represented_user["id"] == other_user.id
  90. end
  91. test "/api/v1/pleroma/conversations/:id" do
  92. user = insert(:user)
  93. %{user: other_user, conn: conn} = oauth_access(["read:statuses"])
  94. {:ok, _activity} =
  95. CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}!", "visibility" => "direct"})
  96. [participation] = Participation.for_user(other_user)
  97. result =
  98. conn
  99. |> get("/api/v1/pleroma/conversations/#{participation.id}")
  100. |> json_response(200)
  101. assert result["id"] == participation.id |> to_string()
  102. end
  103. test "/api/v1/pleroma/conversations/:id/statuses" do
  104. user = insert(:user)
  105. %{user: other_user, conn: conn} = oauth_access(["read:statuses"])
  106. third_user = insert(:user)
  107. {:ok, _activity} =
  108. CommonAPI.post(user, %{"status" => "Hi @#{third_user.nickname}!", "visibility" => "direct"})
  109. {:ok, activity} =
  110. CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}!", "visibility" => "direct"})
  111. [participation] = Participation.for_user(other_user)
  112. {:ok, activity_two} =
  113. CommonAPI.post(other_user, %{
  114. "status" => "Hi!",
  115. "in_reply_to_status_id" => activity.id,
  116. "in_reply_to_conversation_id" => participation.id
  117. })
  118. result =
  119. conn
  120. |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses")
  121. |> json_response(200)
  122. assert length(result) == 2
  123. id_one = activity.id
  124. id_two = activity_two.id
  125. assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result
  126. end
  127. test "PATCH /api/v1/pleroma/conversations/:id" do
  128. %{user: user, conn: conn} = oauth_access(["write:conversations"])
  129. other_user = insert(:user)
  130. {:ok, _activity} = CommonAPI.post(user, %{"status" => "Hi", "visibility" => "direct"})
  131. [participation] = Participation.for_user(user)
  132. participation = Repo.preload(participation, :recipients)
  133. user = User.get_cached_by_id(user.id)
  134. assert [user] == participation.recipients
  135. assert other_user not in participation.recipients
  136. result =
  137. conn
  138. |> patch("/api/v1/pleroma/conversations/#{participation.id}", %{
  139. "recipients" => [user.id, other_user.id]
  140. })
  141. |> json_response(200)
  142. assert result["id"] == participation.id |> to_string
  143. [participation] = Participation.for_user(user)
  144. participation = Repo.preload(participation, :recipients)
  145. assert user in participation.recipients
  146. assert other_user in participation.recipients
  147. end
  148. test "POST /api/v1/pleroma/conversations/read" do
  149. user = insert(:user)
  150. %{user: other_user, conn: conn} = oauth_access(["write:notifications"])
  151. {:ok, _activity} =
  152. CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"})
  153. {:ok, _activity} =
  154. CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"})
  155. [participation2, participation1] = Participation.for_user(other_user)
  156. assert Participation.get(participation2.id).read == false
  157. assert Participation.get(participation1.id).read == false
  158. assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2
  159. [%{"unread" => false}, %{"unread" => false}] =
  160. conn
  161. |> post("/api/v1/pleroma/conversations/read", %{})
  162. |> json_response(200)
  163. [participation2, participation1] = Participation.for_user(other_user)
  164. assert Participation.get(participation2.id).read == true
  165. assert Participation.get(participation1.id).read == true
  166. assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0
  167. end
  168. describe "POST /api/v1/pleroma/notifications/read" do
  169. setup do: oauth_access(["write:notifications"])
  170. test "it marks a single notification as read", %{user: user1, conn: conn} do
  171. user2 = insert(:user)
  172. {:ok, activity1} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"})
  173. {:ok, activity2} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"})
  174. {:ok, [notification1]} = Notification.create_notifications(activity1)
  175. {:ok, [notification2]} = Notification.create_notifications(activity2)
  176. response =
  177. conn
  178. |> post("/api/v1/pleroma/notifications/read", %{"id" => "#{notification1.id}"})
  179. |> json_response(:ok)
  180. assert %{"pleroma" => %{"is_seen" => true}} = response
  181. assert Repo.get(Notification, notification1.id).seen
  182. refute Repo.get(Notification, notification2.id).seen
  183. end
  184. test "it marks multiple notifications as read", %{user: user1, conn: conn} do
  185. user2 = insert(:user)
  186. {:ok, _activity1} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"})
  187. {:ok, _activity2} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"})
  188. {:ok, _activity3} = CommonAPI.post(user2, %{"status" => "HIE @#{user1.nickname}"})
  189. [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3})
  190. [response1, response2] =
  191. conn
  192. |> post("/api/v1/pleroma/notifications/read", %{"max_id" => "#{notification2.id}"})
  193. |> json_response(:ok)
  194. assert %{"pleroma" => %{"is_seen" => true}} = response1
  195. assert %{"pleroma" => %{"is_seen" => true}} = response2
  196. assert Repo.get(Notification, notification1.id).seen
  197. assert Repo.get(Notification, notification2.id).seen
  198. refute Repo.get(Notification, notification3.id).seen
  199. end
  200. test "it returns error when notification not found", %{conn: conn} do
  201. response =
  202. conn
  203. |> post("/api/v1/pleroma/notifications/read", %{"id" => "22222222222222"})
  204. |> json_response(:bad_request)
  205. assert response == %{"error" => "Cannot get notification"}
  206. end
  207. end
  208. end