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.

200 lines
5.7KB

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