174 lines
5.0 KiB
Elixir
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
|