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