[#1364] Improved notification-related tests.

This commit is contained in:
Ivan Tashkinov 2020-03-16 21:58:10 +03:00
parent 0e07c5ef57
commit 7438833685
2 changed files with 79 additions and 43 deletions

View File

@ -344,6 +344,7 @@ def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, lo
|> Utils.maybe_notify_followers(activity) |> Utils.maybe_notify_followers(activity)
|> Enum.uniq() |> Enum.uniq()
# Since even subscribers and followers can mute / thread-mute, filtering all above AP IDs
notification_enabled_ap_ids = notification_enabled_ap_ids =
potential_receiver_ap_ids potential_receiver_ap_ids
|> exclude_relation_restricting_ap_ids(activity) |> exclude_relation_restricting_ap_ids(activity)

View File

@ -82,6 +82,80 @@ test "does not create a notification for subscribed users if status is a reply"
end end
end end
describe "CommonApi.post/2 notification-related functionality" do
test_with_mock "creates but does NOT send notification to blocker user",
Push,
[:passthrough],
[] do
user = insert(:user)
blocker = insert(:user)
{:ok, _user_relationship} = User.block(blocker, user)
{:ok, _activity} = CommonAPI.post(user, %{"status" => "hey @#{blocker.nickname}!"})
blocker_id = blocker.id
assert [%Notification{user_id: ^blocker_id}] = Repo.all(Notification)
refute called(Push.send(:_))
end
test_with_mock "creates but does NOT send notification to notification-muter user",
Push,
[:passthrough],
[] do
user = insert(:user)
muter = insert(:user)
{:ok, _user_relationships} = User.mute(muter, user)
{:ok, _activity} = CommonAPI.post(user, %{"status" => "hey @#{muter.nickname}!"})
muter_id = muter.id
assert [%Notification{user_id: ^muter_id}] = Repo.all(Notification)
refute called(Push.send(:_))
end
test_with_mock "creates but does NOT send notification to thread-muter user",
Push,
[:passthrough],
[] do
user = insert(:user)
thread_muter = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{thread_muter.nickname}!"})
{:ok, _} = CommonAPI.add_mute(thread_muter, activity)
{:ok, _same_context_activity} =
CommonAPI.post(user, %{
"status" => "hey-hey-hey @#{thread_muter.nickname}!",
"in_reply_to_status_id" => activity.id
})
[pre_mute_notification, post_mute_notification] =
Repo.all(from(n in Notification, where: n.user_id == ^thread_muter.id, order_by: n.id))
pre_mute_notification_id = pre_mute_notification.id
post_mute_notification_id = post_mute_notification.id
assert called(
Push.send(
:meck.is(fn
%Notification{id: ^pre_mute_notification_id} -> true
_ -> false
end)
)
)
refute called(
Push.send(
:meck.is(fn
%Notification{id: ^post_mute_notification_id} -> true
_ -> false
end)
)
)
end
end
describe "create_notification" do describe "create_notification" do
@tag needs_streamer: true @tag needs_streamer: true
test "it creates a notification for user and send to the 'user' and the 'user:notification' stream" do test "it creates a notification for user and send to the 'user' and the 'user:notification' stream" do
@ -489,10 +563,7 @@ test "it does not send notification to mentioned users in announces" do
assert other_user not in enabled_receivers assert other_user not in enabled_receivers
end end
test_with_mock "it returns blocking recipient in disabled recipients list", test "it returns blocking recipient in disabled recipients list" do
Push,
[:passthrough],
[] do
user = insert(:user) user = insert(:user)
other_user = insert(:user) other_user = insert(:user)
{:ok, _user_relationship} = User.block(other_user, user) {:ok, _user_relationship} = User.block(other_user, user)
@ -503,15 +574,9 @@ test "it does not send notification to mentioned users in announces" do
assert [] == enabled_receivers assert [] == enabled_receivers
assert [other_user] == disabled_receivers assert [other_user] == disabled_receivers
assert 1 == length(Repo.all(Notification))
refute called(Push.send(:_))
end end
test_with_mock "it returns notification-muting recipient in disabled recipients list", test "it returns notification-muting recipient in disabled recipients list" do
Push,
[:passthrough],
[] do
user = insert(:user) user = insert(:user)
other_user = insert(:user) other_user = insert(:user)
{:ok, _user_relationships} = User.mute(other_user, user) {:ok, _user_relationships} = User.mute(other_user, user)
@ -522,15 +587,9 @@ test "it does not send notification to mentioned users in announces" do
assert [] == enabled_receivers assert [] == enabled_receivers
assert [other_user] == disabled_receivers assert [other_user] == disabled_receivers
assert 1 == length(Repo.all(Notification))
refute called(Push.send(:_))
end end
test_with_mock "it returns thread-muting recipient in disabled recipients list", test "it returns thread-muting recipient in disabled recipients list" do
Push,
[:passthrough],
[] do
user = insert(:user) user = insert(:user)
other_user = insert(:user) other_user = insert(:user)
@ -549,30 +608,6 @@ test "it does not send notification to mentioned users in announces" do
assert [other_user] == disabled_receivers assert [other_user] == disabled_receivers
refute other_user in enabled_receivers refute other_user in enabled_receivers
[pre_mute_notification, post_mute_notification] =
Repo.all(from(n in Notification, where: n.user_id == ^other_user.id, order_by: n.id))
pre_mute_notification_id = pre_mute_notification.id
post_mute_notification_id = post_mute_notification.id
assert called(
Push.send(
:meck.is(fn
%Notification{id: ^pre_mute_notification_id} -> true
_ -> false
end)
)
)
refute called(
Push.send(
:meck.is(fn
%Notification{id: ^post_mute_notification_id} -> true
_ -> false
end)
)
)
end end
end end
@ -820,7 +855,7 @@ test "it doesn't return notifications for blocked user" do
assert Notification.for_user(user) == [] assert Notification.for_user(user) == []
end end
test "it doesn't return notificatitons for blocked domain" do test "it doesn't return notifications for blocked domain" do
user = insert(:user) user = insert(:user)
blocked = insert(:user, ap_id: "http://some-domain.com") blocked = insert(:user, ap_id: "http://some-domain.com")
{:ok, user} = User.block_domain(user, "some-domain.com") {:ok, user} = User.block_domain(user, "some-domain.com")