require 'spec_helper' module Datacite module Mapping describe Date do describe 'RKMS-ISO8601 support' do it 'supports closed datetime ranges' do date = Date.new(value: '1997-07-16T19:30+10:00/1997-07-17T15:30-05:00', type: DateType::VALID) expect(date.date_value).to be_nil expect(date.range_start).to eq(DateValue.new('1997-07-16T19:30+10:00')) expect(date.range_end).to eq(DateValue.new('1997-07-17T15:30-05:00')) end it 'supports left open datetime ranges' do date = Date.new(value: '/1997-07-17T15:30-05:00', type: DateType::VALID) expect(date.date_value).to be_nil expect(date.range_start).to be_nil expect(date.range_end).to eq(DateValue.new('1997-07-17T15:30-05:00')) end it 'supports right open datetime ranges' do date = Date.new(value: '1997-07-16T19:30+10:00/', type: DateType::VALID) expect(date.date_value).to be_nil expect(date.range_start).to eq(DateValue.new('1997-07-16T19:30+10:00')) expect(date.range_end).to be_nil end it 'fails on range-like non-ranges' do expect { Date.new(value: '5/18/72', type: DateType::VALID) }.to raise_error(ArgumentError) end it 'saves closed ranges to XML' do date = Date.new(value: '1997-07-16T19:30+10:00/1997-07-17T15:30-05:00', type: DateType::AVAILABLE) expected_xml = '1997-07-16T19:30+10:00/1997-07-17T15:30-05:00' expect(date.save_to_xml).to be_xml(expected_xml) end it 'saves right open ranges to XML' do date = Date.new(value: '1997-07-16T19:30+10:00/', type: DateType::AVAILABLE) expected_xml = '1997-07-16T19:30+10:00/' expect(date.save_to_xml).to be_xml(expected_xml) end it 'saves left open ranges to XML' do date = Date.new(value: '/1997-07-17T15:30-05:00', type: DateType::AVAILABLE) expected_xml = '/1997-07-17T15:30-05:00' expect(date.save_to_xml).to be_xml(expected_xml) end end describe 'type=' do it 'sets the type' do d = Date.allocate d.type = DateType::COLLECTED expect(d.type).to eq(DateType::COLLECTED) end it 'rejects nil' do d = Date.new(value: 1914, type: DateType::COLLECTED) expect { d.type = nil }.to raise_error(ArgumentError) expect(d.type).to eq(DateType::COLLECTED) end end describe '#save_to_xml' do it 'writes XML' do d = Date.new(value: '1914-08-04T11:01:06.0123+01:00', type: DateType::AVAILABLE) expected_xml = '1914-08-04T11:01:06.0123+01:00' expect(d.save_to_xml).to be_xml(expected_xml) end it 'writes XML with all value types' do { with_date_time: DateTime.new(1914, 8, 4, 11, 1, 6.0123, '+1'), with_date: ::Date.new(1914, 8, 4), with_year: 1914, with_year_str: '1914', with_year_month: '1914-08', iso8601: '1914-08-04T11:01+01:00', iso8601_secs: '1914-08-04T11:01:06+01:00', iso8601_frac: '1914-08-04T11:01:06.0123+01:00' }.each do |k, v| d = Date.new(value: v, type: DateType::AVAILABLE) xml = d.save_to_xml parsed = Date.parse_xml(xml) expect(parsed).to eq(d), "Expected #{d}, got #{parsed} for #{k}" end end end describe '#load_from_xml' do it 'reads XML' do xml = '1914-08-04T11:01:06.0123+01:00' d = Date.parse_xml(xml) expect(d.date_value).to eq(DateValue.new(DateTime.new(1914, 8, 4, 11, 0o1, 6.0123, '+1'))) end end end end end