logo

pleroma

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

conversation_test.exs (5889B)


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