describe DownloadManager::ParallelDownloadQueue do let(:test_dir) { Dir.mktmpdir(nil, Dir.tmpdir) } let(:download_to_dir) { test_dir } before do downloadable_manager.on_error = proc { |_, _, _| } end after { FileUtils.remove_entry_secure(test_dir) if Dir.exist?(test_dir) } let(:downloadable_manager) { DownloadManager::ParallelDownloadQueue.new([attachment], download_to_dir) } describe '#download_one' do subject { downloadable_manager.download_one(attachment: attachment, path_in_download_dir: destination, http_client: double) } let(:destination) { 'lol.png' } let(:attachment) do PiecesJustificativesService::FakeAttachment.new( file: StringIO.new('coucou'), filename: "export-dossier.pdf", name: 'pdf_export_for_instructeur', id: 1, created_at: Time.zone.now ) end context 'with a PiecesJustificativesService::FakeAttachment and it works' do it 'write attachment.file to disk' do target = File.join(download_to_dir, destination) expect { subject }.to change { File.exist?(target) } attachment.file.rewind expect(attachment.file.read).to eq(File.read(target)) end end context 'with a PiecesJustificativesService::FakeAttachment and it fails' do it 'write attachment.file to disk' do expect(attachment.file).to receive(:read).and_raise("boom") target = File.join(download_to_dir, destination) expect { subject }.to raise_error(StandardError) expect(File.exist?(target)).to be_falsey # expect(downloadable_manager.errors).to have_key(destination) end end end end