mobilizon.chapril.org-mobil.../test/federation/activity_pub/transmogrifier/announces_test.exs

174 lines
5.0 KiB
Elixir

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