diff options
Diffstat (limited to 'test/web/activity_pub')
-rw-r--r-- | test/web/activity_pub/activity_pub_controller_test.exs | 46 | ||||
-rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 40 | ||||
-rw-r--r-- | test/web/activity_pub/transmogrifier_test.exs | 181 | ||||
-rw-r--r-- | test/web/activity_pub/views/object_view_test.exs | 17 | ||||
-rw-r--r-- | test/web/activity_pub/views/user_view_test.exs | 18 |
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 |