# frozen_string_literal: true

require 'rails_helper'

RSpec.describe ActivityPub::Forwarder do
  subject { described_class.new(account, payload, status) }

  let(:account) { Fabricate(:account) }
  let(:remote_account) { Fabricate(:account, domain: 'example.com') }
  let(:status) { Fabricate(:status, account: remote_account) }

  let(:signature) { { type: 'RsaSignature2017', signatureValue: 'foo' } }
  let(:payload) do
    {
      '@context': [
        'https://www.w3.org/ns/activitystreams',
        'https://w3id.org/security/v1',
      ],
      signature: signature,
      type: 'Delete',
      object: ActivityPub::TagManager.instance.uri_for(status),
    }.deep_stringify_keys
  end

  describe '#forwardable?' do
    context 'when payload has an inlined signature' do
      it 'returns true' do
        expect(subject.forwardable?).to be true
      end
    end

    context 'when payload has an no inlined signature' do
      let(:signature) { nil }

      it 'returns true' do
        expect(subject.forwardable?).to be false
      end
    end
  end

  describe '#forward!' do
    let(:alice) { Fabricate(:account) }
    let(:bob) { Fabricate(:account) }
    let(:eve) { Fabricate(:account, domain: 'remote1.example.com', inbox_url: 'https://remote1.example.com/users/eve/inbox', protocol: :activitypub) }
    let(:mallory) { Fabricate(:account, domain: 'remote2.example.com', inbox_url: 'https://remote2.example.com/users/mallory/inbox', protocol: :activitypub) }

    before do
      alice.statuses.create!(reblog: status)
      Fabricate(:quote, status: Fabricate(:status, account: bob), quoted_status: status, state: :accepted)

      eve.follow!(alice)
      mallory.follow!(bob)
    end

    it 'correctly forwards to expected remote followers' do
      expect { subject.forward! }
        .to enqueue_sidekiq_job(ActivityPub::LowPriorityDeliveryWorker).with(payload.to_json, anything, eve.preferred_inbox_url)
        .and enqueue_sidekiq_job(ActivityPub::LowPriorityDeliveryWorker).with(payload.to_json, anything, mallory.preferred_inbox_url)
    end
  end
end
