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.

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