spec/unit/resync/client/dump_spec.rb in resync-client-0.2.5 vs spec/unit/resync/client/dump_spec.rb in resync-client-0.3.0
- old
+ new
@@ -1,61 +1,206 @@
require 'spec_helper'
module Resync
- class Client
- module Mixins
- describe Dump do
- it "works for #{ResourceDump}" do
- path = 'spec/data/resourcedump/resourcedump.xml'
- package_uri = URI('http://example.com/resourcedump.zip')
+ # TODO: introduce shared examples
+ describe ResourceDump do
+ describe '#zip_packages' do
+ it 'transparently exposes bitstreams' do
+ path = 'spec/data/resourcedump/resourcedump.xml'
+ package_uri = URI('http://example.com/resourcedump.zip')
- client = instance_double(Client)
- expect(client).to receive(:download_to_temp_file).once.with(package_uri).and_return('spec/data/resourcedump/resourcedump.zip')
+ client = instance_double(Client)
+ expect(client).to receive(:download_to_temp_file).once.with(package_uri).and_return('spec/data/resourcedump/resourcedump.zip')
- dump = XMLParser.parse(File.read(path))
- dump.client = client
+ dump = XMLParser.parse(File.read(path))
+ dump.client = client
- zip_packages = dump.zip_packages
- expect(zip_packages.size).to eq(1)
+ zip_packages = dump.zip_packages
+ expect(zip_packages.size).to eq(1)
+ expect(zip_packages[0]).to be_a(Client::Zip::ZipPackage)
- zip_package = zip_packages[0]
- expect(zip_package).to be_a(Resync::Client::Zip::ZipPackage)
+ bitstreams = zip_packages[0].bitstreams
+ expect(bitstreams.size).to eq(2)
+ expect(bitstreams[0].content).to eq(File.read('spec/data/resourcedump/resources/res1'))
+ expect(bitstreams[1].content).to eq(File.read('spec/data/resourcedump/resources/res2'))
+ end
- bitstreams = zip_package.bitstreams
- expect(bitstreams.size).to eq(2)
+ it 'is lazy' do
+ resources = Array.new(3) { |i| Resource.new(uri: "http://example.org/res#{i}") }
+ dump = ResourceDump.new(resources: resources)
+ zip_packages = dump.zip_packages
+ zip_package = instance_double(Client::Zip::ZipPackage)
- stream1 = bitstreams[0]
- expect(stream1.content).to eq(File.read('spec/data/resourcedump/resources/res1'))
+ expect(resources[0]).not_to receive(:zip_package)
+ expect(resources[1]).not_to receive(:zip_package)
+ expect(resources[2]).to receive(:zip_package).and_return(zip_package)
- stream2 = bitstreams[1]
- expect(stream2.content).to eq(File.read('spec/data/resourcedump/resources/res2'))
+ expect(zip_packages[2]).to be(zip_package)
+ end
+
+ it 'flatmaps' do
+ resources = Array.new(6) { |i| Resource.new(uri: "http://example.org/res#{i}") }
+ all_packages = Array.new(6) do |i|
+ zip_package = instance_double(Client::Zip::ZipPackage)
+ expect(resources[i]).to receive(:zip_package).once.and_return(zip_package)
+ zip_package
end
- it "works for #{ChangeDump}" do
- path = 'spec/data/resourcedump/changedump.xml'
- package_uri = URI('http://example.com/changedump.zip')
+ zrl1 = ResourceDump.new(resources: resources[0, 3])
+ zrl2 = ResourceDump.new(resources: resources[3, 3])
- client = instance_double(Client)
- expect(client).to receive(:download_to_temp_file).once.with(package_uri).and_return('spec/data/resourcedump/resourcedump.zip')
+ flat_mapped = [zrl1, zrl2].flat_map(&:zip_packages)
+ expect(flat_mapped).to eq(all_packages)
- dump = XMLParser.parse(File.read(path))
- dump.client = client
+ lazy_flat_mapped = [zrl1, zrl2].lazy.flat_map(&:zip_packages).to_a
+ expect(lazy_flat_mapped).to eq(all_packages)
+ end
- zip_packages = dump.zip_packages
- expect(zip_packages.size).to eq(1)
+ it 'supports lazy iteration 'do
+ manifests = Array.new(3) { instance_double(ChangeDumpManifest) }
+ all_packages = Array.new(3) do |index|
+ zip_package = instance_double(Client::Zip::ZipPackage)
+ allow(zip_package).to receive(:manifest).and_return(manifests[index])
+ zip_package
+ end
+ resources = Array.new(3) do |index|
+ resource = Resource.new(uri: "http://example.org/res#{index}")
+ if index > 1
+ expect(resource).not_to receive(:zip_package)
+ else
+ expect(resource).to receive(:zip_package).and_return(all_packages[index])
+ end
+ resource
+ end
- zip_package = zip_packages[0]
- expect(zip_package).to be_a(Resync::Client::Zip::ZipPackage)
+ zip_packages = ResourceDump.new(resources: resources).zip_packages
+ zip_packages.each_with_index do |zip_package, index|
+ expect(zip_package.manifest).to be(manifests[index])
+ break if index >= 1
+ end
+ end
+ end
- bitstreams = zip_package.bitstreams
- expect(bitstreams.size).to eq(2)
+ describe '#all_zip_packages' do
+ it 'is an alias for #zip_packages' do
+ path = 'spec/data/resourcedump/resourcedump.xml'
+ package_uri = URI('http://example.com/resourcedump.zip')
- stream1 = bitstreams[0]
- expect(stream1.content).to eq(File.read('spec/data/resourcedump/resources/res1'))
+ client = instance_double(Client)
+ expect(client).to receive(:download_to_temp_file).once.with(package_uri).and_return('spec/data/resourcedump/resourcedump.zip')
- stream2 = bitstreams[1]
- expect(stream2.content).to eq(File.read('spec/data/resourcedump/resources/res2'))
+ dump = XMLParser.parse(File.read(path))
+ dump.client = client
+
+ all_zip_packages = dump.all_zip_packages
+ expect(all_zip_packages.size).to eq(1)
+ expect(all_zip_packages[0]).to be_a(Client::Zip::ZipPackage)
+
+ bitstreams = all_zip_packages[0].bitstreams
+ expect(bitstreams.size).to eq(2)
+ expect(bitstreams[0].content).to eq(File.read('spec/data/resourcedump/resources/res1'))
+ expect(bitstreams[1].content).to eq(File.read('spec/data/resourcedump/resources/res2'))
+ end
+ end
+ end
+
+ describe ChangeDump do
+ describe '#zip_packages' do
+ it 'transparently exposes bitstreams' do
+ path = 'spec/data/resourcedump/changedump.xml'
+ package_uri = URI('http://example.com/changedump.zip')
+
+ client = instance_double(Client)
+ expect(client).to receive(:download_to_temp_file).once.with(package_uri).and_return('spec/data/resourcedump/resourcedump.zip')
+
+ dump = XMLParser.parse(File.read(path))
+ dump.client = client
+
+ zip_packages = dump.zip_packages
+ expect(zip_packages.size).to eq(1)
+ expect(zip_packages[0]).to be_a(Client::Zip::ZipPackage)
+
+ bitstreams = zip_packages[0].bitstreams
+ expect(bitstreams.size).to eq(2)
+ expect(bitstreams[0].content).to eq(File.read('spec/data/resourcedump/resources/res1'))
+ expect(bitstreams[1].content).to eq(File.read('spec/data/resourcedump/resources/res2'))
+ end
+
+ it 'is lazy' do
+ resources = Array.new(3) { |i| Resource.new(uri: "http://example.org/res#{i}") }
+ dump = ChangeDump.new(resources: resources)
+ zip_packages = dump.zip_packages
+ zip_package = instance_double(Client::Zip::ZipPackage)
+
+ expect(resources[0]).not_to receive(:zip_package)
+ expect(resources[1]).not_to receive(:zip_package)
+ expect(resources[2]).to receive(:zip_package).and_return(zip_package)
+
+ expect(zip_packages[2]).to be(zip_package)
+ end
+
+ it 'flatmaps' do
+ resources = Array.new(6) { |i| Resource.new(uri: "http://example.org/res#{i}") }
+ all_packages = Array.new(6) do |i|
+ zip_package = instance_double(Client::Zip::ZipPackage)
+ expect(resources[i]).to receive(:zip_package).once.and_return(zip_package)
+ zip_package
end
+
+ zrl1 = ChangeDump.new(resources: resources[0, 3])
+ zrl2 = ChangeDump.new(resources: resources[3, 3])
+
+ lazy_flat_mapped = [zrl1, zrl2].lazy.flat_map(&:zip_packages).to_a
+ expect(lazy_flat_mapped).to eq(all_packages)
+
+ flat_mapped = [zrl1, zrl2].flat_map(&:zip_packages)
+ expect(flat_mapped).to eq(all_packages)
+ end
+
+ it 'supports lazy iteration 'do
+ manifests = Array.new(3) { instance_double(ChangeDumpManifest) }
+ all_packages = Array.new(3) do |index|
+ zip_package = instance_double(Client::Zip::ZipPackage)
+ allow(zip_package).to receive(:manifest).and_return(manifests[index])
+ zip_package
+ end
+ resources = Array.new(3) do |index|
+ resource = Resource.new(uri: "http://example.org/res#{index}")
+ if index > 1
+ expect(resource).not_to receive(:zip_package)
+ else
+ expect(resource).to receive(:zip_package).and_return(all_packages[index])
+ end
+ resource
+ end
+
+ zip_packages = ChangeDump.new(resources: resources).zip_packages
+ zip_packages.each_with_index do |zip_package, index|
+ expect(zip_package.manifest).to be(manifests[index])
+ break if index >= 1
+ end
+ end
+ end
+
+ describe '#all_zip_packages' do
+ it 'is an alias for #zip_packages' do
+ path = 'spec/data/resourcedump/changedump.xml'
+ package_uri = URI('http://example.com/changedump.zip')
+
+ client = instance_double(Client)
+ expect(client).to receive(:download_to_temp_file).once.with(package_uri).and_return('spec/data/resourcedump/resourcedump.zip')
+
+ dump = XMLParser.parse(File.read(path))
+ dump.client = client
+
+ zip_packages = dump.all_zip_packages
+ expect(zip_packages.size).to eq(1)
+ expect(zip_packages[0]).to be_a(Client::Zip::ZipPackage)
+
+ bitstreams = zip_packages[0].bitstreams
+ expect(bitstreams.size).to eq(2)
+ expect(bitstreams[0].content).to eq(File.read('spec/data/resourcedump/resources/res1'))
+ expect(bitstreams[1].content).to eq(File.read('spec/data/resourcedump/resources/res2'))
end
end
end
end