Refactor ActivityPub::Activity::Accept and ActivityPub::Activity::Reject specs (#35382)

This commit is contained in:
Claire 2025-07-15 15:18:37 +02:00 committed by GitHub
parent 0efb889a9c
commit 594976a538
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 125 additions and 165 deletions

View File

@ -6,66 +6,47 @@ RSpec.describe ActivityPub::Activity::Accept do
let(:sender) { Fabricate(:account) } let(:sender) { Fabricate(:account) }
let(:recipient) { 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 describe '#perform' do
subject { described_class.new(json, sender) } subject { described_class.new(json, sender) }
before do context 'with a Follow request' do
allow(RemoteAccountRefreshWorker).to receive(:perform_async) let(:json) do
Fabricate(:follow_request, account: recipient, target_account: sender) {
subject.perform '@context': 'https://www.w3.org/ns/activitystreams',
end 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 context 'with a regular Follow' do
expect(recipient.following?(sender)).to be true before do
end Fabricate(:follow_request, account: recipient, target_account: sender)
end
it 'removes the follow request' do it 'creates a follow relationship, removes the follow request, and queues a refresh' do
expect(recipient.requested?(sender)).to be false expect { subject.perform }
end .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_enqueued_sidekiq_job(sender.id)
expect(RemoteAccountRefreshWorker).to have_received(:perform_async).with(sender.id) end
end end
end
context 'when given a relay' do 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!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') } it 'marks the relay as accepted' do
expect { subject.perform }
let(:json) do .to change { relay.reload.accepted? }.from(false).to(true)
{ end
'@context': 'https://www.w3.org/ns/activitystreams', end
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
end end
end end
end end

View File

@ -5,14 +5,6 @@ require 'rails_helper'
RSpec.describe ActivityPub::Activity::Reject do RSpec.describe ActivityPub::Activity::Reject do
let(:sender) { Fabricate(:account) } let(:sender) { Fabricate(:account) }
let(:recipient) { 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 let(:json) do
{ {
@ -21,130 +13,117 @@ RSpec.describe ActivityPub::Activity::Reject do
type: 'Reject', type: 'Reject',
actor: ActivityPub::TagManager.instance.uri_for(sender), actor: ActivityPub::TagManager.instance.uri_for(sender),
object: object_json, object: object_json,
}.with_indifferent_access }.deep_stringify_keys
end end
describe '#perform' do describe '#perform' do
subject { described_class.new(json, sender) } subject { described_class.new(json, sender) }
context 'when rejecting a pending follow request by target' do context 'when rejecting a Follow' do
before do let(:object_json) do
Fabricate(:follow_request, account: recipient, target_account: sender) {
subject.perform id: 'bar',
type: 'Follow',
actor: ActivityPub::TagManager.instance.uri_for(recipient),
object: ActivityPub::TagManager.instance.uri_for(sender),
}
end end
it 'does not create a follow relationship' do context 'when rejecting a pending follow request by target' do
expect(recipient.following?(sender)).to be false 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 end
it 'removes the follow request' do context 'when rejecting a pending follow request by uri' do
expect(recipient.requested?(sender)).to be false 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
end end
context 'when rejecting a pending follow request by uri' do context 'when given a relay' do
before do subject { described_class.new(json, sender) }
Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar')
subject.perform
end
it 'does not create a follow relationship' do let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') }
expect(recipient.following?(sender)).to be false
end
it 'removes the follow request' do let(:object_json) 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: {
id: 'https://abc-123/456', id: 'https://abc-123/456',
type: 'Follow', type: 'Follow',
actor: ActivityPub::TagManager.instance.uri_for(recipient), actor: ActivityPub::TagManager.instance.uri_for(recipient),
object: ActivityPub::TagManager.instance.uri_for(sender), object: ActivityPub::TagManager.instance.uri_for(sender),
}, }.with_indifferent_access
}.with_indifferent_access end
end
it 'marks the relay as rejected' do it 'marks the relay as rejected' do
subject.perform subject.perform
expect(relay.reload.rejected?).to be true expect(relay.reload.rejected?).to be true
end
end end
end end
end end