# frozen_string_literal: true

require 'rails_helper'

RSpec.describe Scheduler::SelfDestructScheduler do
  let(:worker) { described_class.new }

  describe '#perform' do
    let!(:account) { Fabricate(:account, domain: nil, suspended_at: nil) }

    context 'when not in self destruct mode' do
      before do
        allow(SelfDestructHelper).to receive(:self_destruct?).and_return(false)
      end

      it 'returns without processing' do
        worker.perform

        expect(account.reload.suspended_at).to be_nil
      end
    end

    context 'when in self-destruct mode' do
      before do
        allow(SelfDestructHelper).to receive(:self_destruct?).and_return(true)
      end

      context 'when sidekiq is overwhelmed' do
        before do
          stats = instance_double(Sidekiq::Stats, enqueued: described_class::MAX_ENQUEUED**2)
          allow(Sidekiq::Stats).to receive(:new).and_return(stats)
        end

        it 'returns without processing' do
          worker.perform

          expect(account.reload.suspended_at).to be_nil
        end
      end

      context 'when sidekiq is operational' do
        let!(:other_account) { Fabricate :account, inbox_url: 'https://host.example/inbox', domain: 'host.example', protocol: :activitypub }

        it 'deletes local non-deleted accounts' do
          worker.perform

          expect(account.reload.requested_deletion_at).to_not be_nil
        end

        it 'deletes local accounts marked for deletion' do
          account.update(requested_deletion_at: 10.days.ago)
          deletion_request = Fabricate(:account_deletion_request, account: account)

          worker.perform

          expect(ActivityPub::DeliveryWorker)
            .to have_enqueued_sidekiq_job(match_json_values(type: 'Delete', signature: be_present), account.id, other_account.inbox_url)

          expect(account.reload.requested_deletion_at).to be > 1.day.ago
          expect { deletion_request.reload }.to raise_error(ActiveRecord::RecordNotFound)
        end
      end
    end
  end
end
