summaryrefslogtreecommitdiff
path: root/test/web/activity_pub
diff options
context:
space:
mode:
Diffstat (limited to 'test/web/activity_pub')
-rw-r--r--test/web/activity_pub/activity_pub_controller_test.exs46
-rw-r--r--test/web/activity_pub/activity_pub_test.exs40
-rw-r--r--test/web/activity_pub/transmogrifier_test.exs181
-rw-r--r--test/web/activity_pub/views/object_view_test.exs17
-rw-r--r--test/web/activity_pub/views/user_view_test.exs18
5 files changed, 301 insertions, 1 deletions
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
new file mode 100644
index 000000000..957687c43
--- /dev/null
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -0,0 +1,46 @@
+defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
+ use Pleroma.Web.ConnCase
+ import Pleroma.Factory
+ alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
+ alias Pleroma.{Repo, User}
+
+ describe "/users/:nickname" do
+ test "it returns a json representation of the user", %{conn: conn} do
+ user = insert(:user)
+
+ conn = conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}")
+
+ user = Repo.get(User, user.id)
+
+ assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
+ end
+ end
+
+ describe "/object/:uuid" do
+ test "it returns a json representation of the object", %{conn: conn} do
+ note = insert(:note)
+ uuid = String.split(note.data["id"], "/") |> List.last
+
+ conn = conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}")
+
+ assert json_response(conn, 200) == ObjectView.render("object.json", %{object: note})
+ end
+ end
+
+ describe "/users/:nickname/inbox" do
+ test "it inserts an incoming activity into the database", %{conn: conn} do
+ data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!
+
+ conn = conn
+ |> assign(:valid_signature, true)
+ |> put_req_header("content-type", "application/activity+json")
+ |> post("/users/doesntmatter/inbox", data)
+
+ assert "ok" == json_response(conn, 200)
+ end
+ end
+end
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs
index f423ea8be..4aeabc596 100644
--- a/test/web/activity_pub/activity_pub_test.exs
+++ b/test/web/activity_pub/activity_pub_test.exs
@@ -7,6 +7,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
import Pleroma.Factory
+ describe "building a user from his ap id" do
+ test "it returns a user" do
+ user_id = "http://mastodon.example.org/users/admin"
+ {:ok, user} = ActivityPub.make_user_from_ap_id(user_id)
+ assert user.ap_id == user_id
+ assert user.nickname == "admin@mastodon.example.org"
+ assert user.info["source_data"]
+ assert user.info["ap_enabled"]
+ assert user.follower_address == "http://mastodon.example.org/users/admin/followers"
+ end
+ end
+
describe "insertion" do
test "returns the activity if one with the same id is already in" do
activity = insert(:note_activity)
@@ -50,9 +62,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
describe "create activities" do
test "removes doubled 'to' recipients" do
- {:ok, activity} = ActivityPub.create(["user1", "user1", "user2"], %User{ap_id: "1"}, "", %{})
+ {:ok, activity} = ActivityPub.create(%{to: ["user1", "user1", "user2"], actor: %User{ap_id: "1"}, context: "", object: %{}})
assert activity.data["to"] == ["user1", "user2"]
assert activity.actor == "1"
+ assert activity.recipients == ["user1", "user2"]
end
end
@@ -252,6 +265,31 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
end
end
+ describe "fetching an object" do
+ test "it fetches an object" do
+ {:ok, object} = ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")
+ assert activity = Activity.get_create_activity_by_object_ap_id(object.data["id"])
+ assert activity.data["id"]
+
+ {:ok, object_again} = ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")
+
+ assert [attachment] = object.data["attachment"]
+ assert is_list(attachment["url"])
+
+ assert object == object_again
+ end
+
+ test "it works with objects only available via Ostatus" do
+ {:ok, object} = ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873")
+ assert activity = Activity.get_create_activity_by_object_ap_id(object.data["id"])
+ assert activity.data["id"]
+
+ {:ok, object_again} = ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873")
+
+ assert object == object_again
+ end
+ end
+
describe "following / unfollowing" do
test "creates a follow activity" do
follower = insert(:user)
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
new file mode 100644
index 000000000..96dd63057
--- /dev/null
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -0,0 +1,181 @@
+defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
+ use Pleroma.DataCase
+ alias Pleroma.Web.ActivityPub.Transmogrifier
+ alias Pleroma.Activity
+ alias Pleroma.User
+ alias Pleroma.Repo
+ import Ecto.Query
+
+ import Pleroma.Factory
+ alias Pleroma.Web.CommonAPI
+
+ describe "handle_incoming" do
+ test "it ignores an incoming notice if we already have it" do
+ activity = insert(:note_activity)
+
+ data = File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!
+ |> Map.put("object", activity.data["object"])
+
+ {:ok, returned_activity} = Transmogrifier.handle_incoming(data)
+
+ assert activity == returned_activity
+ end
+
+ test "it fetches replied-to activities if we don't have them" do
+ data = File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!
+
+ object = data["object"]
+ |> Map.put("inReplyTo", "https://shitposter.club/notice/2827873")
+
+ data = data
+ |> Map.put("object", object)
+
+ {:ok, returned_activity} = Transmogrifier.handle_incoming(data)
+
+ assert Activity.get_create_activity_by_object_ap_id("tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment")
+ end
+
+ test "it works for incoming notices" do
+ data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+ assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity"
+ assert data["context"] == "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation"
+ assert data["to"] == ["https://www.w3.org/ns/activitystreams#Public"]
+ assert data["cc"] == [
+ "http://mastodon.example.org/users/admin/followers",
+ "http://localtesting.pleroma.lol/users/lain"
+ ]
+ assert data["actor"] == "http://mastodon.example.org/users/admin"
+
+ object = data["object"]
+ assert object["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822"
+
+ assert object["to"] == ["https://www.w3.org/ns/activitystreams#Public"]
+ assert object["cc"] == [
+ "http://mastodon.example.org/users/admin/followers",
+ "http://localtesting.pleroma.lol/users/lain"
+ ]
+ assert object["actor"] == "http://mastodon.example.org/users/admin"
+ assert object["attributedTo"] == "http://mastodon.example.org/users/admin"
+ assert object["context"] == "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation"
+ assert object["sensitive"] == true
+ end
+
+ test "it works for incoming follow requests" do
+ user = insert(:user)
+ data = File.read!("test/fixtures/mastodon-follow-activity.json") |> Poison.decode!
+ |> Map.put("object", user.ap_id)
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == "http://mastodon.example.org/users/admin"
+ assert data["type"] == "Follow"
+ assert data["id"] == "http://mastodon.example.org/users/admin#follows/2"
+ assert User.following?(User.get_by_ap_id(data["actor"]), user)
+ end
+
+ test "it works for incoming likes" do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"})
+
+ data = File.read!("test/fixtures/mastodon-like.json") |> Poison.decode!
+ |> Map.put("object", activity.data["object"]["id"])
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == "http://mastodon.example.org/users/admin"
+ assert data["type"] == "Like"
+ assert data["id"] == "http://mastodon.example.org/users/admin#likes/2"
+ assert data["object"] == activity.data["object"]["id"]
+ end
+
+ test "it works for incoming announces" do
+ data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == "http://mastodon.example.org/users/admin"
+ assert data["type"] == "Announce"
+ assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
+ assert data["object"] == "http://mastodon.example.org/users/admin/statuses/99541947525187367"
+
+ assert Activity.get_create_activity_by_object_ap_id(data["object"])
+ end
+
+ test "it works for incoming announces with an existing activity" do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
+
+ data = File.read!("test/fixtures/mastodon-announce.json")
+ |> Poison.decode!
+ |> Map.put("object", activity.data["object"]["id"])
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == "http://mastodon.example.org/users/admin"
+ assert data["type"] == "Announce"
+ assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
+ assert data["object"] == activity.data["object"]["id"]
+
+ assert Activity.get_create_activity_by_object_ap_id(data["object"]).id == activity.id
+ end
+ end
+
+ describe "prepare outgoing" do
+ test "it turns mentions into tags" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey, @#{other_user.nickname}, how are ya? #2hu"})
+
+ {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
+ object = modified["object"]
+
+ expected_mention = %{
+ "href" => other_user.ap_id,
+ "name" => "@#{other_user.nickname}",
+ "type" => "Mention"
+ }
+
+ expected_tag = %{
+ "href" => Pleroma.Web.Endpoint.url <> "/tags/2hu",
+ "type" => "Hashtag",
+ "name" => "#2hu"
+ }
+
+ assert Enum.member?(object["tag"], expected_tag)
+ assert Enum.member?(object["tag"], expected_mention)
+ end
+
+ test "it adds the sensitive property" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "#nsfw hey"})
+ {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
+
+ assert modified["object"]["sensitive"]
+ end
+
+ test "it adds the json-ld context and the conversation property" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
+ {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
+
+ assert modified["@context"] == "https://www.w3.org/ns/activitystreams"
+ assert modified["object"]["conversation"] == modified["context"]
+ end
+
+ test "it sets the 'attributedTo' property to the actor of the object if it doesn't have one" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
+ {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
+
+ assert modified["object"]["actor"] == modified["object"]["attributedTo"]
+ end
+ end
+end
diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs
new file mode 100644
index 000000000..6a1311be7
--- /dev/null
+++ b/test/web/activity_pub/views/object_view_test.exs
@@ -0,0 +1,17 @@
+defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.Web.ActivityPub.ObjectView
+
+ test "renders a note object" do
+ note = insert(:note)
+
+ result = ObjectView.render("object.json", %{object: note})
+
+ assert result["id"] == note.data["id"]
+ assert result["to"] == note.data["to"]
+ assert result["content"] == note.data["content"]
+ assert result["type"] == "Note"
+ end
+end
diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs
new file mode 100644
index 000000000..0c64e62c3
--- /dev/null
+++ b/test/web/activity_pub/views/user_view_test.exs
@@ -0,0 +1,18 @@
+defmodule Pleroma.Web.ActivityPub.UserViewTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.Web.ActivityPub.UserView
+
+ test "Renders a user, including the public key" do
+ user = insert(:user)
+ {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
+
+ result = UserView.render("user.json", %{user: user})
+
+ assert result["id"] == user.ap_id
+ assert result["preferredUsername"] == user.nickname
+
+ assert String.contains?(result["publicKey"]["publicKeyPem"], "BEGIN RSA PUBLIC KEY")
+ end
+end