269 lines
7.5 KiB
Ruby
269 lines
7.5 KiB
Ruby
require 'spec_helper'
|
|
require 'avm/image'
|
|
require 'avm/creator'
|
|
|
|
describe AVM::Creator do
|
|
let(:image) { AVM::Image.new }
|
|
let(:creator) { image.creator }
|
|
|
|
let(:name) { 'Space Telescope Science Institute' }
|
|
let(:url) { 'http://www.stsci.edu/' }
|
|
let(:rights) { 'Public Domain' }
|
|
|
|
subject { creator }
|
|
|
|
def self.can_read_properties
|
|
its(:name) { should == name }
|
|
its(:url) { should == url }
|
|
its(:rights) { should == rights }
|
|
end
|
|
|
|
describe '#merge!' do
|
|
before { creator.merge!(:name => name, :url => url, :rights => rights) }
|
|
|
|
can_read_properties
|
|
end
|
|
|
|
describe 'setters' do
|
|
before {
|
|
creator.name = name
|
|
creator.url = url
|
|
creator.rights = rights
|
|
}
|
|
|
|
can_read_properties
|
|
end
|
|
|
|
describe 'primary contact passthrough' do
|
|
context 'no contacts' do
|
|
its(:address) { should be_nil }
|
|
end
|
|
|
|
context 'one contact, must be primary' do
|
|
let(:first_contact) { AVM::Contact.new(
|
|
:name => 'zz bill',
|
|
:address => first_contact_address,
|
|
:city => first_contact_address,
|
|
:state => first_contact_address,
|
|
:postal_code => first_contact_address,
|
|
:country => first_contact_address
|
|
) }
|
|
let(:first_contact_address) { 'first contact' }
|
|
|
|
before { creator.contacts << first_contact }
|
|
|
|
fields = [ :address, :city, :state, :province, :postal_code, :zip, :country ]
|
|
fields.each { |field| its(field) { should == first_contact_address } }
|
|
|
|
specify { creator.to_a.should == [
|
|
first_contact.to_h
|
|
] }
|
|
|
|
context 'two contacts' do
|
|
let(:second_contact) { AVM::Contact.new(
|
|
:name => 'aa bill',
|
|
:address => second_contact_address,
|
|
:city => second_contact_address,
|
|
:state => second_contact_address,
|
|
:postal_code => second_contact_address,
|
|
:country => second_contact_address
|
|
) }
|
|
let(:second_contact_address) { 'second contact' }
|
|
|
|
before { creator.contacts << second_contact }
|
|
|
|
context 'no primary, first alphabetical is primary' do
|
|
subject { second_contact }
|
|
|
|
fields.each { |field| its(field) { should == second_contact_address } }
|
|
|
|
specify { creator.to_a.should == [
|
|
second_contact.to_h, first_contact.to_h
|
|
] }
|
|
end
|
|
|
|
context 'one is primary, use it' do
|
|
before { first_contact.primary = true }
|
|
|
|
fields.each { |field| its(field) { should == first_contact_address } }
|
|
|
|
specify { creator.to_a.should == [
|
|
first_contact.to_h, second_contact.to_h
|
|
] }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#create_contact' do
|
|
let(:first_name) { 'John' }
|
|
let(:first_contact) { creator.create_contact(:name => first_name) }
|
|
|
|
subject { creator.primary_contact }
|
|
before { first_contact }
|
|
|
|
its(:name) { should == first_name }
|
|
end
|
|
|
|
describe '#from_xml' do
|
|
let(:document) { image.to_xml }
|
|
let(:image) { AVM::Image.from_xml(File.read(file_path)) }
|
|
|
|
subject { image }
|
|
|
|
context 'no creator' do
|
|
let(:file_path) { 'spec/sample_files/creator/no_creator.xmp' }
|
|
|
|
its('creator.length') { should == 0 }
|
|
end
|
|
|
|
context 'one creator' do
|
|
let(:file_path) { 'spec/sample_files/creator/one_creator.xmp' }
|
|
|
|
its('creator.length') { should == 1 }
|
|
|
|
def self.field_checks
|
|
its(:name) { should == name }
|
|
its(:address) { should == address }
|
|
its(:city) { should == city }
|
|
its(:state) { should == state }
|
|
its(:zip) { should == zip }
|
|
its(:country) { should == country }
|
|
its(:email) { should == email }
|
|
its(:telephone) { should == telephone }
|
|
end
|
|
|
|
let(:name) { 'John Bintz' }
|
|
let(:email) { 'bintz@stsci.edu' }
|
|
let(:telephone) { '800-555-1234' }
|
|
let(:address) { '3700 San Martin Drive' }
|
|
let(:city) { 'Baltimore' }
|
|
let(:state) { 'Maryland' }
|
|
let(:zip) { '21218' }
|
|
let(:country) { 'USA' }
|
|
|
|
context 'creator one' do
|
|
subject { image.creator[0] }
|
|
|
|
field_checks
|
|
|
|
it { should be_primary }
|
|
end
|
|
|
|
context 'two creators' do
|
|
let(:file_path) { 'spec/sample_files/creator/two_creators.xmp' }
|
|
|
|
its('creator.length') { should == 2 }
|
|
|
|
context 'first creator' do
|
|
subject { image.creator[0] }
|
|
|
|
field_checks
|
|
|
|
it { should be_primary }
|
|
end
|
|
|
|
context 'second creator' do
|
|
subject { image.creator[1] }
|
|
|
|
field_checks
|
|
|
|
it { should_not be_primary }
|
|
|
|
let(:name) { 'Aohn Bintz' }
|
|
let(:email) { 'aohn@stsci.edu' }
|
|
let(:telephone) { '800-555-2345' }
|
|
let(:address) { '3700 San Martin Drive' }
|
|
let(:city) { 'Baltimore' }
|
|
let(:state) { 'Maryland' }
|
|
let(:zip) { '21218' }
|
|
let(:country) { 'USA' }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'contact name node' do
|
|
let(:first_name) { 'John' }
|
|
let(:second_name) { 'Zohn' }
|
|
|
|
let(:first_contact) { creator.create_contact(first_contact_options) }
|
|
let(:second_contact) { creator.create_contact(second_contact_options) }
|
|
|
|
let(:first_contact_options) { { :name => first_name } }
|
|
let(:second_contact_options) { { :name => second_name } }
|
|
|
|
subject { image.to_xml.search('//dc:creator/rdf:Seq/rdf:li').collect { |node| node.text } }
|
|
|
|
context 'no contacts' do
|
|
it { should == [] }
|
|
end
|
|
|
|
context 'one contact' do
|
|
before { first_contact }
|
|
|
|
it { should == [ first_name ] }
|
|
end
|
|
|
|
context 'second contact' do
|
|
before { second_contact ; first_contact }
|
|
|
|
it { should == [ first_name, second_name ] }
|
|
end
|
|
|
|
describe 'everything else uses primary' do
|
|
let(:fields) { [ :address, :city, :state, :zip, :country ] }
|
|
|
|
def other_fields(what)
|
|
Hash[fields.zip(Array.new(fields.length, what))]
|
|
end
|
|
|
|
let(:first_contact_options) { { :name => first_name }.merge(other_fields('one')) }
|
|
let(:second_contact_options) { { :name => second_name }.merge(other_fields('two')) }
|
|
|
|
before { second_contact ; first_contact }
|
|
|
|
specify {
|
|
%w{CiAdrExtadr CiAdrCity CiAdrRegion CiAdrPcode CiAdrCtry}.each do |element_name|
|
|
image.to_xml.at_xpath("//Iptc4xmpCore:#{element_name}").text.should == 'one'
|
|
end
|
|
}
|
|
end
|
|
|
|
describe 'contact emails, telephones' do
|
|
let(:first_email) { 'bintz@stsci.edu' }
|
|
let(:second_email) { 'bintz-2@stsci.edu' }
|
|
|
|
let(:first_phone) { '123-456-7890' }
|
|
let(:second_phone) { '234-567-8901' }
|
|
|
|
let(:first_contact_options) { { :name => first_name, :email => first_email, :telephone => first_phone } }
|
|
let(:second_contact_options) { { :name => second_name, :email => second_email, :telephone => second_phone } }
|
|
|
|
let(:contact_info) { image.to_xml.search('//Iptc4xmpCore:CreatorContactInfo') }
|
|
|
|
let(:telephone_text) { contact_info.at_xpath('./Iptc4xmpCore:CiTelWork').text }
|
|
let(:email_text) { contact_info.at_xpath('./Iptc4xmpCore:CiEmailWork').text }
|
|
|
|
context 'no contacts' do
|
|
specify { expect { telephone_text }.to raise_error }
|
|
specify { expect { email_text }.to raise_error }
|
|
end
|
|
|
|
context 'one contact' do
|
|
before { first_contact }
|
|
|
|
specify { telephone_text.should == first_phone }
|
|
specify { email_text.should == first_email }
|
|
end
|
|
|
|
context 'two contacts' do
|
|
before { first_contact ; second_contact }
|
|
|
|
specify { telephone_text.should == [ first_phone, second_phone ] * ',' }
|
|
specify { email_text.should == [ first_email, second_email ] * ',' }
|
|
end
|
|
end
|
|
end
|
|
end
|