Make mentions send notifications

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-06-23 19:49:10 +02:00
parent de8e86f519
commit 7a6667bd3b
8 changed files with 372 additions and 93 deletions

View File

@@ -5,7 +5,7 @@ defmodule Mobilizon.Service.Workers.LegacyNotifierBuilderTest do
alias Mobilizon.Activities.Activity
alias Mobilizon.Actors.Actor
alias Mobilizon.Discussions.Comment
alias Mobilizon.Discussions.{Comment, Discussion}
alias Mobilizon.Events.Event
alias Mobilizon.Service.Notifier.Mock, as: NotifierMock
alias Mobilizon.Service.Workers.LegacyNotifierBuilder
@@ -26,7 +26,7 @@ defmodule Mobilizon.Service.Workers.LegacyNotifierBuilderTest do
:ok
end
@mentionned %{
@comment_mentionned %{
"type" => "comment",
"subject" => "event_comment_mention",
"object_type" => "comment",
@@ -34,6 +34,14 @@ defmodule Mobilizon.Service.Workers.LegacyNotifierBuilderTest do
"op" => "legacy_notify"
}
@discussion_mentionned %{
"type" => "discussion",
"subject" => "discussion_mention",
"object_type" => "discussion",
"inserted_at" => DateTime.utc_now(),
"op" => "legacy_notify"
}
@announcement %{
"type" => "comment",
"subject" => "participation_event_comment",
@@ -55,7 +63,7 @@ defmodule Mobilizon.Service.Workers.LegacyNotifierBuilderTest do
%Comment{id: comment_id} = insert(:comment, event: event, actor: actor)
args =
Map.merge(@mentionned, %{
Map.merge(@comment_mentionned, %{
"subject_params" => %{
"event_uuid" => uuid,
"event_title" => title
@@ -93,7 +101,7 @@ defmodule Mobilizon.Service.Workers.LegacyNotifierBuilderTest do
%Comment{id: comment_id} = insert(:comment, event: event, actor: actor)
args =
Map.merge(@mentionned, %{
Map.merge(@comment_mentionned, %{
"subject_params" => %{
"event_uuid" => uuid,
"event_title" => title
@@ -194,4 +202,135 @@ defmodule Mobilizon.Service.Workers.LegacyNotifierBuilderTest do
assert :ok == LegacyNotifierBuilder.perform(%Oban.Job{args: args})
end
end
describe "Generates a discussion mention notification " do
test "not if the actor is remote" do
%User{} = user1 = insert(:user)
%Actor{id: actor_id} = actor = insert(:actor, user: user1)
%Actor{id: actor_id_2} = insert(:actor, domain: "remote.tld", user: nil)
%Comment{id: comment_id} = insert(:comment, actor: actor)
%Discussion{
actor_id: group_id,
title: discussion_title,
slug: discussion_slug
} = insert(:discussion)
args =
Map.merge(@discussion_mentionned, %{
"subject_params" => %{
"discussion_slug" => discussion_slug,
"discussion_title" => discussion_title
},
"author_id" => actor_id,
"group_id" => group_id,
"object_id" => to_string(comment_id),
"mentions" => [actor_id_2]
})
NotifierMock
|> expect(:ready?, 0, fn -> true end)
|> expect(:send, 0, fn %User{},
%Activity{
type: :discussion,
subject: :discussion_mention,
object_type: :discussion
},
[single_activity: true] ->
{:ok, :sent}
end)
assert :ok == LegacyNotifierBuilder.perform(%Oban.Job{args: args})
end
test "not if the actor is not a member" do
%User{} = user1 = insert(:user)
%Actor{id: actor_id} = actor = insert(:actor, user: user1)
%Actor{id: actor_id_2} = insert(:actor)
%Comment{id: comment_id} = insert(:comment, actor: actor)
%Discussion{
actor_id: group_id,
title: discussion_title,
slug: discussion_slug
} = insert(:discussion)
args =
Map.merge(@discussion_mentionned, %{
"subject_params" => %{
"discussion_slug" => discussion_slug,
"discussion_title" => discussion_title
},
"author_id" => actor_id,
"group_id" => group_id,
"object_id" => to_string(comment_id),
"mentions" => [actor_id_2]
})
NotifierMock
|> expect(:ready?, 0, fn -> true end)
|> expect(:send, 0, fn %User{},
%Activity{
type: :discussion,
subject: :discussion_mention,
object_type: :discussion
},
[single_activity: true] ->
{:ok, :sent}
end)
assert :ok == LegacyNotifierBuilder.perform(%Oban.Job{args: args})
end
test "if the actor mentionned is local and a member" do
%User{} = user1 = insert(:user)
%User{} = user2 = insert(:user)
%Setting{} = settings2 = insert(:settings, user: user2, user_id: user2.id)
user2 = %User{user2 | settings: settings2}
%Actor{id: actor_id} = actor = insert(:actor, user: user1)
%Actor{id: actor_id_2} = actor2 = insert(:actor, user: user2)
%Actor{} = group = insert(:group)
insert(:member, actor: actor2, parent: group, role: :member)
%Comment{id: comment_id} = insert(:comment, actor: actor)
%Discussion{
actor_id: group_id,
title: discussion_title,
slug: discussion_slug
} = insert(:discussion, actor: group)
args =
Map.merge(@discussion_mentionned, %{
"subject_params" => %{
"discussion_slug" => discussion_slug,
"discussion_title" => discussion_title
},
"author_id" => actor_id,
"group_id" => group_id,
"object_id" => to_string(comment_id),
"mentions" => [actor_id_2]
})
NotifierMock
|> expect(:ready?, fn -> true end)
|> expect(:send, fn %User{},
%Activity{
type: :discussion,
subject: :discussion_mention,
object_type: :discussion
},
[single_activity: true] ->
{:ok, :sent}
end)
assert :ok == LegacyNotifierBuilder.perform(%Oban.Job{args: args})
end
end
end