logo

pleroma

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

conversation_controller_test.exs (8128B)


  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.ConversationControllerTest do
  5. use Pleroma.Web.ConnCase, async: true
  6. alias Pleroma.Conversation.Participation
  7. alias Pleroma.User
  8. alias Pleroma.Web.CommonAPI
  9. import Pleroma.Factory
  10. setup do: oauth_access(["read:statuses"])
  11. describe "returns a list of conversations" do
  12. setup(%{user: user_one, conn: conn}) do
  13. user_two = insert(:user)
  14. user_three = insert(:user)
  15. {:ok, user_two, user_one} = User.follow(user_two, user_one)
  16. {:ok, %{user: user_one, user_two: user_two, user_three: user_three, conn: conn}}
  17. end
  18. test "returns correct conversations", %{
  19. user: user_one,
  20. user_two: user_two,
  21. user_three: user_three,
  22. conn: conn
  23. } do
  24. assert Participation.unread_count(user_two) == 0
  25. {:ok, direct} = create_direct_message(user_one, [user_two, user_three])
  26. assert Participation.unread_count(user_two) == 1
  27. {:ok, _follower_only} =
  28. CommonAPI.post(user_one, %{
  29. status: "Hi @#{user_two.nickname}!",
  30. visibility: "private"
  31. })
  32. res_conn = get(conn, "/api/v1/conversations")
  33. assert response = json_response_and_validate_schema(res_conn, 200)
  34. assert [
  35. %{
  36. "id" => res_id,
  37. "accounts" => res_accounts,
  38. "last_status" => res_last_status,
  39. "unread" => unread
  40. }
  41. ] = response
  42. account_ids = Enum.map(res_accounts, & &1["id"])
  43. assert length(res_accounts) == 2
  44. assert user_one.id not in account_ids
  45. assert user_two.id in account_ids
  46. assert user_three.id in account_ids
  47. assert is_binary(res_id)
  48. assert unread == false
  49. assert res_last_status["id"] == direct.id
  50. assert res_last_status["account"]["id"] == user_one.id
  51. assert Participation.unread_count(user_one) == 0
  52. end
  53. test "includes the user if the user is the only participant", %{
  54. user: user_one,
  55. conn: conn
  56. } do
  57. {:ok, _direct} = create_direct_message(user_one, [])
  58. res_conn = get(conn, "/api/v1/conversations")
  59. assert response = json_response_and_validate_schema(res_conn, 200)
  60. assert [
  61. %{
  62. "accounts" => [account]
  63. }
  64. ] = response
  65. assert user_one.id == account["id"]
  66. end
  67. test "observes limit params", %{
  68. user: user_one,
  69. user_two: user_two,
  70. user_three: user_three,
  71. conn: conn
  72. } do
  73. {:ok, _} = create_direct_message(user_one, [user_two, user_three])
  74. {:ok, _} = create_direct_message(user_two, [user_one, user_three])
  75. {:ok, _} = create_direct_message(user_three, [user_two, user_one])
  76. res_conn = get(conn, "/api/v1/conversations?limit=1")
  77. assert response = json_response_and_validate_schema(res_conn, 200)
  78. assert Enum.count(response) == 1
  79. res_conn = get(conn, "/api/v1/conversations?limit=2")
  80. assert response = json_response_and_validate_schema(res_conn, 200)
  81. assert Enum.count(response) == 2
  82. end
  83. end
  84. test "filters conversations by recipients", %{user: user_one, conn: conn} do
  85. user_two = insert(:user)
  86. user_three = insert(:user)
  87. {:ok, direct1} = create_direct_message(user_one, [user_two])
  88. {:ok, _direct2} = create_direct_message(user_one, [user_three])
  89. {:ok, direct3} = create_direct_message(user_one, [user_two, user_three])
  90. {:ok, _direct4} = create_direct_message(user_two, [user_three])
  91. {:ok, direct5} = create_direct_message(user_two, [user_one])
  92. assert [conversation1, conversation2] =
  93. conn
  94. |> get("/api/v1/conversations?recipients[]=#{user_two.id}")
  95. |> json_response_and_validate_schema(200)
  96. assert conversation1["last_status"]["id"] == direct5.id
  97. assert conversation2["last_status"]["id"] == direct1.id
  98. [conversation1] =
  99. conn
  100. |> get("/api/v1/conversations?recipients[]=#{user_two.id}&recipients[]=#{user_three.id}")
  101. |> json_response_and_validate_schema(200)
  102. assert conversation1["last_status"]["id"] == direct3.id
  103. end
  104. test "updates the last_status on reply", %{user: user_one, conn: conn} do
  105. user_two = insert(:user)
  106. {:ok, direct} = create_direct_message(user_one, [user_two])
  107. {:ok, direct_reply} =
  108. CommonAPI.post(user_two, %{
  109. status: "reply",
  110. visibility: "direct",
  111. in_reply_to_status_id: direct.id
  112. })
  113. [%{"last_status" => res_last_status}] =
  114. conn
  115. |> get("/api/v1/conversations")
  116. |> json_response_and_validate_schema(200)
  117. assert res_last_status["id"] == direct_reply.id
  118. end
  119. test "the user marks a conversation as read", %{user: user_one, conn: conn} do
  120. user_two = insert(:user)
  121. {:ok, direct} = create_direct_message(user_one, [user_two])
  122. assert Participation.unread_count(user_one) == 0
  123. assert Participation.unread_count(user_two) == 1
  124. user_two_conn =
  125. build_conn()
  126. |> assign(:user, user_two)
  127. |> assign(
  128. :token,
  129. insert(:oauth_token, user: user_two, scopes: ["read:statuses", "write:conversations"])
  130. )
  131. [%{"id" => direct_conversation_id, "unread" => true}] =
  132. user_two_conn
  133. |> get("/api/v1/conversations")
  134. |> json_response_and_validate_schema(200)
  135. %{"unread" => false} =
  136. user_two_conn
  137. |> post("/api/v1/conversations/#{direct_conversation_id}/read")
  138. |> json_response_and_validate_schema(200)
  139. assert Participation.unread_count(user_one) == 0
  140. assert Participation.unread_count(user_two) == 0
  141. # The conversation is marked as unread on reply
  142. {:ok, _} =
  143. CommonAPI.post(user_two, %{
  144. status: "reply",
  145. visibility: "direct",
  146. in_reply_to_status_id: direct.id
  147. })
  148. [%{"unread" => true}] =
  149. conn
  150. |> get("/api/v1/conversations")
  151. |> json_response_and_validate_schema(200)
  152. assert Participation.unread_count(user_one) == 1
  153. assert Participation.unread_count(user_two) == 0
  154. # A reply doesn't increment the user's unread_conversation_count if the conversation is unread
  155. {:ok, _} =
  156. CommonAPI.post(user_two, %{
  157. status: "reply",
  158. visibility: "direct",
  159. in_reply_to_status_id: direct.id
  160. })
  161. assert Participation.unread_count(user_one) == 1
  162. assert Participation.unread_count(user_two) == 0
  163. end
  164. test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do
  165. user_two = insert(:user)
  166. {:ok, direct} = create_direct_message(user_one, [user_two])
  167. res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context")
  168. assert %{"ancestors" => [], "descendants" => []} ==
  169. json_response_and_validate_schema(res_conn, 200)
  170. end
  171. test "Removes a conversation", %{user: user_one, conn: conn} do
  172. user_two = insert(:user)
  173. token = insert(:oauth_token, user: user_one, scopes: ["read:statuses", "write:conversations"])
  174. {:ok, _direct} = create_direct_message(user_one, [user_two])
  175. {:ok, _direct} = create_direct_message(user_one, [user_two])
  176. assert [%{"id" => conv1_id}, %{"id" => conv2_id}] =
  177. conn
  178. |> assign(:token, token)
  179. |> get("/api/v1/conversations")
  180. |> json_response_and_validate_schema(200)
  181. assert %{} =
  182. conn
  183. |> assign(:token, token)
  184. |> delete("/api/v1/conversations/#{conv1_id}")
  185. |> json_response_and_validate_schema(200)
  186. assert [%{"id" => ^conv2_id}] =
  187. conn
  188. |> assign(:token, token)
  189. |> get("/api/v1/conversations")
  190. |> json_response_and_validate_schema(200)
  191. end
  192. defp create_direct_message(sender, recips) do
  193. hellos =
  194. recips
  195. |> Enum.map(fn s -> "@#{s.nickname}" end)
  196. |> Enum.join(", ")
  197. CommonAPI.post(sender, %{
  198. status: "Hi #{hellos}!",
  199. visibility: "direct"
  200. })
  201. end
  202. end