aboutsummaryrefslogtreecommitdiffstats
path: root/spec/services
diff options
context:
space:
mode:
authorRobert2017-08-21 05:13:11 +0200
committerRobert2017-08-21 05:26:55 +0200
commit327b1ec771a056451b0635ba80cc346fa1765299 (patch)
tree3790696ce944f0412a96fea21fca6c8667f1bd64 /spec/services
parent8eaa9249825f6eb6d667291fd9aa26bbde1ac7e3 (diff)
downloadchouette-core-327b1ec771a056451b0635ba80cc346fa1765299.tar.bz2
Refs: #4273@20h; Reverse Engeneeiring RubyZip fixed ZipService
- Replzed Lazy Enum over get_next_entry and group by with explicit looping and yielding to an instance level enumerator that yields streams per subdir (wich represents a referential). - Fixtures and Specs that use a REAL usecase. Next: Get rid of metadata kludge (should fix failing specs)
Diffstat (limited to 'spec/services')
-rw-r--r--spec/services/zip_service/regression_4273_spec.rb59
-rw-r--r--spec/services/zip_service/zip_entry_data_spec.rb32
-rw-r--r--spec/services/zip_service/zip_entry_dirs_spec.rb33
-rw-r--r--spec/services/zip_service/zip_output_streams_spec.rb8
4 files changed, 59 insertions, 73 deletions
diff --git a/spec/services/zip_service/regression_4273_spec.rb b/spec/services/zip_service/regression_4273_spec.rb
new file mode 100644
index 000000000..4fe0f6539
--- /dev/null
+++ b/spec/services/zip_service/regression_4273_spec.rb
@@ -0,0 +1,59 @@
+RSpec.describe ZipService do
+ describe 'Regression Issue # 4273 https://projects.af83.io/issues/4273' do
+ let( :zip_service ){ described_class }
+ let( :unzipper ){ zip_service.new(zip_data) }
+ let( :zip_data ){ File.read zip_file }
+
+ context 'real test data' do
+ let( :subdir_names ){ %w<OFFRE_TRANSDEV_20170301122517 OFFRE_TRANSDEV_20170301122519> }
+ let( :expected_chksums ){
+ checksum_trees( subdir_names.map{ |sn| subdir_file(sn, prefix: 'source_') } )
+ }
+
+ let( :zip_file ){ fixtures_path 'OFFRE_TRANSDEV_2017030112251.zip' }
+ #
+ # Remove potential test artefacts
+ before do
+ subdir_names.each do | subdir_name |
+ File.unlink( subdir_file subdir_name, suffix: '.zip' ) rescue nil
+ Dir.unlink( subdir_file subdir_name ) rescue nil
+ end
+ end
+
+ it "yields the correct content" do
+ subdir_contents = {}
+ # Write ZipService Streams to files and inflate them to file system
+ unzipper.subdirs.each do | subdir |
+ File.open(subdir_file( subdir.name, suffix: '.zip' ), 'wb'){ |f| f.write subdir.stream.string }
+ unzip_subdir subdir
+ end
+ # Represent the inflated file_system as a checksum tree
+ actual_checksums =
+ checksum_trees( subdir_names.map{ |sn| subdir_file(sn, prefix: 'target/') } )
+ expect( actual_checksums ).to eq( expected_chksums )
+ end
+
+ end
+
+ end
+
+ def checksum_trees *dirs
+ dirs.flatten.inject({},&method(:checksum_tree))
+ end
+ def checksum_tree repr, dir
+ Dir.glob("#{dir}/**/*").each do |file|
+ if !File.directory?(file)
+ repr.merge!( File.basename(file) => %x{cksum #{file}}.split.first ){ |_, ov, nv| Array(ov) << nv }
+ end
+ end
+ repr
+ end
+
+ def subdir_file( subdir, prefix: 'target_', suffix: '' )
+ fixtures_path("#{prefix}#{subdir}#{suffix}")
+ end
+
+ def unzip_subdir subdir
+ %x{unzip -oqq #{subdir_file subdir.name, suffix: '.zip'} -d #{fixture_path}/target}
+ end
+end
diff --git a/spec/services/zip_service/zip_entry_data_spec.rb b/spec/services/zip_service/zip_entry_data_spec.rb
deleted file mode 100644
index 2a7226eb4..000000000
--- a/spec/services/zip_service/zip_entry_data_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-RSpec.describe ZipService do
-
- subject{ described_class.new(read_fixture('multiple_references_import.zip')) }
-
- it 'can group all entries' do
- expect( subject.entry_groups.keys ).to eq(%w{ref1 ref2})
- end
-
- context 'creates correct zip data for each subdir' do
- it 'e.g. reference1' do
- reference1_stream = subject.entry_group_streams['ref1']
- control_stream = Zip::InputStream.open( reference1_stream )
- control_entries = described_class.entries(control_stream)
- expect( control_entries.map{ |e| [e.name, e.get_input_stream.read]}.force ).to eq([
- ["multiref/ref1/", ""],
- ["multiref/ref1/datum-1", "multi-ref1-datum1\n"],
- ["multiref/ref1/datum-2", "multi-ref1-datum2\n"]
- ])
- end
- it 'e.g. reference2' do
- reference2_stream = subject.entry_group_streams['ref2']
- control_stream = Zip::InputStream.open( reference2_stream )
- control_entries = described_class.entries(control_stream)
- expect( control_entries.map{ |e| [e.name, e.get_input_stream.read]}.force ).to eq([
- ["multiref/ref2/", ""],
- ["multiref/ref2/datum-1", "multi-ref2-datum1\n"],
- ["multiref/ref2/datum-2", "multi-ref2-datum2\n"]
- ])
- end
- end
-
-end
diff --git a/spec/services/zip_service/zip_entry_dirs_spec.rb b/spec/services/zip_service/zip_entry_dirs_spec.rb
deleted file mode 100644
index 8ca1b0f1a..000000000
--- a/spec/services/zip_service/zip_entry_dirs_spec.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-RSpec.describe ZipService do
-
- let( :zip_service ){ described_class }
-
- let( :zip_data ){ File.read zip_file }
-
- shared_examples_for 'a correct zip entry reader' do
- it 'gets all entries of the zip file' do
- expect( zip_service.new(zip_data).entry_groups.keys ).to eq(expected)
- end
- end
-
- context 'single entry' do
- let( :zip_file ){ fixtures_path 'multiple_references_import.zip' }
- let( :expected ){ %w{ref1 ref2} }
-
- it_behaves_like 'a correct zip entry reader'
- end
-
- context 'more entries' do
- let( :zip_file ){ fixtures_path 'single_reference_import.zip' }
- let( :expected ){ %w{ref} }
-
- it_behaves_like 'a correct zip entry reader'
- end
-
- context 'illegal file' do
- let( :zip_file ){ fixtures_path 'nozip.zip' }
- let( :expected ){ [] }
-
- it_behaves_like 'a correct zip entry reader'
- end
-end
diff --git a/spec/services/zip_service/zip_output_streams_spec.rb b/spec/services/zip_service/zip_output_streams_spec.rb
deleted file mode 100644
index 742f9b996..000000000
--- a/spec/services/zip_service/zip_output_streams_spec.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-RSpec.describe ZipService do
-
- subject{ described_class.new(read_fixture('multiple_references_import.zip')) }
-
- it "exposes its size" do
- expect( subject.entry_group_streams.size ).to eq(2)
- end
-end