173
test/federation/activity_pub/transmogrifier/announces_test.exs
Normal file
173
test/federation/activity_pub/transmogrifier/announces_test.exs
Normal file
@@ -0,0 +1,173 @@
|
||||
defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.AnnouncesTest do
|
||||
use Mobilizon.DataCase
|
||||
|
||||
import Mobilizon.Factory
|
||||
import Mox
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Discussions
|
||||
alias Mobilizon.Discussions.{Comment, Discussion}
|
||||
alias Mobilizon.Federation.ActivityPub.Transmogrifier
|
||||
alias Mobilizon.Federation.ActivityStream.Convertible
|
||||
alias Mobilizon.Service.HTTP.ActivityPub.Mock
|
||||
alias Mobilizon.Tombstone
|
||||
|
||||
@comment_text "my comment"
|
||||
|
||||
describe "incoming announces for discussion creation" do
|
||||
setup :verify_on_exit!
|
||||
|
||||
test "by group member works" do
|
||||
actor = insert(:actor)
|
||||
group = insert(:group)
|
||||
insert(:member, parent: group, actor: actor, role: :member)
|
||||
|
||||
%Comment{url: comment_url} =
|
||||
comment = build(:comment, actor: actor, attributed_to: group, event: nil)
|
||||
|
||||
comment_data = Convertible.model_to_as(comment)
|
||||
|
||||
Mock
|
||||
|> expect(:call, fn
|
||||
%{method: :get, url: ^comment_url}, _opts ->
|
||||
{:ok, %Tesla.Env{status: 200, body: comment_data}}
|
||||
end)
|
||||
|
||||
data =
|
||||
File.read!("test/fixtures/mastodon-announce.json")
|
||||
|> Jason.decode!()
|
||||
|> Map.put("actor", group.url)
|
||||
|> Map.put("object", comment.url)
|
||||
|
||||
{:ok, _, %Comment{actor: %Actor{url: actor_url}, url: comment_url}} =
|
||||
Transmogrifier.handle_incoming(data)
|
||||
|
||||
assert actor_url == comment.actor.url
|
||||
|
||||
assert comment_url == comment.url
|
||||
end
|
||||
end
|
||||
|
||||
describe "handle incoming announces for discussion updates" do
|
||||
setup :verify_on_exit!
|
||||
|
||||
@updated_title "Updated title"
|
||||
|
||||
test "by group member works" do
|
||||
actor =
|
||||
insert(:actor,
|
||||
domain: "otherremoteinstance.tld",
|
||||
url: "http://otherremoteinstance.tld/@somemember"
|
||||
)
|
||||
|
||||
group =
|
||||
insert(:group,
|
||||
url: "http://remoteinstance.tld/@mygroup",
|
||||
domain: "remoteinstance.tld",
|
||||
members_url: "http://remoteinstance.tld/@mygroup/members"
|
||||
)
|
||||
|
||||
insert(:member, parent: group, actor: actor, role: :member)
|
||||
|
||||
%Comment{url: _comment_url} =
|
||||
comment =
|
||||
insert(:comment,
|
||||
actor: actor,
|
||||
attributed_to: group,
|
||||
text: @comment_text,
|
||||
url: "http://otherremoteinstance.tld/@somemember/uuid"
|
||||
)
|
||||
|
||||
%Discussion{url: discussion_url} =
|
||||
discussion =
|
||||
insert(:discussion,
|
||||
last_comment: comment,
|
||||
comments: [comment],
|
||||
creator: actor,
|
||||
actor: group,
|
||||
url: "http://otherremoteinstance.tld/@mygroup/c/talk-of-something-sh0rt-uu1d"
|
||||
)
|
||||
|
||||
discussion_updated = Map.put(discussion, :title, @updated_title)
|
||||
|
||||
discussion_updated_data = Convertible.model_to_as(discussion_updated)
|
||||
|
||||
Mock
|
||||
|> expect(:call, fn
|
||||
%{url: ^discussion_url}, _opts ->
|
||||
{:ok, %Tesla.Env{status: 200, body: discussion_updated_data}}
|
||||
end)
|
||||
|
||||
data =
|
||||
File.read!("test/fixtures/mastodon-announce.json")
|
||||
|> Jason.decode!()
|
||||
|> Map.put("actor", group.url)
|
||||
|> Map.put("object", discussion_url)
|
||||
|
||||
assert {:ok, _, %Discussion{title: title}} = Transmogrifier.handle_incoming(data)
|
||||
assert title == @updated_title
|
||||
end
|
||||
end
|
||||
|
||||
describe "handle incoming announces for discussion deletion" do
|
||||
setup :verify_on_exit!
|
||||
|
||||
test "by group member works" do
|
||||
actor =
|
||||
insert(:actor,
|
||||
url: "http://otherremoteinstance.tld/@somemember",
|
||||
domain: "otherremoteinstance.tld"
|
||||
)
|
||||
|
||||
group =
|
||||
insert(:group,
|
||||
url: "http://remoteinstance.tld/@mygroup",
|
||||
domain: "remoteinstance.tld",
|
||||
members_url: "http://remoteinstance.tld/@mygroup/members"
|
||||
)
|
||||
|
||||
insert(:member, parent: group, actor: actor, role: :member)
|
||||
|
||||
%Comment{url: comment_url} =
|
||||
comment =
|
||||
insert(:comment,
|
||||
actor: actor,
|
||||
attributed_to: group,
|
||||
text: @comment_text,
|
||||
url: "http://otherremoteinstance.tld/comment/uuid"
|
||||
)
|
||||
|
||||
tombstone = build(:tombstone, uri: comment.url, actor: actor)
|
||||
tombstone_data = Convertible.model_to_as(tombstone)
|
||||
|
||||
Mock
|
||||
|> expect(:call, fn
|
||||
%{url: ^comment_url}, _opts ->
|
||||
{:ok, %Tesla.Env{status: 200, body: tombstone_data}}
|
||||
end)
|
||||
|
||||
data =
|
||||
File.read!("test/fixtures/mastodon-announce.json")
|
||||
|> Jason.decode!()
|
||||
|> Map.put("actor", group.url)
|
||||
|> Map.put("object", comment.url)
|
||||
|
||||
%Comment{deleted_at: deleted_at, text: comment_text} =
|
||||
Discussions.get_comment_from_url(comment.url)
|
||||
|
||||
assert is_nil(deleted_at)
|
||||
assert comment_text == @comment_text
|
||||
|
||||
{:ok, _, %Comment{deleted_at: deleted_at, text: comment_text}} =
|
||||
Transmogrifier.handle_incoming(data)
|
||||
|
||||
refute is_nil(deleted_at)
|
||||
refute comment_text == @comment_text
|
||||
|
||||
%Tombstone{actor_id: _actor_id, uri: tombstone_uri} = Tombstone.find_tombstone(comment_url)
|
||||
|
||||
# assert actor_id == comment.actor.id
|
||||
|
||||
assert tombstone_uri == comment.url
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user