aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert2017-10-19 15:27:30 +0200
committerRobert2017-10-24 15:28:44 +0200
commit302ed0f642c755b6f96def25eda25e2d2dae8891 (patch)
treeac02735d6768b2da824b0be839d6fcbdf33f7a84
parentefe056fb645f0380e594f57ad058409194f3becd (diff)
downloadchouette-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.rb8
-rw-r--r--spec/support/random.rb6
-rw-r--r--spec/workers/workbench_import_with_corrupt_zip_spec.rb44
-rw-r--r--spec/workers/workbench_import_worker_spec.rb5
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) }