Merge branch 'from/develop/tusooa/2802-propagate-reject' into 'develop'
Handle Reject for already-accepted Follows properly Closes #2766 and #2802 See merge request pleroma/pleroma!3568
This commit is contained in:
commit
d9746ae4cb
|
@ -18,6 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Subscription(Bell) Notifications: Don't create from Pipeline Ingested replies
|
- Subscription(Bell) Notifications: Don't create from Pipeline Ingested replies
|
||||||
|
- Handle Reject for already-accepted Follows properly
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
|
|
@ -446,7 +446,7 @@ def update_follow_state_for_all(
|
||||||
|> Activity.Queries.by_type()
|
|> Activity.Queries.by_type()
|
||||||
|> Activity.Queries.by_actor(actor)
|
|> Activity.Queries.by_actor(actor)
|
||||||
|> Activity.Queries.by_object_id(object)
|
|> Activity.Queries.by_object_id(object)
|
||||||
|> where(fragment("data->>'state' = 'pending'"))
|
|> where(fragment("data->>'state' = 'pending'") or fragment("data->>'state' = 'accept'"))
|
||||||
|> update(set: [data: fragment("jsonb_set(data, '{state}', ?)", ^state)])
|
|> update(set: [data: fragment("jsonb_set(data, '{state}', ?)", ^state)])
|
||||||
|> Repo.update_all([])
|
|> Repo.update_all([])
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,16 @@ test "it unfollows and blocks", %{user: user, blocked: blocked, block: block} do
|
||||||
assert User.blocks?(user, blocked)
|
assert User.blocks?(user, blocked)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it updates following relationship", %{user: user, blocked: blocked, block: block} do
|
||||||
|
{:ok, _, _} = SideEffects.handle(block)
|
||||||
|
|
||||||
|
refute Pleroma.FollowingRelationship.get(user, blocked)
|
||||||
|
assert User.get_follow_state(user, blocked) == nil
|
||||||
|
assert User.get_follow_state(blocked, user) == nil
|
||||||
|
assert User.get_follow_state(user, blocked, nil) == nil
|
||||||
|
assert User.get_follow_state(blocked, user, nil) == nil
|
||||||
|
end
|
||||||
|
|
||||||
test "it blocks but does not unfollow if the relevant setting is set", %{
|
test "it blocks but does not unfollow if the relevant setting is set", %{
|
||||||
user: user,
|
user: user,
|
||||||
blocked: blocked,
|
blocked: blocked,
|
||||||
|
@ -542,4 +552,74 @@ test "it streams out the announce", %{announce: announce} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "removing a follower" do
|
||||||
|
setup do
|
||||||
|
user = insert(:user)
|
||||||
|
followed = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _, follow_activity} = CommonAPI.follow(user, followed)
|
||||||
|
|
||||||
|
{:ok, reject_data, []} = Builder.reject(followed, follow_activity)
|
||||||
|
{:ok, reject, _meta} = ActivityPub.persist(reject_data, local: true)
|
||||||
|
|
||||||
|
%{user: user, followed: followed, reject: reject}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "", %{user: user, followed: followed, reject: reject} do
|
||||||
|
assert User.following?(user, followed)
|
||||||
|
assert Pleroma.FollowingRelationship.get(user, followed)
|
||||||
|
|
||||||
|
{:ok, _, _} = SideEffects.handle(reject)
|
||||||
|
|
||||||
|
refute User.following?(user, followed)
|
||||||
|
refute Pleroma.FollowingRelationship.get(user, followed)
|
||||||
|
assert User.get_follow_state(user, followed) == nil
|
||||||
|
assert User.get_follow_state(user, followed, nil) == nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "removing a follower from remote" do
|
||||||
|
setup do
|
||||||
|
user = insert(:user)
|
||||||
|
followed = insert(:user, local: false)
|
||||||
|
|
||||||
|
# Mock a local-to-remote follow
|
||||||
|
{:ok, follow_data, []} = Builder.follow(user, followed)
|
||||||
|
|
||||||
|
follow_data =
|
||||||
|
follow_data
|
||||||
|
|> Map.put("state", "accept")
|
||||||
|
|
||||||
|
{:ok, follow, _meta} = ActivityPub.persist(follow_data, local: true)
|
||||||
|
{:ok, _, _} = SideEffects.handle(follow)
|
||||||
|
|
||||||
|
# Mock a remote-to-local accept
|
||||||
|
{:ok, accept_data, _} = Builder.accept(followed, follow)
|
||||||
|
{:ok, accept, _} = ActivityPub.persist(accept_data, local: false)
|
||||||
|
{:ok, _, _} = SideEffects.handle(accept)
|
||||||
|
|
||||||
|
# Mock a remote-to-local reject
|
||||||
|
{:ok, reject_data, []} = Builder.reject(followed, follow)
|
||||||
|
{:ok, reject, _meta} = ActivityPub.persist(reject_data, local: false)
|
||||||
|
|
||||||
|
%{user: user, followed: followed, reject: reject}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "", %{user: user, followed: followed, reject: reject} do
|
||||||
|
assert User.following?(user, followed)
|
||||||
|
assert Pleroma.FollowingRelationship.get(user, followed)
|
||||||
|
|
||||||
|
{:ok, _, _} = SideEffects.handle(reject)
|
||||||
|
|
||||||
|
refute User.following?(user, followed)
|
||||||
|
refute Pleroma.FollowingRelationship.get(user, followed)
|
||||||
|
|
||||||
|
assert Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(user, followed).data["state"] ==
|
||||||
|
"reject"
|
||||||
|
|
||||||
|
assert User.get_follow_state(user, followed) == nil
|
||||||
|
assert User.get_follow_state(user, followed, nil) == nil
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -213,6 +213,20 @@ test "updates the state of all Follow activities with the same actor and object"
|
||||||
assert refresh_record(follow_activity).data["state"] == "accept"
|
assert refresh_record(follow_activity).data["state"] == "accept"
|
||||||
assert refresh_record(follow_activity_two).data["state"] == "accept"
|
assert refresh_record(follow_activity_two).data["state"] == "accept"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "also updates the state of accepted follows" do
|
||||||
|
user = insert(:user)
|
||||||
|
follower = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _, follow_activity} = CommonAPI.follow(follower, user)
|
||||||
|
{:ok, _, _, follow_activity_two} = CommonAPI.follow(follower, user)
|
||||||
|
|
||||||
|
{:ok, follow_activity_two} =
|
||||||
|
Utils.update_follow_state_for_all(follow_activity_two, "reject")
|
||||||
|
|
||||||
|
assert refresh_record(follow_activity).data["state"] == "reject"
|
||||||
|
assert refresh_record(follow_activity_two).data["state"] == "reject"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "update_follow_state/2" do
|
describe "update_follow_state/2" do
|
||||||
|
|
Loading…
Reference in a new issue