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 | 
