Merge branch 'bugfix/follower_count' into 'develop'
[akkoma] / test / web / activity_pub / utils_test.exs
index 2e5e95795ef08a278d9751b1f4d5270fed801193..758214e680c44560f67db810f7fa72fdaab627d1 100644 (file)
@@ -1,10 +1,34 @@
 defmodule Pleroma.Web.ActivityPub.UtilsTest do
   use Pleroma.DataCase
-  alias Pleroma.Web.CommonAPI
+  alias Pleroma.Activity
+  alias Pleroma.Repo
+  alias Pleroma.User
+  alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.ActivityPub.Utils
+  alias Pleroma.Web.CommonAPI
 
   import Pleroma.Factory
 
+  describe "fetch the latest Follow" do
+    test "fetches the latest Follow activity" do
+      %Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity)
+      follower = Repo.get_by(User, ap_id: activity.data["actor"])
+      followed = Repo.get_by(User, ap_id: activity.data["object"])
+
+      assert activity == Utils.fetch_latest_follow(follower, followed)
+    end
+  end
+
+  describe "fetch the latest Block" do
+    test "fetches the latest Block activity" do
+      blocker = insert(:user)
+      blocked = insert(:user)
+      {:ok, activity} = ActivityPub.block(blocker, blocked)
+
+      assert activity == Utils.fetch_latest_block(blocker, blocked)
+    end
+  end
+
   describe "determine_explicit_mentions()" do
     test "works with an object that has mentions" do
       object = %{
@@ -104,4 +128,81 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
       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
+
+  test "make_json_ld_header/0" do
+    assert Utils.make_json_ld_header() == %{
+             "@context" => [
+               "https://www.w3.org/ns/activitystreams",
+               "http://localhost:4001/schemas/litepub-0.1.jsonld",
+               %{
+                 "@language" => "und"
+               }
+             ]
+           }
+  end
 end