From 594976a538363469a37093ed25f7f79970a13163 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 15 Jul 2025 15:18:37 +0200 Subject: [PATCH] Refactor `ActivityPub::Activity::Accept` and `ActivityPub::Activity::Reject` specs (#35382) --- spec/lib/activitypub/activity/accept_spec.rb | 85 +++----- spec/lib/activitypub/activity/reject_spec.rb | 205 +++++++++---------- 2 files changed, 125 insertions(+), 165 deletions(-) diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb index d6b6071279..6d7c05e616 100644 --- a/spec/lib/activitypub/activity/accept_spec.rb +++ b/spec/lib/activitypub/activity/accept_spec.rb @@ -6,66 +6,47 @@ RSpec.describe ActivityPub::Activity::Accept do let(:sender) { Fabricate(:account) } let(:recipient) { Fabricate(:account) } - let(:json) do - { - '@context': 'https://www.w3.org/ns/activitystreams', - id: 'foo', - type: 'Accept', - actor: ActivityPub::TagManager.instance.uri_for(sender), - object: { - id: 'bar', - type: 'Follow', - actor: ActivityPub::TagManager.instance.uri_for(recipient), - object: ActivityPub::TagManager.instance.uri_for(sender), - }, - }.with_indifferent_access - end - describe '#perform' do subject { described_class.new(json, sender) } - before do - allow(RemoteAccountRefreshWorker).to receive(:perform_async) - Fabricate(:follow_request, account: recipient, target_account: sender) - subject.perform - end + context 'with a Follow request' do + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'foo', + type: 'Accept', + actor: ActivityPub::TagManager.instance.uri_for(sender), + object: { + id: 'https://abc-123/456', + type: 'Follow', + actor: ActivityPub::TagManager.instance.uri_for(recipient), + object: ActivityPub::TagManager.instance.uri_for(sender), + }, + }.deep_stringify_keys + end - it 'creates a follow relationship' do - expect(recipient.following?(sender)).to be true - end + context 'with a regular Follow' do + before do + Fabricate(:follow_request, account: recipient, target_account: sender) + end - it 'removes the follow request' do - expect(recipient.requested?(sender)).to be false - end + it 'creates a follow relationship, removes the follow request, and queues a refresh' do + expect { subject.perform } + .to change { recipient.following?(sender) }.from(false).to(true) + .and change { recipient.requested?(sender) }.from(true).to(false) - it 'queues a refresh' do - expect(RemoteAccountRefreshWorker).to have_received(:perform_async).with(sender.id) - end - end + expect(RemoteAccountRefreshWorker).to have_enqueued_sidekiq_job(sender.id) + end + end - context 'when given a relay' do - subject { described_class.new(json, sender) } + context 'when given a relay' do + let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } - let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } - - let(:json) do - { - '@context': 'https://www.w3.org/ns/activitystreams', - id: 'foo', - type: 'Accept', - actor: ActivityPub::TagManager.instance.uri_for(sender), - object: { - id: 'https://abc-123/456', - type: 'Follow', - actor: ActivityPub::TagManager.instance.uri_for(recipient), - object: ActivityPub::TagManager.instance.uri_for(sender), - }, - }.with_indifferent_access - end - - it 'marks the relay as accepted' do - subject.perform - expect(relay.reload.accepted?).to be true + it 'marks the relay as accepted' do + expect { subject.perform } + .to change { relay.reload.accepted? }.from(false).to(true) + end + end end end end diff --git a/spec/lib/activitypub/activity/reject_spec.rb b/spec/lib/activitypub/activity/reject_spec.rb index 0a4243cd16..1afb0cd403 100644 --- a/spec/lib/activitypub/activity/reject_spec.rb +++ b/spec/lib/activitypub/activity/reject_spec.rb @@ -5,14 +5,6 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Reject do let(:sender) { Fabricate(:account) } let(:recipient) { Fabricate(:account) } - let(:object_json) do - { - id: 'bar', - type: 'Follow', - actor: ActivityPub::TagManager.instance.uri_for(recipient), - object: ActivityPub::TagManager.instance.uri_for(sender), - } - end let(:json) do { @@ -21,130 +13,117 @@ RSpec.describe ActivityPub::Activity::Reject do type: 'Reject', actor: ActivityPub::TagManager.instance.uri_for(sender), object: object_json, - }.with_indifferent_access + }.deep_stringify_keys end describe '#perform' do subject { described_class.new(json, sender) } - context 'when rejecting a pending follow request by target' do - before do - Fabricate(:follow_request, account: recipient, target_account: sender) - subject.perform + context 'when rejecting a Follow' do + let(:object_json) do + { + id: 'bar', + type: 'Follow', + actor: ActivityPub::TagManager.instance.uri_for(recipient), + object: ActivityPub::TagManager.instance.uri_for(sender), + } end - it 'does not create a follow relationship' do - expect(recipient.following?(sender)).to be false + context 'when rejecting a pending follow request by target' do + before do + Fabricate(:follow_request, account: recipient, target_account: sender) + end + + it 'removes the follow request without creating a follow relationship' do + expect { subject.perform } + .to change { recipient.requested?(sender) }.from(true).to(false) + .and not_change { recipient.following?(sender) }.from(false) + end end - it 'removes the follow request' do - expect(recipient.requested?(sender)).to be false + context 'when rejecting a pending follow request by uri' do + before do + Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar') + end + + it 'removes the follow request without creating a follow relationship' do + expect { subject.perform } + .to change { recipient.requested?(sender) }.from(true).to(false) + .and not_change { recipient.following?(sender) }.from(false) + end + end + + context 'when rejecting a pending follow request by uri only' do + let(:object_json) { 'bar' } + + before do + Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar') + end + + it 'removes the follow request without creating a follow relationship' do + expect { subject.perform } + .to change { recipient.requested?(sender) }.from(true).to(false) + .and not_change { recipient.following?(sender) }.from(false) + end + end + + context 'when rejecting an existing follow relationship by target' do + before do + Fabricate(:follow, account: recipient, target_account: sender) + end + + it 'removes the follow relationship without creating a request' do + expect { subject.perform } + .to change { recipient.following?(sender) }.from(true).to(false) + .and not_change { recipient.requested?(sender) }.from(false) + end + end + + context 'when rejecting an existing follow relationship by uri' do + before do + Fabricate(:follow, account: recipient, target_account: sender, uri: 'bar') + end + + it 'removes the follow relationship without creating a request' do + expect { subject.perform } + .to change { recipient.following?(sender) }.from(true).to(false) + .and not_change { recipient.requested?(sender) }.from(false) + end + end + + context 'when rejecting an existing follow relationship by uri only' do + let(:object_json) { 'bar' } + + before do + Fabricate(:follow, account: recipient, target_account: sender, uri: 'bar') + end + + it 'removes the follow relationship without creating a request' do + expect { subject.perform } + .to change { recipient.following?(sender) }.from(true).to(false) + .and not_change { recipient.requested?(sender) }.from(false) + end end end - context 'when rejecting a pending follow request by uri' do - before do - Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar') - subject.perform - end + context 'when given a relay' do + subject { described_class.new(json, sender) } - it 'does not create a follow relationship' do - expect(recipient.following?(sender)).to be false - end + let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } - it 'removes the follow request' do - expect(recipient.requested?(sender)).to be false - end - end - - context 'when rejecting a pending follow request by uri only' do - let(:object_json) { 'bar' } - - before do - Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar') - subject.perform - end - - it 'does not create a follow relationship' do - expect(recipient.following?(sender)).to be false - end - - it 'removes the follow request' do - expect(recipient.requested?(sender)).to be false - end - end - - context 'when rejecting an existing follow relationship by target' do - before do - Fabricate(:follow, account: recipient, target_account: sender) - subject.perform - end - - it 'removes the follow relationship' do - expect(recipient.following?(sender)).to be false - end - - it 'does not create a follow request' do - expect(recipient.requested?(sender)).to be false - end - end - - context 'when rejecting an existing follow relationship by uri' do - before do - Fabricate(:follow, account: recipient, target_account: sender, uri: 'bar') - subject.perform - end - - it 'removes the follow relationship' do - expect(recipient.following?(sender)).to be false - end - - it 'does not create a follow request' do - expect(recipient.requested?(sender)).to be false - end - end - - context 'when rejecting an existing follow relationship by uri only' do - let(:object_json) { 'bar' } - - before do - Fabricate(:follow, account: recipient, target_account: sender, uri: 'bar') - subject.perform - end - - it 'removes the follow relationship' do - expect(recipient.following?(sender)).to be false - end - - it 'does not create a follow request' do - expect(recipient.requested?(sender)).to be false - end - end - end - - context 'when given a relay' do - subject { described_class.new(json, sender) } - - let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } - - let(:json) do - { - '@context': 'https://www.w3.org/ns/activitystreams', - id: 'foo', - type: 'Reject', - actor: ActivityPub::TagManager.instance.uri_for(sender), - object: { + let(:object_json) do + { id: 'https://abc-123/456', type: 'Follow', actor: ActivityPub::TagManager.instance.uri_for(recipient), object: ActivityPub::TagManager.instance.uri_for(sender), - }, - }.with_indifferent_access - end + }.with_indifferent_access + end - it 'marks the relay as rejected' do - subject.perform - expect(relay.reload.rejected?).to be true + it 'marks the relay as rejected' do + subject.perform + expect(relay.reload.rejected?).to be true + end end end end