# frozen_string_literal: true

require 'rails_helper'

RSpec.describe ActivateRemoteStatusesService, type: :service do
  subject { described_class.new.call(sender) }

  let(:sender) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/actor') }
  let(:alice) { Fabricate(:account) }
  let!(:pending_status) { Fabricate(:pending_status, account: sender, fetch_account: alice, uri: 'https://example.com/note') }

  let(:payload) do
    {
      '@context': 'https://www.w3.org/ns/activitystreams',
      id: pending_status.uri,
      attributedTo: sender.uri,
      type: 'Note',
      content: 'Lorem ipsum',
      to: 'https://www.w3.org/ns/activitystreams#Public',
      tag: [
        {
          type: 'Mention',
          href: ActivityPub::TagManager.instance.uri_for(alice),
        },
      ],
    }
  end
  let(:json) { Oj.dump(payload) }

  before do
    stub_request(:get, 'https://example.com/note').to_return(status: 200, body: json, headers: { 'Content-Type': 'application/activity+json' })
  end

  context 'when has a pending status' do
    before do
      subject
    end

    it 'original status is fetched', :inline_jobs do
      status = sender.statuses.first

      expect(status).to_not be_nil
      expect(status.text).to eq 'Lorem ipsum'
    end

    it 'pending request is removed' do
      expect { pending_status.reload }.to raise_error ActiveRecord::RecordNotFound
    end
  end

  context 'when target_account is suspended' do
    before do
      alice.suspend!
      subject
    end

    it 'original status is not fetched', :inline_jobs do
      status = sender.statuses.first

      expect(status).to be_nil
    end

    it 'pending request is removed' do
      expect { pending_status.reload }.to raise_error ActiveRecord::RecordNotFound
    end
  end
end