describe 'shared/attachment/_update.html.haml', type: :view do
  let(:champ) { build(:champ_piece_justificative, dossier: create(:dossier)) }
  let(:attached_file) { champ.piece_justificative_file }
  let(:user_can_destroy) { false }

  subject do
    form_for(champ.dossier) do |form|
      view.image_upload_and_render form, attached_file
    end
  end

  context 'when there is no attached file' do
    before do
      champ.piece_justificative_file = nil
    end

    it 'renders a form field for uploading a file' do
      expect(subject).to have_selector('input[type=file]:not(.hidden)')
    end
  end

  context 'when there is an attached file' do
    it 'renders a form field for uploading a file' do
      expect(subject).to have_selector('input[type=file]:not(.hidden)')
    end

    it 'does not renders a link to the unsaved file' do
      expect(subject).not_to have_content(attached_file.filename.to_s)
    end

    it 'does not render action buttons' do
      expect(subject).not_to have_link('Remplacer')
      expect(subject).not_to have_link('Supprimer')
    end

    context 'and the attachment has been saved' do
      before { champ.save! }

      it 'renders a link to the file' do
        expect(subject).to have_content(attached_file.filename.to_s)
      end

      it 'hides the form field by default' do
        expect(subject).to have_selector('input[type=file].hidden')
      end

      it 'shows the Delete button by default' do
        is_expected.to have_link('Supprimer')
      end
    end
  end

  context 'when the user cannot destroy the attachment' do
    subject do
      form_for(champ.dossier) do |form|
        render 'shared/attachment/edit', {
          form: form,
          attached_file: attached_file,
          accept: 'image/png',
          user_can_destroy: user_can_destroy
        }
      end
    end

    it 'hides the Delete button' do
      is_expected.not_to have_link('Supprimer')
    end
  end
end
