Merge branch 'develop' into feature/bulk-confirmation
[akkoma] / test / object / fetcher_test.exs
index 4775ee1520857d9aba5a8b5adfb77263944efe16..14d2c645fe4fbbbc83f62bc70b157eef0e9ff345 100644 (file)
@@ -6,10 +6,12 @@ defmodule Pleroma.Object.FetcherTest do
   use Pleroma.DataCase
 
   alias Pleroma.Activity
+  alias Pleroma.Config
   alias Pleroma.Object
   alias Pleroma.Object.Fetcher
-  import Tesla.Mock
+
   import Mock
+  import Tesla.Mock
 
   setup do
     mock(fn
@@ -26,26 +28,65 @@ defmodule Pleroma.Object.FetcherTest do
     :ok
   end
 
+  describe "error cases" do
+    setup do
+      mock(fn
+        %{method: :get, url: "https://social.sakamoto.gq/notice/9wTkLEnuq47B25EehM"} ->
+          %Tesla.Env{
+            status: 200,
+            body: File.read!("test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json")
+          }
+
+        %{method: :get, url: "https://social.sakamoto.gq/users/eal"} ->
+          %Tesla.Env{
+            status: 200,
+            body: File.read!("test/fixtures/fetch_mocks/eal.json")
+          }
+
+        %{method: :get, url: "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069"} ->
+          %Tesla.Env{
+            status: 200,
+            body: File.read!("test/fixtures/fetch_mocks/104410921027210069.json")
+          }
+
+        %{method: :get, url: "https://busshi.moe/users/tuxcrafting"} ->
+          %Tesla.Env{
+            status: 500
+          }
+      end)
+
+      :ok
+    end
+
+    @tag capture_log: true
+    test "it works when fetching the OP actor errors out" do
+      # Here we simulate a case where the author of the OP can't be read
+      assert {:ok, _} =
+               Fetcher.fetch_object_from_id(
+                 "https://social.sakamoto.gq/notice/9wTkLEnuq47B25EehM"
+               )
+    end
+  end
+
   describe "max thread distance restriction" do
     @ap_id "http://mastodon.example.org/@admin/99541947525187367"
-
-    clear_config([:instance, :federation_incoming_replies_max_depth])
+    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])
 
     test "it returns thread depth exceeded error if thread depth is exceeded" do
-      Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0)
+      Config.put([:instance, :federation_incoming_replies_max_depth], 0)
 
       assert {:error, "Max thread distance exceeded."} =
                Fetcher.fetch_object_from_id(@ap_id, depth: 1)
     end
 
     test "it fetches object if max thread depth is restricted to 0 and depth is not specified" do
-      Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0)
+      Config.put([:instance, :federation_incoming_replies_max_depth], 0)
 
       assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id)
     end
 
     test "it fetches object if requested depth does not exceed max thread depth" do
-      Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 10)
+      Config.put([:instance, :federation_incoming_replies_max_depth], 10)
 
       assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id, depth: 10)
     end
@@ -81,6 +122,16 @@ defmodule Pleroma.Object.FetcherTest do
 
       assert object == object_again
     end
+
+    test "Return MRF reason when fetched status is rejected by one" do
+      clear_config([:mrf_keyword, :reject], ["yeah"])
+      clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy])
+
+      assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} ==
+               Fetcher.fetch_object_from_id(
+                 "http://mastodon.example.org/@admin/99541947525187367"
+               )
+    end
   end
 
   describe "implementation quirks" do
@@ -138,6 +189,13 @@ defmodule Pleroma.Object.FetcherTest do
                  "https://mastodon.example.org/users/userisgone404"
                )
     end
+
+    test "it can fetch pleroma polls with attachments" do
+      {:ok, object} =
+        Fetcher.fetch_object_from_id("https://patch.cx/objects/tesla_mock/poll_attachment")
+
+      assert object
+    end
   end
 
   describe "pruning" do
@@ -160,13 +218,13 @@ defmodule Pleroma.Object.FetcherTest do
   end
 
   describe "signed fetches" do
-    clear_config([:activitypub, :sign_object_fetches])
+    setup do: clear_config([:activitypub, :sign_object_fetches])
 
     test_with_mock "it signs fetches when configured to do so",
                    Pleroma.Signature,
                    [:passthrough],
                    [] do
-      Pleroma.Config.put([:activitypub, :sign_object_fetches], true)
+      Config.put([:activitypub, :sign_object_fetches], true)
 
       Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")
 
@@ -177,7 +235,7 @@ defmodule Pleroma.Object.FetcherTest do
                    Pleroma.Signature,
                    [:passthrough],
                    [] do
-      Pleroma.Config.put([:activitypub, :sign_object_fetches], false)
+      Config.put([:activitypub, :sign_object_fetches], false)
 
       Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")