diff options
| author | Robert | 2017-08-21 05:13:11 +0200 |
|---|---|---|
| committer | Robert | 2017-08-21 05:26:55 +0200 |
| commit | 327b1ec771a056451b0635ba80cc346fa1765299 (patch) | |
| tree | 3790696ce944f0412a96fea21fca6c8667f1bd64 /spec/services | |
| parent | 8eaa9249825f6eb6d667291fd9aa26bbde1ac7e3 (diff) | |
| download | chouette-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.rb | 59 | ||||
| -rw-r--r-- | spec/services/zip_service/zip_entry_data_spec.rb | 32 | ||||
| -rw-r--r-- | spec/services/zip_service/zip_entry_dirs_spec.rb | 33 | ||||
| -rw-r--r-- | spec/services/zip_service/zip_output_streams_spec.rb | 8 |
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 |
