activitypub-academy/spec/lib/activity_log_audience_helper_spec.rb
2023-07-03 19:43:30 +02:00

101 lines
3.5 KiB
Ruby

require 'json'
require 'rails_helper'
def activity_log_event_fixture(name)
json_string = File.read(Rails.root.join('spec', 'fixtures', 'activity_log_events', name))
ActivityLogEvent.from_json_string(json_string)
end
RSpec.describe ActivityLogAudienceHelper do
describe '#audience' do
around do |example|
before = Rails.configuration.x.web_domain
example.run
Rails.configuration.x.web_domain = before
end
describe 'for outbound events' do
it 'returns the sender if the domain matches' do
Rails.configuration.x.web_domain = 'example.com'
outbound_event = activity_log_event_fixture('outbound.json')
expect(ActivityLogAudienceHelper.audience(outbound_event)).to eq ['alice']
end
it 'returns nothing if the domain does not match' do
Rails.configuration.x.web_domain = 'does-not-match.com'
outbound_event = activity_log_event_fixture('outbound.json')
expect(ActivityLogAudienceHelper.audience(outbound_event)).to eq []
end
it 'returns nothing if the activity does not have a sender' do
Rails.configuration.x.web_domain = 'example.com'
outbound_event_tmp = activity_log_event_fixture('outbound.json')
outbound_event = ActivityLogEvent.new(
outbound_event_tmp.type,
nil,
outbound_event_tmp.path,
outbound_event_tmp.data
)
expect(ActivityLogAudienceHelper.audience(outbound_event)).to eq []
end
end
describe 'for inbound events' do
it 'returns the inbox owner if it is sent to a personal inbox' do
Rails.configuration.x.web_domain = 'example.com'
inbound_event = activity_log_event_fixture('inbound-to-users-inbox.json')
expect(ActivityLogAudienceHelper.audience(inbound_event)).to eq ['bob']
end
it 'returns direct audience from to, bto, cc, bcc if sent to public inbox' do
Rails.configuration.x.web_domain = 'example.com'
inbound_event = activity_log_event_fixture('inbound-with-multiple-recipients.json')
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([
'first-to',
'second-to',
'single-bto',
'one-cc',
'one-bcc'
])
end
it 'returns followers from to, bto, cc, bcc if sent to public inbox' do
Rails.configuration.x.web_domain = 'example.com'
inbound_event = activity_log_event_fixture('inbound-with-follower-recipients.json')
bob = Fabricate(:account, username: 'bob', followers_url: 'https://other.org/users/bob/followers')
Fabricate(:account, username: 'first_follower').follow!(bob)
Fabricate(:account, username: 'second_follower').follow!(bob)
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([
'first_follower',
'second_follower',
])
end
it 'removes duplicates from audience' do
Rails.configuration.x.web_domain = 'example.com'
inbound_event = activity_log_event_fixture('inbound-with-duplicate-recipients.json')
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([
'first-to',
'second-to'
])
end
it 'handles null in array correctly' do
Rails.configuration.x.web_domain = 'example.com'
inbound_event = activity_log_event_fixture('inbound-with-null-in-array.json')
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([])
end
end
end
end