summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgor Kislitsyn <egor@kislitsyn.com>2020-02-06 16:47:15 +0400
committerEgor Kislitsyn <egor@kislitsyn.com>2020-02-06 18:02:33 +0400
commit8b9742ecf546c37695229d54f0a0b3ed4edd66e1 (patch)
tree4156b1f31a8c2c41056dd10df4b3f9d05170a0d3
parent8c71f7e11a377d92234c141ea50170485e773fdc (diff)
Cancellation of a follow request for a remote user
-rw-r--r--lib/pleroma/following_relationship.ex23
-rw-r--r--test/web/common_api/common_api_test.exs26
2 files changed, 44 insertions, 5 deletions
diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex
index 0b0219b82..cc381af53 100644
--- a/lib/pleroma/following_relationship.ex
+++ b/lib/pleroma/following_relationship.ex
@@ -30,9 +30,24 @@ defmodule Pleroma.FollowingRelationship do
end
def get(%User{} = follower, %User{} = following) do
- __MODULE__
- |> where(follower_id: ^follower.id, following_id: ^following.id)
- |> Repo.one()
+ following_relationship =
+ __MODULE__
+ |> where(follower_id: ^follower.id, following_id: ^following.id)
+ |> Repo.one()
+
+ case {following_relationship, following.local} do
+ {nil, false} ->
+ case Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, following) do
+ %{data: %{"state" => state}} when state in ["pending", "accept"] ->
+ %{state: state}
+
+ _ ->
+ nil
+ end
+
+ {following_relationship, _} ->
+ following_relationship
+ end
end
def update(follower, following, "reject"), do: unfollow(follower, following)
@@ -58,8 +73,8 @@ defmodule Pleroma.FollowingRelationship do
def unfollow(%User{} = follower, %User{} = following) do
case get(follower, following) do
- nil -> {:ok, nil}
%__MODULE__{} = following_relationship -> Repo.delete(following_relationship)
+ _ -> {:ok, nil}
end
end
diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs
index 2bbe6c923..7eff24ce4 100644
--- a/test/web/common_api/common_api_test.exs
+++ b/test/web/common_api/common_api_test.exs
@@ -537,7 +537,7 @@ defmodule Pleroma.Web.CommonAPITest do
refute User.subscribed_to?(follower, followed)
end
- test "cancels a pending follow" do
+ test "cancels a pending follow for a local user" do
follower = insert(:user)
followed = insert(:user, locked: true)
@@ -560,6 +560,30 @@ defmodule Pleroma.Web.CommonAPITest do
}
} = Pleroma.Web.ActivityPub.Utils.fetch_latest_undo(follower)
end
+
+ test "cancels a pending follow for a remote user" do
+ follower = insert(:user)
+ followed = insert(:user, locked: true, local: false, ap_enabled: true)
+
+ assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =
+ CommonAPI.follow(follower, followed)
+
+ assert %{state: "pending"} = Pleroma.FollowingRelationship.get(follower, followed)
+
+ assert {:ok, follower} = CommonAPI.unfollow(follower, followed)
+
+ assert Pleroma.FollowingRelationship.get(follower, followed) == nil
+
+ assert %{id: ^activity_id, data: %{"state" => "cancelled"}} =
+ Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed)
+
+ assert %{
+ data: %{
+ "type" => "Undo",
+ "object" => %{"type" => "Follow", "state" => "cancelled"}
+ }
+ } = Pleroma.Web.ActivityPub.Utils.fetch_latest_undo(follower)
+ end
end
describe "accept_follow_request/2" do