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.

206 lines
5.8KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.ConversationTest do
  5. use Pleroma.DataCase
  6. alias Pleroma.Activity
  7. alias Pleroma.Conversation
  8. alias Pleroma.Object
  9. alias Pleroma.Web.CommonAPI
  10. import Pleroma.Factory
  11. setup_all do
  12. config_path = [:instance, :federating]
  13. initial_setting = Pleroma.Config.get(config_path)
  14. Pleroma.Config.put(config_path, true)
  15. on_exit(fn -> Pleroma.Config.put(config_path, initial_setting) end)
  16. :ok
  17. end
  18. test "it goes through old direct conversations" do
  19. user = insert(:user)
  20. other_user = insert(:user)
  21. {:ok, _activity} =
  22. CommonAPI.post(user, %{"visibility" => "direct", "status" => "hey @#{other_user.nickname}"})
  23. Repo.delete_all(Conversation)
  24. Repo.delete_all(Conversation.Participation)
  25. refute Repo.one(Conversation)
  26. Conversation.bump_for_all_activities()
  27. assert Repo.one(Conversation)
  28. [participation, _p2] = Repo.all(Conversation.Participation)
  29. assert participation.read
  30. end
  31. test "it creates a conversation for given ap_id" do
  32. assert {:ok, %Conversation{} = conversation} =
  33. Conversation.create_for_ap_id("https://some_ap_id")
  34. # Inserting again returns the same
  35. assert {:ok, conversation_two} = Conversation.create_for_ap_id("https://some_ap_id")
  36. assert conversation_two.id == conversation.id
  37. end
  38. test "public posts don't create conversations" do
  39. user = insert(:user)
  40. {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey"})
  41. object = Pleroma.Object.normalize(activity)
  42. context = object.data["context"]
  43. conversation = Conversation.get_for_ap_id(context)
  44. refute conversation
  45. end
  46. test "it creates or updates a conversation and participations for a given DM" do
  47. har = insert(:user)
  48. jafnhar = insert(:user, local: false)
  49. tridi = insert(:user)
  50. {:ok, activity} =
  51. CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"})
  52. object = Pleroma.Object.normalize(activity)
  53. context = object.data["context"]
  54. conversation =
  55. Conversation.get_for_ap_id(context)
  56. |> Repo.preload(:participations)
  57. assert conversation
  58. assert Enum.find(conversation.participations, fn %{user_id: user_id} -> har.id == user_id end)
  59. assert Enum.find(conversation.participations, fn %{user_id: user_id} ->
  60. jafnhar.id == user_id
  61. end)
  62. {:ok, activity} =
  63. CommonAPI.post(jafnhar, %{
  64. "status" => "Hey @#{har.nickname}",
  65. "visibility" => "direct",
  66. "in_reply_to_status_id" => activity.id
  67. })
  68. object = Pleroma.Object.normalize(activity)
  69. context = object.data["context"]
  70. conversation_two =
  71. Conversation.get_for_ap_id(context)
  72. |> Repo.preload(:participations)
  73. assert conversation_two.id == conversation.id
  74. assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
  75. har.id == user_id
  76. end)
  77. assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
  78. jafnhar.id == user_id
  79. end)
  80. {:ok, activity} =
  81. CommonAPI.post(tridi, %{
  82. "status" => "Hey @#{har.nickname}",
  83. "visibility" => "direct",
  84. "in_reply_to_status_id" => activity.id
  85. })
  86. object = Pleroma.Object.normalize(activity)
  87. context = object.data["context"]
  88. conversation_three =
  89. Conversation.get_for_ap_id(context)
  90. |> Repo.preload([:participations, :users])
  91. assert conversation_three.id == conversation.id
  92. assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
  93. har.id == user_id
  94. end)
  95. assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
  96. jafnhar.id == user_id
  97. end)
  98. assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
  99. tridi.id == user_id
  100. end)
  101. assert Enum.find(conversation_three.users, fn %{id: user_id} ->
  102. har.id == user_id
  103. end)
  104. assert Enum.find(conversation_three.users, fn %{id: user_id} ->
  105. jafnhar.id == user_id
  106. end)
  107. assert Enum.find(conversation_three.users, fn %{id: user_id} ->
  108. tridi.id == user_id
  109. end)
  110. end
  111. test "create_or_bump_for returns the conversation with participations" do
  112. har = insert(:user)
  113. jafnhar = insert(:user, local: false)
  114. {:ok, activity} =
  115. CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"})
  116. {:ok, conversation} = Conversation.create_or_bump_for(activity)
  117. assert length(conversation.participations) == 2
  118. {:ok, activity} =
  119. CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "public"})
  120. assert {:error, _} = Conversation.create_or_bump_for(activity)
  121. end
  122. test "create_or_bump_for does not normalize objects before checking the activity type" do
  123. note = insert(:note)
  124. note_id = note.data["id"]
  125. Repo.delete(note)
  126. refute Object.get_by_ap_id(note_id)
  127. Tesla.Mock.mock(fn env ->
  128. case env.url do
  129. ^note_id ->
  130. # TODO: add attributedTo and tag to the note factory
  131. body =
  132. note.data
  133. |> Map.put("attributedTo", note.data["actor"])
  134. |> Map.put("tag", [])
  135. |> Jason.encode!()
  136. %Tesla.Env{status: 200, body: body}
  137. end
  138. end)
  139. undo = %Activity{
  140. id: "fake",
  141. data: %{
  142. "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
  143. "actor" => note.data["actor"],
  144. "to" => [note.data["actor"]],
  145. "object" => note_id,
  146. "type" => "Undo"
  147. }
  148. }
  149. Conversation.create_or_bump_for(undo)
  150. refute Object.get_by_ap_id(note_id)
  151. end
  152. end