Resolve follow activity from accept/reject without ID (#328)
[akkoma] / test / pleroma / web / activity_pub / transmogrifier / reject_handling_test.exs
index 5c1451defa070129aa7a7f05f035455bbf606275..52a61f3103ca3ceb0586ee17b2a49b768e5ba2b8 100644 (file)
@@ -1,13 +1,14 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
-  use Pleroma.DataCase
+  use Pleroma.DataCase, async: true
 
   alias Pleroma.Activity
   alias Pleroma.User
   alias Pleroma.Web.ActivityPub.Transmogrifier
+  alias Pleroma.Web.ActivityPub.Utils
   alias Pleroma.Web.CommonAPI
 
   import Pleroma.Factory
@@ -18,7 +19,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
 
     accept_data =
       File.read!("test/fixtures/mastodon-reject-activity.json")
-      |> Poison.decode!()
+      |> Jason.decode!()
       |> Map.put("actor", followed.ap_id)
 
     accept_data =
@@ -35,14 +36,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
     follower = insert(:user)
     followed = insert(:user, is_locked: true)
 
-    {:ok, follower} = User.follow(follower, followed)
+    {:ok, follower, followed} = User.follow(follower, followed)
     {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)
 
     assert User.following?(follower, followed) == true
 
     reject_data =
       File.read!("test/fixtures/mastodon-reject-activity.json")
-      |> Poison.decode!()
+      |> Jason.decode!()
       |> Map.put("actor", followed.ap_id)
       |> Map.put("object", follow_activity.data["id"])
 
@@ -53,12 +54,87 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
     assert User.following?(follower, followed) == false
   end
 
+  describe "when accept/reject references a transient activity" do
+    test "it handles accept activities that do not contain an ID key" do
+      follower = insert(:user)
+      followed = insert(:user, is_locked: true)
+
+      pending_follow =
+        insert(:follow_activity, follower: follower, followed: followed, state: "pending")
+
+      refute User.following?(follower, followed)
+
+      without_id = Map.delete(pending_follow.data, "id")
+
+      reject_data =
+        File.read!("test/fixtures/mastodon-reject-activity.json")
+        |> Jason.decode!()
+        |> Map.put("actor", followed.ap_id)
+        |> Map.delete("id")
+        |> Map.put("object", without_id)
+
+      {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
+
+      follower = User.get_cached_by_id(follower.id)
+
+      refute User.following?(follower, followed)
+      assert Utils.fetch_latest_follow(follower, followed).data["state"] == "reject"
+    end
+
+    test "it handles reject activities that do not contain an ID key" do
+      follower = insert(:user)
+      followed = insert(:user)
+      {:ok, follower, followed} = User.follow(follower, followed)
+      {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)
+      assert Utils.fetch_latest_follow(follower, followed).data["state"] == "accept"
+      assert User.following?(follower, followed)
+
+      without_id = Map.delete(follow_activity.data, "id")
+
+      reject_data =
+        File.read!("test/fixtures/mastodon-reject-activity.json")
+        |> Jason.decode!()
+        |> Map.put("actor", followed.ap_id)
+        |> Map.delete("id")
+        |> Map.put("object", without_id)
+
+      {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
+
+      follower = User.get_cached_by_id(follower.id)
+
+      refute User.following?(follower, followed)
+      assert Utils.fetch_latest_follow(follower, followed).data["state"] == "reject"
+    end
+
+    test "it does not accept follows that are not in pending or accepted" do
+      follower = insert(:user)
+      followed = insert(:user, is_locked: true)
+
+      rejected_follow =
+        insert(:follow_activity, follower: follower, followed: followed, state: "reject")
+
+      refute User.following?(follower, followed)
+
+      without_id = Map.delete(rejected_follow.data, "id")
+
+      accept_data =
+        File.read!("test/fixtures/mastodon-accept-activity.json")
+        |> Jason.decode!()
+        |> Map.put("actor", followed.ap_id)
+        |> Map.put("object", without_id)
+
+      {:error, _} = Transmogrifier.handle_incoming(accept_data)
+
+      refute User.following?(follower, followed)
+    end
+  end
+
   test "it rejects activities without a valid ID" do
     user = insert(:user)
 
     data =
       File.read!("test/fixtures/mastodon-follow-activity.json")
-      |> Poison.decode!()
+      |> Jason.decode!()
       |> Map.put("object", user.ap_id)
       |> Map.put("id", "")