2023-10-17 14:41:31 +00:00
|
|
|
defmodule Mobilizon.Federation.ActivityPub.Transmogrifier.CreateTest do
|
|
|
|
use Mobilizon.DataCase
|
|
|
|
|
|
|
|
import Mobilizon.Factory
|
|
|
|
import Mox
|
|
|
|
alias Mobilizon.Actors.Actor
|
|
|
|
alias Mobilizon.Conversations.Conversation
|
|
|
|
alias Mobilizon.Discussions.Comment
|
2024-01-05 16:51:41 +00:00
|
|
|
alias Mobilizon.Events.Event
|
2023-10-17 14:41:31 +00:00
|
|
|
alias Mobilizon.Federation.ActivityPub.Transmogrifier
|
|
|
|
alias Mobilizon.Service.HTTP.ActivityPub.Mock
|
|
|
|
|
|
|
|
describe "Receive Create Notes" do
|
|
|
|
test "it creates conversations for received comments in reply to events" do
|
|
|
|
actor_data = File.read!("test/fixtures/mastodon-actor.json") |> Jason.decode!()
|
|
|
|
|
|
|
|
Mock
|
|
|
|
|> expect(:call, 2, fn
|
|
|
|
%{method: :get, url: "https://framapiaf.org/users/admin"}, _opts ->
|
|
|
|
{:ok,
|
|
|
|
%Tesla.Env{
|
|
|
|
status: 200,
|
|
|
|
body:
|
|
|
|
actor_data
|
|
|
|
|> Map.put("id", "https://framapiaf.org/users/admin")
|
|
|
|
|> Map.put("preferredUsername", "admin")
|
|
|
|
}}
|
|
|
|
|
|
|
|
%{method: :get, url: "https://framapiaf.org/users/tcit"}, _opts ->
|
|
|
|
{:ok,
|
|
|
|
%Tesla.Env{
|
|
|
|
status: 200,
|
|
|
|
body:
|
|
|
|
actor_data
|
|
|
|
|> Map.put("id", "https://framapiaf.org/users/tcit")
|
|
|
|
|> Map.put("preferredUsername", "tcit")
|
|
|
|
}}
|
|
|
|
end)
|
|
|
|
|
|
|
|
data = File.read!("test/fixtures/mastodon-post-activity-private.json") |> Jason.decode!()
|
|
|
|
event = insert(:event)
|
|
|
|
object = data["object"]
|
|
|
|
object = Map.put(object, "inReplyTo", event.url)
|
|
|
|
data = Map.put(data, "object", object)
|
|
|
|
|
|
|
|
{:ok, _activity,
|
|
|
|
%Conversation{
|
|
|
|
origin_comment: %Comment{visibility: :private, id: origin_comment_id},
|
|
|
|
last_comment: %Comment{visibility: :private, id: last_comment_id},
|
|
|
|
participants: participants,
|
|
|
|
event: matched_event
|
|
|
|
}} = Transmogrifier.handle_incoming(data)
|
|
|
|
|
|
|
|
assert origin_comment_id == last_comment_id
|
|
|
|
assert event.id == matched_event.id
|
|
|
|
participant_ids = participants |> Enum.map(& &1.id) |> MapSet.new()
|
|
|
|
{:ok, tcit} = Mobilizon.Actors.get_actor_by_url("https://framapiaf.org/users/tcit")
|
|
|
|
{:ok, admin} = Mobilizon.Actors.get_actor_by_url("https://framapiaf.org/users/admin")
|
|
|
|
assert participant_ids == MapSet.new([event.organizer_actor_id, tcit.id, admin.id])
|
|
|
|
end
|
|
|
|
|
|
|
|
test "it creates conversations for received comments if we're concerned" do
|
|
|
|
actor_data = File.read!("test/fixtures/mastodon-actor.json") |> Jason.decode!()
|
|
|
|
|
|
|
|
Mock
|
|
|
|
|> expect(:call, 1, fn
|
|
|
|
%{method: :get, url: "https://framapiaf.org/users/admin"}, _opts ->
|
|
|
|
{:ok,
|
|
|
|
%Tesla.Env{
|
|
|
|
status: 200,
|
|
|
|
body:
|
|
|
|
actor_data
|
|
|
|
|> Map.put("id", "https://framapiaf.org/users/admin")
|
|
|
|
|> Map.put("preferredUsername", "admin")
|
|
|
|
}}
|
|
|
|
end)
|
|
|
|
|
|
|
|
actor = insert(:actor)
|
|
|
|
data = File.read!("test/fixtures/mastodon-post-activity-private.json") |> Jason.decode!()
|
|
|
|
data = Map.put(data, "to", [actor.url])
|
|
|
|
|
|
|
|
object =
|
|
|
|
data["object"]
|
|
|
|
|> Map.put("to", [actor.url])
|
|
|
|
|> Map.put("tag", [
|
|
|
|
data["object"]["tag"]
|
|
|
|
|> hd()
|
|
|
|
|> Map.put("href", actor.url)
|
|
|
|
|> Map.put("name", Actor.preferred_username_and_domain(actor))
|
|
|
|
])
|
|
|
|
|
|
|
|
data = Map.put(data, "object", object)
|
|
|
|
|
|
|
|
{:ok, _activity,
|
|
|
|
%Conversation{
|
|
|
|
origin_comment: %Comment{visibility: :private, id: origin_comment_id},
|
|
|
|
last_comment: %Comment{visibility: :private, id: last_comment_id},
|
|
|
|
participants: participants,
|
|
|
|
event: nil
|
|
|
|
}} = Transmogrifier.handle_incoming(data)
|
|
|
|
|
|
|
|
assert origin_comment_id == last_comment_id
|
|
|
|
participant_ids = participants |> Enum.map(& &1.id) |> MapSet.new()
|
|
|
|
{:ok, admin} = Mobilizon.Actors.get_actor_by_url("https://framapiaf.org/users/admin")
|
|
|
|
assert participant_ids == MapSet.new([actor.id, admin.id])
|
|
|
|
end
|
2024-01-05 16:51:41 +00:00
|
|
|
|
|
|
|
test "it creates conversations for received comments if we're concerned even with reply to an event" do
|
|
|
|
actor_data = File.read!("test/fixtures/mastodon-actor.json") |> Jason.decode!()
|
|
|
|
|
|
|
|
Mock
|
|
|
|
|> expect(:call, 1, fn
|
|
|
|
%{method: :get, url: "https://framapiaf.org/users/admin"}, _opts ->
|
|
|
|
{:ok,
|
|
|
|
%Tesla.Env{
|
|
|
|
status: 200,
|
|
|
|
body:
|
|
|
|
actor_data
|
|
|
|
|> Map.put("id", "https://framapiaf.org/users/admin")
|
|
|
|
|> Map.put("preferredUsername", "admin")
|
|
|
|
}}
|
|
|
|
end)
|
|
|
|
|
|
|
|
actor = insert(:actor)
|
|
|
|
data = File.read!("test/fixtures/mastodon-post-activity-private.json") |> Jason.decode!()
|
|
|
|
data = Map.put(data, "to", [actor.url])
|
|
|
|
|
|
|
|
%Event{id: event_id, organizer_actor_id: organizer_actor_id} = event = insert(:event)
|
|
|
|
|
|
|
|
%Comment{url: reply_to_url, id: first_reply_comment_id} =
|
|
|
|
insert(:comment, visibility: :private, event: event)
|
|
|
|
|
|
|
|
object =
|
|
|
|
data["object"]
|
|
|
|
|> Map.put("to", [actor.url])
|
|
|
|
|> Map.put("inReplyTo", reply_to_url)
|
|
|
|
|> Map.put("tag", [
|
|
|
|
data["object"]["tag"]
|
|
|
|
|> hd()
|
|
|
|
|> Map.put("href", actor.url)
|
|
|
|
|> Map.put("name", Actor.preferred_username_and_domain(actor))
|
|
|
|
])
|
|
|
|
|
|
|
|
data = Map.put(data, "object", object)
|
|
|
|
|
|
|
|
{:ok, _activity,
|
|
|
|
%Conversation{
|
|
|
|
origin_comment: %Comment{visibility: :private, id: origin_comment_id},
|
|
|
|
last_comment: %Comment{visibility: :private, id: _last_comment_id},
|
|
|
|
participants: participants,
|
|
|
|
event: %Event{id: ^event_id}
|
|
|
|
}} = Transmogrifier.handle_incoming(data)
|
|
|
|
|
|
|
|
assert origin_comment_id == first_reply_comment_id
|
|
|
|
participant_ids = participants |> Enum.map(& &1.id) |> MapSet.new()
|
|
|
|
{:ok, admin} = Mobilizon.Actors.get_actor_by_url("https://framapiaf.org/users/admin")
|
|
|
|
assert participant_ids == MapSet.new([actor.id, organizer_actor_id, admin.id])
|
|
|
|
end
|
2023-10-17 14:41:31 +00:00
|
|
|
end
|
|
|
|
end
|