require 'spec_helper'
module Datacite
module Mapping
describe Identifier do
describe '#initialize' do
it 'sets the value' do
value = '10.14749/1407399495'
id = Identifier.new(value: value)
expect(id.value).to eq(value)
end
it 'requires a non-nil value' do
expect { Identifier.new(value: nil) }.to raise_error(ArgumentError)
end
it 'sets the type' do
id = Identifier.new(value: '10.14749/1407399495')
expect(id.identifier_type).to eq('DOI')
end
it 'disallows bad DOIs' do
bad_dois = %w(
20.14749/1407399495
11.14749/1407399495
10./1407399495
10.14749\1407399495
10.14749/
)
bad_dois.each do |doi|
expect { Identifier.new(value: doi) }.to raise_error(ArgumentError)
end
end
it 'strips' do
value = '10.14749/1407399495'
id = Identifier.new(value: "
#{value}
")
expect(id.value).to eq(value)
end
end
describe '#from_doi' do
it 'creates an identifier from a doi: string' do
doi_value = '10.1594/WDCC/CCSRNIES_SRES_B2'
doi_string = "doi:#{doi_value}"
id = Identifier.from_doi(doi_string)
expect(id).to be_an(Identifier)
expect(id.value).to eq(doi_value)
expect(id.identifier_type).to eq('DOI')
end
it 'creates an identifier from a plain DOI value' do
doi_value = '10.1594/WDCC/CCSRNIES_SRES_B2'
id = Identifier.from_doi(doi_value)
expect(id).to be_an(Identifier)
expect(id.value).to eq(doi_value)
expect(id.identifier_type).to eq('DOI')
end
it 'creates an identifier from a DOI in URL format' do
doi_value = '10.1594/WDCC/CCSRNIES_SRES_B2'
doi_string = "http://dx.doi.org/#{doi_value}"
id = Identifier.from_doi(doi_string)
expect(id).to be_an(Identifier)
expect(id.value).to eq(doi_value)
expect(id.identifier_type).to eq('DOI')
end
it 'raises ArgumentError if it is passed a bad DOI' do
bad_dois = %w(
20.14749/1407399495
11.14749/1407399495
10./1407399495
10.14749\1407399495
10.14749/
)
bad_dois.each do |doi|
expect { Identifier.from_doi(doi) }.to raise_error do |e|
expect(e).to be_an(ArgumentError)
expect(e.message).to include(doi)
end
end
end
end
describe '#value=' do
it 'sets the value' do
id = Identifier.allocate
id.value = '10.14749/1407399495'
expect(id.value).to eq('10.14749/1407399495')
end
it 'disallows bad DOIs' do
id = Identifier.allocate
bad_dois = %w(
20.14749/1407399495
11.14749/1407399495
10./1407399495
10.14749\1407399495
10.14749/
)
bad_dois.each do |doi|
expect { id.value = doi }.to raise_error(ArgumentError)
expect(id.value).to be_nil
end
end
end
describe '#load_from_xml' do
it 'parses XML' do
xml_text = "10.14749/1407399498"
id = Identifier.parse_xml(xml_text)
expect(id.identifier_type).to eq('DOI')
expect(id.value).to eq('10.14749/1407399498')
end
end
describe '#save_to_xml' do
it 'writes XML' do
id = Identifier.new(value: '10.14749/1407399498')
xml = id.save_to_xml
expect(xml).to be_xml("10.14749/1407399498")
end
end
end
end
end