Transmogrify outgoing nsfw.
[akkoma] / test / web / activity_pub / transmogrifier_test.exs
index 269429359e986e51deaa619a2879015e392e0058..6271e200edfdac094119c99ef32ad1071d3d9858 100644 (file)
@@ -2,6 +2,12 @@ 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 works for incoming notices" do
@@ -28,5 +34,118 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
       assert object["actor"] == "http://mastodon.example.org/users/admin"
       assert object["attributedTo"] == "http://mastodon.example.org/users/admin"
     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