Mark the conversations with the blocked user as read and update the blocking user's unread_conversation_count.

Since the conversations with the blocked user are invisible, they are excluded
from the blocking user's `unread_conversation_count`.
This commit is contained in:
eugenijm 2019-10-25 21:29:23 +03:00
commit 0580654485
5 changed files with 175 additions and 11 deletions

View file

@ -140,7 +140,7 @@ defmodule Pleroma.Conversation.ParticipationTest do
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)
{: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
@ -216,4 +216,134 @@ defmodule Pleroma.Conversation.ParticipationTest do
assert user in participation.recipients
assert other_user in participation.recipients
end
describe "blocking" do
test "when the user blocks a recipient, the existing conversations with them are marked as read" do
blocker = insert(:user)
blocked = insert(:user)
third_user = insert(:user)
{:ok, _direct1} =
CommonAPI.post(third_user, %{
"status" => "Hi @#{blocker.nickname}",
"visibility" => "direct"
})
{:ok, _direct2} =
CommonAPI.post(third_user, %{
"status" => "Hi @#{blocker.nickname}, @#{blocked.nickname}",
"visibility" => "direct"
})
{:ok, _direct3} =
CommonAPI.post(blocked, %{
"status" => "Hi @#{blocker.nickname}",
"visibility" => "direct"
})
{:ok, _direct4} =
CommonAPI.post(blocked, %{
"status" => "Hi @#{blocker.nickname}, @#{third_user.nickname}",
"visibility" => "direct"
})
assert [%{read: false}, %{read: false}, %{read: false}, %{read: false}] =
Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 4
{:ok, blocker} = User.block(blocker, blocked)
# The conversations with the blocked user are marked as read
assert [%{read: true}, %{read: true}, %{read: true}, %{read: false}] =
Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 1
# The conversation is not marked as read for the blocked user
assert [_, _, %{read: false}] = Participation.for_user(blocked)
assert User.get_cached_by_id(blocked.id).unread_conversation_count == 1
# The conversation is not marked as read for the third user
assert [%{read: false}, _, _] = Participation.for_user(third_user)
assert User.get_cached_by_id(third_user.id).unread_conversation_count == 1
end
test "the new conversation with the blocked user is not marked as unread " do
blocker = insert(:user)
blocked = insert(:user)
third_user = insert(:user)
{:ok, blocker} = User.block(blocker, blocked)
# When the blocked user is the author
{:ok, _direct1} =
CommonAPI.post(blocked, %{
"status" => "Hi @#{blocker.nickname}",
"visibility" => "direct"
})
assert [%{read: true}] = Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0
# When the blocked user is a recipient
{:ok, _direct2} =
CommonAPI.post(third_user, %{
"status" => "Hi @#{blocker.nickname}, @#{blocked.nickname}",
"visibility" => "direct"
})
assert [%{read: true}, %{read: true}] = Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0
assert [%{read: false}, _] = Participation.for_user(blocked)
assert User.get_cached_by_id(blocked.id).unread_conversation_count == 1
end
test "the conversation with the blocked user is not marked as unread on a reply" do
blocker = insert(:user)
blocked = insert(:user)
third_user = insert(:user)
{:ok, _direct1} =
CommonAPI.post(blocker, %{
"status" => "Hi @#{third_user.nickname}, @#{blocked.nickname}",
"visibility" => "direct"
})
{:ok, blocker} = User.block(blocker, blocked)
assert [%{read: true}] = Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0
assert [blocked_participation] = Participation.for_user(blocked)
# When it's a reply from the blocked user
{:ok, _direct2} =
CommonAPI.post(blocked, %{
"status" => "reply",
"visibility" => "direct",
"in_reply_to_conversation_id" => blocked_participation.id
})
assert [%{read: true}] = Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0
assert [third_user_participation] = Participation.for_user(third_user)
# When it's a reply from the third user
{:ok, _direct3} =
CommonAPI.post(third_user, %{
"status" => "reply",
"visibility" => "direct",
"in_reply_to_conversation_id" => third_user_participation.id
})
assert [%{read: true}] = Participation.for_user(blocker)
assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0
# Marked as unread for the blocked user
assert [%{read: false}] = Participation.for_user(blocked)
assert User.get_cached_by_id(blocked.id).unread_conversation_count == 1
end
end
end