1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 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 test "it goes through old direct conversations" do
16 other_user = insert(:user)
19 CommonAPI.post(user, %{"visibility" => "direct", "status" => "hey @#{other_user.nickname}"})
21 Repo.delete_all(Conversation)
22 Repo.delete_all(Conversation.Participation)
24 refute Repo.one(Conversation)
26 Conversation.bump_for_all_activities()
28 assert Repo.one(Conversation)
29 [participation, _p2] = Repo.all(Conversation.Participation)
31 assert participation.read
34 test "it creates a conversation for given ap_id" do
35 assert {:ok, %Conversation{} = conversation} =
36 Conversation.create_for_ap_id("https://some_ap_id")
38 # Inserting again returns the same
39 assert {:ok, conversation_two} = Conversation.create_for_ap_id("https://some_ap_id")
40 assert conversation_two.id == conversation.id
43 test "public posts don't create conversations" do
45 {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey"})
47 object = Pleroma.Object.normalize(activity)
48 context = object.data["context"]
50 conversation = Conversation.get_for_ap_id(context)
55 test "it creates or updates a conversation and participations for a given DM" do
57 jafnhar = insert(:user, local: false)
61 CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"})
63 object = Pleroma.Object.normalize(activity)
64 context = object.data["context"]
67 Conversation.get_for_ap_id(context)
68 |> Repo.preload(:participations)
72 assert Enum.find(conversation.participations, fn %{user_id: user_id} -> har.id == user_id end)
74 assert Enum.find(conversation.participations, fn %{user_id: user_id} ->
79 CommonAPI.post(jafnhar, %{
80 "status" => "Hey @#{har.nickname}",
81 "visibility" => "direct",
82 "in_reply_to_status_id" => activity.id
85 object = Pleroma.Object.normalize(activity)
86 context = object.data["context"]
89 Conversation.get_for_ap_id(context)
90 |> Repo.preload(:participations)
92 assert conversation_two.id == conversation.id
94 assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
98 assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
103 CommonAPI.post(tridi, %{
104 "status" => "Hey @#{har.nickname}",
105 "visibility" => "direct",
106 "in_reply_to_status_id" => activity.id
109 object = Pleroma.Object.normalize(activity)
110 context = object.data["context"]
113 Conversation.get_for_ap_id(context)
114 |> Repo.preload([:participations, :users])
116 assert conversation_three.id == conversation.id
118 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
122 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
123 jafnhar.id == user_id
126 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
130 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
134 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
135 jafnhar.id == user_id
138 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
143 test "create_or_bump_for returns the conversation with participations" do
145 jafnhar = insert(:user, local: false)
148 CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"})
150 {:ok, conversation} = Conversation.create_or_bump_for(activity)
152 assert length(conversation.participations) == 2
155 CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "public"})
157 assert {:error, _} = Conversation.create_or_bump_for(activity)
160 test "create_or_bump_for does not normalize objects before checking the activity type" do
162 note_id = note.data["id"]
164 refute Object.get_by_ap_id(note_id)
166 Tesla.Mock.mock(fn env ->
169 # TODO: add attributedTo and tag to the note factory
172 |> Map.put("attributedTo", note.data["actor"])
173 |> Map.put("tag", [])
176 %Tesla.Env{status: 200, body: body}
183 "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
184 "actor" => note.data["actor"],
185 "to" => [note.data["actor"]],
191 Conversation.create_or_bump_for(undo)
193 refute Object.get_by_ap_id(note_id)