diff options
| author | Robert | 2017-10-19 15:27:30 +0200 | 
|---|---|---|
| committer | Robert | 2017-10-24 15:28:44 +0200 | 
| commit | 302ed0f642c755b6f96def25eda25e2d2dae8891 (patch) | |
| tree | ac02735d6768b2da824b0be839d6fcbdf33f7a84 | |
| parent | efe056fb645f0380e594f57ad058409194f3becd (diff) | |
| download | chouette-core-302ed0f642c755b6f96def25eda25e2d2dae8891.tar.bz2 | |
Refs: #4633@3h:
  - Discussing Spec
  - Speced and implemented the corrupt zipfile part
Next:
  - Spec incorrect directory structure part
  - Implement incorrect directory structure part
| -rw-r--r-- | app/workers/workbench_import_worker.rb | 8 | ||||
| -rw-r--r-- | spec/support/random.rb | 6 | ||||
| -rw-r--r-- | spec/workers/workbench_import_with_corrupt_zip_spec.rb | 44 | ||||
| -rw-r--r-- | spec/workers/workbench_import_worker_spec.rb | 5 | 
4 files changed, 59 insertions, 4 deletions
| diff --git a/app/workers/workbench_import_worker.rb b/app/workers/workbench_import_worker.rb index 994493944..b89ba19d8 100644 --- a/app/workers/workbench_import_worker.rb +++ b/app/workers/workbench_import_worker.rb @@ -14,11 +14,13 @@ class WorkbenchImportWorker      zip_service = ZipService.new(downloaded)      upload zip_service      @workbench_import.update(ended_at: Time.now) +  rescue Zip::Error +    handle_corrupt_zip_file    end    def download      logger.info  "HTTP GET #{import_url}" -    @zipfile_data = HTTPService.get_resource( +    HTTPService.get_resource(        host: import_host,        path: import_path,        params: {token: @workbench_import.token_download}).body @@ -32,6 +34,10 @@ class WorkbenchImportWorker        params: params(eg_file, eg_name))    end +  def handle_corrupt_zip_file +    @workbench_import.messages.create(criticity: :error) +  end +    def upload zip_service      entry_group_streams = zip_service.subdirs      @workbench_import.update total_steps: entry_group_streams.size diff --git a/spec/support/random.rb b/spec/support/random.rb index 59e1a1475..1d5d62ec8 100644 --- a/spec/support/random.rb +++ b/spec/support/random.rb @@ -22,6 +22,12 @@ module Support      def random_string        SecureRandom.urlsafe_base64      end + +    def very_random(veryness=3, joiner: '-') +      raise ArgumentError, 'not very random' unless veryness > 1 +      3.times.map{ SecureRandom.uuid }.join(joiner) +    end +    end  end diff --git a/spec/workers/workbench_import_with_corrupt_zip_spec.rb b/spec/workers/workbench_import_with_corrupt_zip_spec.rb new file mode 100644 index 000000000..344943ad7 --- /dev/null +++ b/spec/workers/workbench_import_with_corrupt_zip_spec.rb @@ -0,0 +1,44 @@ +RSpec.describe WorkbenchImportWorker do + + +  shared_examples_for 'corrupt zipfile data' do +    subject { described_class.new } +    let( :workbench_import ){ create :workbench_import, status: :pending } + +    before do +      # Let us make sure that the name Enterprise will never be forgotten by history, +      # ahem, I meant, that nothing is uploaded, by forbidding any message to be sent +      # to HTTPService +      expect_it.to receive(:download).and_return(downloaded) +    end + +    it 'does not upload' do +      stub_const 'HTTPService', double('HTTPService') +      subject.perform(workbench_import.id) +    end + +    it 'does create a message' do +      expect{  subject.perform(workbench_import.id) }.to change{ workbench_import.messages.count }.by(1) +      expect( workbench_import.messages.last.criticity ).to eq('error') +    end + +    it 'does not change current step' do +      expect{ subject.perform(workbench_import.id) }.not_to change{ workbench_import.current_step } +    end + +    it "sets the workbench_import.status to failed" do +      subject.perform(workbench_import.id) +      expect( workbench_import.reload.status ).to eq('failed') +    end +  end + +  context 'empty zip file' do  +    let( :downloaded ){ '' } +    it_should_behave_like 'corrupt zipfile data' +  end + +  context 'corrupt data' do  +    let( :downloaded ){ very_random } +    it_should_behave_like 'corrupt zipfile data' +  end +end diff --git a/spec/workers/workbench_import_worker_spec.rb b/spec/workers/workbench_import_worker_spec.rb index a349b3433..726dd7f8d 100644 --- a/spec/workers/workbench_import_worker_spec.rb +++ b/spec/workers/workbench_import_worker_spec.rb @@ -5,7 +5,7 @@ RSpec.describe WorkbenchImportWorker, type: [:worker, :request] do    let( :workbench ){ import.workbench }    let( :referential ){ import.referential } -  let( :api_key ){ build_stubbed :api_key, referential: referential, token: "#{referential.id}-#{SecureRandom.hex}" } +  let( :api_key ){ build_stubbed :api_key, referential: referential, token: "#{referential.id}-#{random_hex}" }    # http://www.example.com/workbenches/:workbench_id/imports/:id/download    let( :host ){ Rails.configuration.rails_host } @@ -13,8 +13,7 @@ RSpec.describe WorkbenchImportWorker, type: [:worker, :request] do    let( :downloaded_zip ){ double("downloaded zip") }    let( :download_zip_response ){ OpenStruct.new( body: downloaded_zip ) } -  let( :download_token ){ SecureRandom.urlsafe_base64 } - +  let( :download_token ){ random_string }    let( :upload_path ) { api_v1_netex_imports_path(format: :json) } | 
