RSpec.describe Attachment::ShowComponent, type: :component do
  let(:champ) { create(:champ_piece_justificative) }
  let(:virus_scan_result) { nil }

  let(:attachment) {
    champ.piece_justificative_file.attachments.first
  }

  let(:filename) { attachment.filename.to_s }

  let(:component) do
    described_class.new(attachment:)
  end

  subject { render_inline(component).to_html }

  before do
    attachment.blob.update(virus_scan_result:, metadata: attachment.blob.metadata.merge(virus_scan_result:))
  end

  context 'when there is no anti-virus scan' do
    let(:virus_scan_result) { nil }

    it 'allows to download the file' do
      expect(subject).to have_link(filename)
      expect(subject).to have_text('ce fichier n’a pas été analysé par notre antivirus')
    end
  end

  context 'when the anti-virus scan is pending' do
    let(:virus_scan_result) { ActiveStorage::VirusScanner::PENDING }

    it 'displays the filename, but doesn’t allow to download the file' do
      expect(subject).to have_text(filename)
      expect(subject).not_to have_link(filename)
      expect(subject).to have_text('Analyse antivirus en cours')
    end
  end

  context 'when the file is scanned and safe' do
    let(:virus_scan_result) { ActiveStorage::VirusScanner::SAFE }

    it 'allows to download the file' do
      expect(subject).to have_link(filename)
    end
  end

  context 'when the file is scanned and infected' do
    let(:virus_scan_result) { ActiveStorage::VirusScanner::INFECTED }

    it 'displays the filename, but doesn’t allow to download the file' do
      expect(subject).to have_text(filename)
      expect(subject).not_to have_link(filename)
      expect(subject).to have_text('Virus détecté')
    end
  end

  context 'when the file is corrupted' do
    let(:virus_scan_result) { ActiveStorage::VirusScanner::INTEGRITY_ERROR }

    it 'displays the filename, but doesn’t allow to download the file' do
      expect(subject).to have_text(filename)
      expect(subject).not_to have_link(filename)
      expect(subject).to have_text('corrompu')
    end
  end
end