2019-04-10 00:34:53 -07:00
|
|
|
# Pleroma: A lightweight social networking server
|
|
|
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
defmodule Pleroma.Conversation.ParticipationTest do
|
|
|
|
use Pleroma.DataCase
|
|
|
|
import Pleroma.Factory
|
|
|
|
alias Pleroma.Conversation.Participation
|
2019-10-01 14:37:08 -07:00
|
|
|
alias Pleroma.User
|
2019-04-10 08:05:33 -07:00
|
|
|
alias Pleroma.Web.CommonAPI
|
2019-04-10 00:34:53 -07:00
|
|
|
|
2019-08-14 08:01:11 -07:00
|
|
|
test "getting a participation will also preload things" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _activity} =
|
|
|
|
CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
|
|
|
|
|
|
|
|
[participation] = Participation.for_user(user)
|
|
|
|
|
|
|
|
participation = Participation.get(participation.id, preload: [:conversation])
|
|
|
|
|
|
|
|
assert %Pleroma.Conversation{} = participation.conversation
|
|
|
|
end
|
|
|
|
|
2019-10-17 05:25:15 -07:00
|
|
|
test "for a new conversation or a reply, it doesn't mark the author's participation as unread" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _} =
|
|
|
|
CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
|
|
|
|
|
|
|
|
user = User.get_cached_by_id(user.id)
|
|
|
|
other_user = User.get_cached_by_id(other_user.id)
|
|
|
|
|
|
|
|
[%{read: true}] = Participation.for_user(user)
|
|
|
|
[%{read: false} = participation] = Participation.for_user(other_user)
|
|
|
|
|
2019-10-20 12:29:56 -07:00
|
|
|
assert User.get_cached_by_id(user.id).unread_conversation_count == 0
|
|
|
|
assert User.get_cached_by_id(other_user.id).unread_conversation_count == 1
|
2019-10-17 05:25:15 -07:00
|
|
|
|
|
|
|
{:ok, _} =
|
|
|
|
CommonAPI.post(other_user, %{
|
|
|
|
"status" => "Hey @#{user.nickname}.",
|
|
|
|
"visibility" => "direct",
|
|
|
|
"in_reply_to_conversation_id" => participation.id
|
|
|
|
})
|
|
|
|
|
|
|
|
user = User.get_cached_by_id(user.id)
|
|
|
|
other_user = User.get_cached_by_id(other_user.id)
|
|
|
|
|
|
|
|
[%{read: false}] = Participation.for_user(user)
|
|
|
|
[%{read: true}] = Participation.for_user(other_user)
|
|
|
|
|
2019-10-20 12:29:56 -07:00
|
|
|
assert User.get_cached_by_id(user.id).unread_conversation_count == 1
|
|
|
|
assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0
|
2019-10-17 05:25:15 -07:00
|
|
|
end
|
|
|
|
|
2019-08-02 02:55:41 -07:00
|
|
|
test "for a new conversation, it sets the recipents of the participation" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
third_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, activity} =
|
|
|
|
CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
|
|
|
|
|
2019-10-01 14:37:08 -07:00
|
|
|
user = User.get_cached_by_id(user.id)
|
2019-10-17 05:25:15 -07:00
|
|
|
other_user = User.get_cached_by_id(other_user.id)
|
2019-08-02 02:55:41 -07:00
|
|
|
[participation] = Participation.for_user(user)
|
|
|
|
participation = Pleroma.Repo.preload(participation, :recipients)
|
|
|
|
|
|
|
|
assert length(participation.recipients) == 2
|
|
|
|
assert user in participation.recipients
|
|
|
|
assert other_user in participation.recipients
|
|
|
|
|
|
|
|
# Mentioning another user in the same conversation will not add a new recipients.
|
|
|
|
|
|
|
|
{:ok, _activity} =
|
|
|
|
CommonAPI.post(user, %{
|
|
|
|
"in_reply_to_status_id" => activity.id,
|
|
|
|
"status" => "Hey @#{third_user.nickname}.",
|
|
|
|
"visibility" => "direct"
|
|
|
|
})
|
|
|
|
|
|
|
|
[participation] = Participation.for_user(user)
|
|
|
|
participation = Pleroma.Repo.preload(participation, :recipients)
|
|
|
|
|
|
|
|
assert length(participation.recipients) == 2
|
|
|
|
end
|
|
|
|
|
2019-04-10 00:34:53 -07:00
|
|
|
test "it creates a participation for a conversation and a user" do
|
|
|
|
user = insert(:user)
|
|
|
|
conversation = insert(:conversation)
|
|
|
|
|
|
|
|
{:ok, %Participation{} = participation} =
|
|
|
|
Participation.create_for_user_and_conversation(user, conversation)
|
|
|
|
|
|
|
|
assert participation.user_id == user.id
|
|
|
|
assert participation.conversation_id == conversation.id
|
2019-04-10 07:33:45 -07:00
|
|
|
|
|
|
|
:timer.sleep(1000)
|
|
|
|
# Creating again returns the same participation
|
|
|
|
{:ok, %Participation{} = participation_two} =
|
|
|
|
Participation.create_for_user_and_conversation(user, conversation)
|
|
|
|
|
|
|
|
assert participation.id == participation_two.id
|
|
|
|
refute participation.updated_at == participation_two.updated_at
|
|
|
|
end
|
|
|
|
|
|
|
|
test "recreating an existing participations sets it to unread" do
|
|
|
|
participation = insert(:participation, %{read: true})
|
|
|
|
|
|
|
|
{:ok, participation} =
|
|
|
|
Participation.create_for_user_and_conversation(
|
|
|
|
participation.user,
|
|
|
|
participation.conversation
|
|
|
|
)
|
|
|
|
|
|
|
|
refute participation.read
|
2019-04-10 00:34:53 -07:00
|
|
|
end
|
2019-04-10 06:12:01 -07:00
|
|
|
|
|
|
|
test "it marks a participation as read" do
|
|
|
|
participation = insert(:participation, %{read: false})
|
|
|
|
{:ok, participation} = Participation.mark_as_read(participation)
|
|
|
|
|
|
|
|
assert participation.read
|
|
|
|
end
|
|
|
|
|
|
|
|
test "it marks a participation as unread" do
|
|
|
|
participation = insert(:participation, %{read: true})
|
|
|
|
{:ok, participation} = Participation.mark_as_unread(participation)
|
|
|
|
|
|
|
|
refute participation.read
|
|
|
|
end
|
2019-04-10 08:05:33 -07:00
|
|
|
|
2019-10-10 20:40:58 -07:00
|
|
|
test "it marks all the user's participations as read" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
participation1 = insert(:participation, %{read: false, user: user})
|
|
|
|
participation2 = insert(:participation, %{read: false, user: user})
|
|
|
|
participation3 = insert(:participation, %{read: false, user: other_user})
|
|
|
|
|
|
|
|
{:ok, [%{read: true}, %{read: true}]} = Participation.mark_all_as_read(user)
|
|
|
|
|
|
|
|
assert Participation.get(participation1.id).read == true
|
|
|
|
assert Participation.get(participation2.id).read == true
|
|
|
|
assert Participation.get(participation3.id).read == false
|
|
|
|
end
|
|
|
|
|
2019-04-10 08:05:33 -07:00
|
|
|
test "gets all the participations for a user, ordered by updated at descending" do
|
|
|
|
user = insert(:user)
|
|
|
|
{:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
|
|
|
|
:timer.sleep(1000)
|
|
|
|
{:ok, activity_two} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
|
|
|
|
:timer.sleep(1000)
|
|
|
|
|
|
|
|
{:ok, activity_three} =
|
|
|
|
CommonAPI.post(user, %{
|
|
|
|
"status" => "x",
|
|
|
|
"visibility" => "direct",
|
|
|
|
"in_reply_to_status_id" => activity_one.id
|
|
|
|
})
|
|
|
|
|
2019-04-28 13:44:04 -07:00
|
|
|
assert [participation_one, participation_two] = Participation.for_user(user)
|
2019-04-10 08:05:33 -07:00
|
|
|
|
2019-04-28 13:44:04 -07:00
|
|
|
object2 = Pleroma.Object.normalize(activity_two)
|
|
|
|
object3 = Pleroma.Object.normalize(activity_three)
|
|
|
|
|
2019-06-07 08:51:47 -07:00
|
|
|
user = Repo.get(Pleroma.User, user.id)
|
|
|
|
|
2019-04-28 13:44:04 -07:00
|
|
|
assert participation_one.conversation.ap_id == object3.data["context"]
|
|
|
|
assert participation_two.conversation.ap_id == object2.data["context"]
|
2019-06-07 08:51:47 -07:00
|
|
|
assert participation_one.conversation.users == [user]
|
2019-04-10 08:05:33 -07:00
|
|
|
|
|
|
|
# Pagination
|
2019-04-28 13:44:04 -07:00
|
|
|
assert [participation_one] = Participation.for_user(user, %{"limit" => 1})
|
2019-04-10 08:05:33 -07:00
|
|
|
|
2019-04-28 13:44:04 -07:00
|
|
|
assert participation_one.conversation.ap_id == object3.data["context"]
|
2019-04-10 08:28:02 -07:00
|
|
|
|
|
|
|
# With last_activity_id
|
|
|
|
assert [participation_one] =
|
2019-04-28 13:44:04 -07:00
|
|
|
Participation.for_user_with_last_activity_id(user, %{"limit" => 1})
|
2019-04-10 08:28:02 -07:00
|
|
|
|
|
|
|
assert participation_one.last_activity_id == activity_three.id
|
2019-04-10 08:05:33 -07:00
|
|
|
end
|
2019-06-04 04:58:36 -07:00
|
|
|
|
|
|
|
test "Doesn't die when the conversation gets empty" do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
|
|
|
|
[participation] = Participation.for_user_with_last_activity_id(user)
|
|
|
|
|
|
|
|
assert participation.last_activity_id == activity.id
|
|
|
|
|
|
|
|
{:ok, _} = CommonAPI.delete(activity.id, user)
|
|
|
|
|
|
|
|
[] = Participation.for_user_with_last_activity_id(user)
|
|
|
|
end
|
2019-08-06 05:51:17 -07:00
|
|
|
|
|
|
|
test "it sets recipients, always keeping the owner of the participation even when not explicitly set" do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
|
|
|
|
[participation] = Participation.for_user_with_last_activity_id(user)
|
|
|
|
|
|
|
|
participation = Repo.preload(participation, :recipients)
|
2019-10-01 14:37:08 -07:00
|
|
|
user = User.get_cached_by_id(user.id)
|
2019-08-06 05:51:17 -07:00
|
|
|
|
|
|
|
assert participation.recipients |> length() == 1
|
|
|
|
assert user in participation.recipients
|
|
|
|
|
|
|
|
{:ok, participation} = Participation.set_recipients(participation, [other_user.id])
|
|
|
|
|
|
|
|
assert participation.recipients |> length() == 2
|
|
|
|
assert user in participation.recipients
|
|
|
|
assert other_user in participation.recipients
|
|
|
|
end
|
2019-04-10 00:34:53 -07:00
|
|
|
end
|