1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.ConversationTest do
8 alias Pleroma.Conversation
10 alias Pleroma.Web.CommonAPI
12 import Pleroma.Factory
14 setup_all do: clear_config([:instance, :federating], true)
17 Mox.stub_with(Pleroma.UnstubbedConfigMock, Pleroma.Config)
21 test "it goes through old direct conversations" do
23 other_user = insert(:user)
26 CommonAPI.post(user, %{visibility: "direct", status: "hey @#{other_user.nickname}"})
28 Pleroma.Tests.ObanHelpers.perform_all()
30 Repo.delete_all(Conversation)
31 Repo.delete_all(Conversation.Participation)
33 refute Repo.one(Conversation)
35 Conversation.bump_for_all_activities()
37 assert Repo.one(Conversation)
38 [participation, _p2] = Repo.all(Conversation.Participation)
40 assert participation.read
43 test "it creates a conversation for given ap_id" do
44 assert {:ok, %Conversation{} = conversation} =
45 Conversation.create_for_ap_id("https://some_ap_id")
47 # Inserting again returns the same
48 assert {:ok, conversation_two} = Conversation.create_for_ap_id("https://some_ap_id")
49 assert conversation_two.id == conversation.id
52 test "public posts don't create conversations" do
54 {:ok, activity} = CommonAPI.post(user, %{status: "Hey"})
56 object = Pleroma.Object.normalize(activity, fetch: false)
57 context = object.data["context"]
59 conversation = Conversation.get_for_ap_id(context)
64 test "it creates or updates a conversation and participations for a given DM" do
66 jafnhar = insert(:user, local: false)
70 CommonAPI.post(har, %{status: "Hey @#{jafnhar.nickname}", visibility: "direct"})
72 object = Pleroma.Object.normalize(activity, fetch: false)
73 context = object.data["context"]
76 Conversation.get_for_ap_id(context)
77 |> Repo.preload(:participations)
81 assert Enum.find(conversation.participations, fn %{user_id: user_id} -> har.id == user_id end)
83 assert Enum.find(conversation.participations, fn %{user_id: user_id} ->
88 CommonAPI.post(jafnhar, %{
89 status: "Hey @#{har.nickname}",
91 in_reply_to_status_id: activity.id
94 object = Pleroma.Object.normalize(activity, fetch: false)
95 context = object.data["context"]
98 Conversation.get_for_ap_id(context)
99 |> Repo.preload(:participations)
101 assert conversation_two.id == conversation.id
103 assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
107 assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
108 jafnhar.id == user_id
112 CommonAPI.post(tridi, %{
113 status: "Hey @#{har.nickname}",
114 visibility: "direct",
115 in_reply_to_status_id: activity.id
118 object = Pleroma.Object.normalize(activity, fetch: false)
119 context = object.data["context"]
122 Conversation.get_for_ap_id(context)
123 |> Repo.preload([:participations, :users])
125 assert conversation_three.id == conversation.id
127 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
131 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
132 jafnhar.id == user_id
135 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
139 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
143 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
144 jafnhar.id == user_id
147 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
152 test "create_or_bump_for returns the conversation with participations" do
154 jafnhar = insert(:user, local: false)
157 CommonAPI.post(har, %{status: "Hey @#{jafnhar.nickname}", visibility: "direct"})
159 {:ok, conversation} = Conversation.create_or_bump_for(activity)
161 assert length(conversation.participations) == 2
164 CommonAPI.post(har, %{status: "Hey @#{jafnhar.nickname}", visibility: "public"})
166 assert {:error, _} = Conversation.create_or_bump_for(activity)
169 test "create_or_bump_for does not normalize objects before checking the activity type" do
171 note_id = note.data["id"]
173 refute Object.get_by_ap_id(note_id)
175 Tesla.Mock.mock(fn env ->
178 # TODO: add attributedTo and tag to the note factory
181 |> Map.put("attributedTo", note.data["actor"])
182 |> Map.put("tag", [])
185 %Tesla.Env{status: 200, body: body}
192 "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
193 "actor" => note.data["actor"],
194 "to" => [note.data["actor"]],
200 Conversation.create_or_bump_for(undo)
202 refute Object.get_by_ap_id(note_id)