Make mentions send notifications
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
119
test/service/activity/discussion_test.exs
Normal file
119
test/service/activity/discussion_test.exs
Normal file
@@ -0,0 +1,119 @@
|
||||
defmodule Mobilizon.Service.Activity.DiscussionTest do
|
||||
@moduledoc """
|
||||
Test the Discussion activity provider module
|
||||
"""
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Discussions.{Comment, Discussion}
|
||||
alias Mobilizon.Mention
|
||||
alias Mobilizon.Service.Activity.Discussion, as: DiscussionActivity
|
||||
alias Mobilizon.Service.Workers.{ActivityBuilder, LegacyNotifierBuilder}
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
use Mobilizon.DataCase, async: true
|
||||
use Oban.Testing, repo: Mobilizon.Storage.Repo
|
||||
import Mobilizon.Factory
|
||||
|
||||
describe "handle discussion with mentions" do
|
||||
test "with no mentions" do
|
||||
%Comment{} = comment = insert(:comment)
|
||||
|
||||
%Discussion{
|
||||
id: discussion_id,
|
||||
actor_id: group_id,
|
||||
creator_id: author_id,
|
||||
title: discussion_title,
|
||||
slug: discussion_slug
|
||||
} = discussion = insert(:discussion)
|
||||
|
||||
assert {:ok, _} =
|
||||
DiscussionActivity.insert_activity(%Discussion{discussion | last_comment: comment},
|
||||
subject: "discussion_created"
|
||||
)
|
||||
|
||||
refute_enqueued(
|
||||
worker: LegacyNotifierBuilder,
|
||||
args: %{op: :discussion_mention}
|
||||
)
|
||||
|
||||
assert_enqueued(
|
||||
worker: ActivityBuilder,
|
||||
args: %{
|
||||
"group_id" => group_id,
|
||||
"author_id" => author_id,
|
||||
"object_id" => to_string(discussion_id),
|
||||
"object_type" => "discussion",
|
||||
"op" => "build_activity",
|
||||
"subject" => "discussion_created",
|
||||
"subject_params" => %{
|
||||
"discussion_slug" => discussion_slug,
|
||||
"discussion_title" => discussion_title
|
||||
},
|
||||
"type" => "discussion"
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
test "with some mentions" do
|
||||
%User{} = user = insert(:user)
|
||||
%Actor{id: actor_id} = actor = insert(:actor, user: user)
|
||||
|
||||
%Comment{actor_id: author_id} = comment = insert(:comment, text: "Hey @you")
|
||||
|
||||
comment = %Comment{
|
||||
comment
|
||||
| mentions: [
|
||||
%Mention{actor: actor, comment: comment, actor_id: actor_id}
|
||||
]
|
||||
}
|
||||
|
||||
%Discussion{
|
||||
id: discussion_id,
|
||||
actor_id: group_id,
|
||||
creator_id: discussion_author_id,
|
||||
title: discussion_title,
|
||||
slug: discussion_slug
|
||||
} = discussion = insert(:discussion)
|
||||
|
||||
assert {:ok, _} =
|
||||
DiscussionActivity.insert_activity(%Discussion{discussion | last_comment: comment},
|
||||
subject: "discussion_created"
|
||||
)
|
||||
|
||||
assert_enqueued(
|
||||
worker: LegacyNotifierBuilder,
|
||||
args: %{
|
||||
"author_id" => author_id,
|
||||
"group_id" => group_id,
|
||||
"mentions" => [actor_id],
|
||||
"object_id" => to_string(discussion_id),
|
||||
"object_type" => "discussion",
|
||||
"op" => "legacy_notify",
|
||||
"subject" => "discussion_mention",
|
||||
"subject_params" => %{
|
||||
"discussion_slug" => discussion_slug,
|
||||
"discussion_title" => discussion_title
|
||||
},
|
||||
"type" => "discussion"
|
||||
}
|
||||
)
|
||||
|
||||
assert_enqueued(
|
||||
worker: ActivityBuilder,
|
||||
args: %{
|
||||
"group_id" => group_id,
|
||||
"author_id" => discussion_author_id,
|
||||
"object_id" => to_string(discussion_id),
|
||||
"object_type" => "discussion",
|
||||
"op" => "build_activity",
|
||||
"subject" => "discussion_created",
|
||||
"subject_params" => %{
|
||||
"discussion_slug" => discussion_slug,
|
||||
"discussion_title" => discussion_title
|
||||
},
|
||||
"type" => "discussion"
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user