# encoding: utf-8
require_relative 'spec_helper'
require 'libis/tools/config_file'
require 'libis/tools/extend/hash'
require 'libis/services/rosetta/pds_handler'
require 'libis/services/rosetta/collection_handler'
require 'rspec/matchers'
require 'equivalent-xml'
class String
def unindent
gsub(/^#{scan(/^\s*/).min_by { |l| l.length }}/, '')
end
end
RSpec::Matchers.define(:match_collection) do |target_collection|
match do |actual_collection|
actual_md = actual_collection.delete(:md_dc)
target_md = target_collection.delete(:md_dc)
expect(actual_collection).to include(target_collection)
actual_xml = actual_md.delete(:content)
target_xml = target_md.delete(:content)
expect(actual_md).to include(target_md)
match_xml(actual_xml, target_xml)
end
def match_xml(doc1, doc2)
doc1 = ::Nokogiri::XML(doc1) if doc1.is_a?(String)
doc2 = ::Nokogiri::XML(doc2) if doc2.is_a?(String)
expect(doc1.root).to be_equivalent_to(doc2.root)
end
end
describe 'Rosetta Collection Service' do
let(:credentials) { Libis::Tools::ConfigFile.new File.join(File.dirname(__FILE__), 'credentials-test.yml') }
let(:pds_handler) do
# noinspection RubyResolve
Libis::Services::Rosetta::PdsHandler.new(credentials.pds_url)
end
let(:handle) do
# noinspection RubyResolve
pds_handler.login(
credentials.admin.user,
credentials.admin.password,
credentials.admin.institute
)
end
let(:collection_info) { Libis::Services::Rosetta::CollectionInfo.new collection_data }
let(:parent_name) { 'Test Collection' }
let(:parent_id) { '23082369' }
# noinspection RubyResolve
subject(:collection_service) do
collection_service = Libis::Services::Rosetta::CollectionHandler.new credentials.rosetta_url,
log: credentials.debug,
log_level: credentials.debug_level
collection_service.pds_handle = handle
collection_service
end
context 'existing collections' do
let(:collection_data) { {
id: '23082442',
name: 'another collection',
parent_id: parent_id,
md_dc: {
mid: '212362',
type: 'descriptive',
sub_type: 'dc',
content: <<-STR.unindent.strip
My pictures
2014-01-01 10:10:10
STR
},
md_source: [],
navigate: true,
publish: true,
external_id: '5555',
external_system: 'CollectiveAccess'
} }
it 'get collection by ID' do
coll_info = collection_service.get(collection_data[:id])
expect(coll_info.to_hash).to match_collection(collection_data)
end
it 'get collection by name' do
coll_info = collection_service.find(parent_name + '/' + collection_data[:name])
expect(coll_info.to_hash).to match_collection(collection_data)
end
end
context 'collections CRUD' do
let(:collection_data) { {
name: 'My new test collection',
parent_id: parent_id,
md_dc: {
type: 'descriptive',
sub_type: 'dc',
content: <<-STR.unindent.strip
Something new to test
2015-06-25 10:00
STR
},
md_source: [],
navigate: true,
publish: false,
external_id: '12345',
external_system: 'Scope'
} }
let(:new_collection) { collection_service.find(parent_name + '/' + collection_data[:name]) }
let(:new_collection_data) {
new_collection_data = {id: new_collection.id}
new_collection_data.reverse_merge!(collection_data)
new_collection_data[:md_dc][:mid] = new_collection.md_dc.mid
new_collection_data
}
let(:updated_name) { 'Stupid text' }
let(:updated_metadata) {
<<-STR.unindent.strip
Updated DC title
Autotest
2015-06-25 10:00
STR
}
let(:updated_collection) { collection_service.find(parent_name + '/' + updated_name) }
let(:updated_collection_data) {
updated_collection_data = new_collection_data.dup
updated_collection_data[:name] = updated_name
# updated_collection_data[:md_dc].delete :mid
updated_collection_data[:md_dc][:content] = updated_metadata
updated_collection_data.cleanup
}
it 'create new collection' do
new_collection_id = collection_service.create(collection_data)
expect(new_collection_id).not_to be_nil
expect(new_collection_id).to be_a String
expect(new_collection_id).to eq new_collection.id
end
it 'retrieve new collection' do
expect(new_collection.to_hash).to match_collection(new_collection_data)
end
it 'update new collection' do
result = collection_service.update(updated_collection_data)
expect(result).to be {}
expect(updated_collection.to_hash).to match_collection(updated_collection_data)
end
it 'delete new collection' do
result = collection_service.delete(updated_collection.id)
expect(result).to be {}
end
end
context 'check errors' do
it 'not authorized' do
collection_service.pds_handle = 'foobar'
expect do
collection_service.create({name: 'foo'})
end.to raise_error(Libis::Services::SoapError, /user_authorize_exception.*Invalid PDS Handle Number:foobar/)
end
it 'invalid collection info' do
expect do
collection_service.create({name: 'foo', parent_id: 0})
end.to raise_error(Libis::Services::SoapError, /invalid_collection_info_exception.*Invalid Parent Id: 0/)
end
it 'not found by id' do
expect do
collection_service.get(0)
end.to raise_error(Libis::Services::SoapError, /no_collection_found_exception.*collection with id: 0 not found/)
end
it 'not found by name' do
expect do
collection_service.find('foo')
end.to raise_error(Libis::Services::SoapError, /no_collection_found_exception.*collection with name: foo not found/)
end
end
end