Merge branch 'features/add-credo-to-ci' into 'develop'
[akkoma] / test / web / activity_pub / utils_test.exs
index aeed0564c79a069d736d71500786179b2e362724..2bd3ddf932c632ab017128e81a69ff8bd31643e4 100644 (file)
@@ -1,6 +1,9 @@
 defmodule Pleroma.Web.ActivityPub.UtilsTest do
   use Pleroma.DataCase
   alias Pleroma.Web.ActivityPub.Utils
+  alias Pleroma.Web.CommonAPI
+
+  import Pleroma.Factory
 
   describe "determine_explicit_mentions()" do
     test "works with an object that has mentions" do
@@ -54,4 +57,116 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
       assert Utils.determine_explicit_mentions(object) == []
     end
   end
+
+  describe "make_like_data" do
+    setup do
+      user = insert(:user)
+      other_user = insert(:user)
+      third_user = insert(:user)
+      [user: user, other_user: other_user, third_user: third_user]
+    end
+
+    test "addresses actor's follower address if the activity is public", %{
+      user: user,
+      other_user: other_user,
+      third_user: third_user
+    } do
+      expected_to = Enum.sort([user.ap_id, other_user.follower_address])
+      expected_cc = Enum.sort(["https://www.w3.org/ns/activitystreams#Public", third_user.ap_id])
+
+      {:ok, activity} =
+        CommonAPI.post(user, %{
+          "status" =>
+            "hey @#{other_user.nickname}, @#{third_user.nickname} how about beering together this weekend?"
+        })
+
+      %{"to" => to, "cc" => cc} = Utils.make_like_data(other_user, activity, nil)
+      assert Enum.sort(to) == expected_to
+      assert Enum.sort(cc) == expected_cc
+    end
+
+    test "does not adress actor's follower address if the activity is not public", %{
+      user: user,
+      other_user: other_user,
+      third_user: third_user
+    } do
+      expected_to = Enum.sort([user.ap_id])
+      expected_cc = [third_user.ap_id]
+
+      {:ok, activity} =
+        CommonAPI.post(user, %{
+          "status" => "@#{other_user.nickname} @#{third_user.nickname} bought a new swimsuit!",
+          "visibility" => "private"
+        })
+
+      %{"to" => to, "cc" => cc} = Utils.make_like_data(other_user, activity, nil)
+      assert Enum.sort(to) == expected_to
+      assert Enum.sort(cc) == expected_cc
+    end
+  end
+
+  describe "fetch_ordered_collection" do
+    import Tesla.Mock
+
+    test "fetches the first OrderedCollectionPage when an OrderedCollection is encountered" do
+      mock(fn
+        %{method: :get, url: "http://mastodon.com/outbox"} ->
+          json(%{"type" => "OrderedCollection", "first" => "http://mastodon.com/outbox?page=true"})
+
+        %{method: :get, url: "http://mastodon.com/outbox?page=true"} ->
+          json(%{"type" => "OrderedCollectionPage", "orderedItems" => ["ok"]})
+      end)
+
+      assert Utils.fetch_ordered_collection("http://mastodon.com/outbox", 1) == ["ok"]
+    end
+
+    test "fetches several pages in the right order one after another, but only the specified amount" do
+      mock(fn
+        %{method: :get, url: "http://example.com/outbox"} ->
+          json(%{
+            "type" => "OrderedCollectionPage",
+            "orderedItems" => [0],
+            "next" => "http://example.com/outbox?page=1"
+          })
+
+        %{method: :get, url: "http://example.com/outbox?page=1"} ->
+          json(%{
+            "type" => "OrderedCollectionPage",
+            "orderedItems" => [1],
+            "next" => "http://example.com/outbox?page=2"
+          })
+
+        %{method: :get, url: "http://example.com/outbox?page=2"} ->
+          json(%{"type" => "OrderedCollectionPage", "orderedItems" => [2]})
+      end)
+
+      assert Utils.fetch_ordered_collection("http://example.com/outbox", 0) == [0]
+      assert Utils.fetch_ordered_collection("http://example.com/outbox", 1) == [0, 1]
+    end
+
+    test "returns an error if the url doesn't have an OrderedCollection/Page" do
+      mock(fn
+        %{method: :get, url: "http://example.com/not-an-outbox"} ->
+          json(%{"type" => "NotAnOutbox"})
+      end)
+
+      assert {:error, _} = Utils.fetch_ordered_collection("http://example.com/not-an-outbox", 1)
+    end
+
+    test "returns the what was collected if there are less pages than specified" do
+      mock(fn
+        %{method: :get, url: "http://example.com/outbox"} ->
+          json(%{
+            "type" => "OrderedCollectionPage",
+            "orderedItems" => [0],
+            "next" => "http://example.com/outbox?page=1"
+          })
+
+        %{method: :get, url: "http://example.com/outbox?page=1"} ->
+          json(%{"type" => "OrderedCollectionPage", "orderedItems" => [1]})
+      end)
+
+      assert Utils.fetch_ordered_collection("http://example.com/outbox", 5) == [0, 1]
+    end
+  end
 end