Add tests for transient accept/rejects
ci/woodpecker/push/woodpecker Pipeline is pending Details

This commit is contained in:
FloatingGhost 2022-12-02 10:36:22 +00:00
parent 2670e16678
commit 431f88c731
3 changed files with 80 additions and 4 deletions

View File

@ -371,7 +371,7 @@ defmodule Pleroma.Activity do
Queries.by_type("Follow")
|> where([a], a.actor == ^ap_id)
|> where([a], fragment("?->>'object' = ?", a.data, ^followed_ap_id))
|> where([a], fragment("?->>'state'", a.data) in ["pending", "accepted"])
|> where([a], fragment("?->>'state'", a.data) in ["pending", "accept"])
|> Repo.one()
end

View File

@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
alias Pleroma.Activity
alias Pleroma.User
alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.CommonAPI
import Pleroma.Factory
@ -53,6 +54,80 @@ 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)

View File

@ -452,15 +452,16 @@ defmodule Pleroma.Factory do
}
end
def follow_activity_factory do
follower = insert(:user)
followed = insert(:user)
def follow_activity_factory(attrs \\ %{}) do
follower = attrs[:follower] || insert(:user)
followed = attrs[:followed] || insert(:user)
data = %{
"id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
"actor" => follower.ap_id,
"type" => "Follow",
"object" => followed.ap_id,
"state" => attrs[:state] || "pending",
"published_at" => DateTime.utc_now() |> DateTime.to_iso8601()
}