stanford-mods 3.1.0 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,229 +1,587 @@
1
1
  describe "computations from /originInfo field" do
2
- let(:smods_rec) { Stanford::Mods::Record.new }
3
-
4
- # used for single examples
5
- let(:mods_origin_info_start_str) { "<mods xmlns=\"#{Mods::MODS_NS}\"><originInfo>" }
6
- let(:mods_origin_info_end_str) { '</originInfo></mods>' }
7
-
8
- # used for hashes/arrays of examples
9
- let(:mods_origin_info) do
10
- <<-EOF
11
- #{mods_origin_info_start_str}
12
- #{example}
13
- #{mods_origin_info_end_str}
14
- EOF
15
- end
2
+ let(:record) { Stanford::Mods::Record.new.from_str(modsxml) }
3
+
4
+ context '#pub_year_display_str' do
5
+ context 'when it has a dateIssued date' do
6
+ let(:modsxml) do
7
+ <<-EOF
8
+ <mods xmlns="http://www.loc.gov/mods/v3">
9
+ <originInfo>
10
+ <dateIssued>1900</dateIssued>
11
+ </originInfo>
12
+ </mods>
13
+ EOF
14
+ end
15
+
16
+ it 'returns the year from the dateIssued field' do
17
+ expect(record.pub_year_display_str).to eq '1900'
18
+ end
19
+ end
20
+
21
+ context 'when it has a dateCreated date' do
22
+ let(:modsxml) do
23
+ <<-EOF
24
+ <mods xmlns="http://www.loc.gov/mods/v3">
25
+ <originInfo>
26
+ <dateCreated>1800</dateCreated>
27
+ </originInfo>
28
+ </mods>
29
+ EOF
30
+ end
31
+
32
+ it 'returns the year from the dateCreated field' do
33
+ expect(record.pub_year_display_str).to eq '1800'
34
+ end
35
+ end
36
+
37
+ context 'when it has a dateCaptured date' do
38
+ let(:modsxml) do
39
+ <<-EOF
40
+ <mods xmlns="http://www.loc.gov/mods/v3">
41
+ <originInfo>
42
+ <dateCaptured>1700</dateCaptured>
43
+ </originInfo>
44
+ </mods>
45
+ EOF
46
+ end
47
+
48
+ it 'returns the year from the dateCaptured field' do
49
+ expect(record.pub_year_display_str).to eq '1700'
50
+ end
51
+ end
52
+
53
+ context 'when it has multiple types of date fields' do
54
+ let(:modsxml) do
55
+ <<-EOF
56
+ <mods xmlns="http://www.loc.gov/mods/v3">
57
+ <originInfo>
58
+ <dateIssued>1900</dateIssued>
59
+ <dateCreated>1800</dateCreated>
60
+ <dateCaptured>1700</dateCaptured>
61
+ </originInfo>
62
+ </mods>
63
+ EOF
64
+ end
65
+
66
+ it 'returns the year from the dateIssued field' do
67
+ expect(record.pub_year_display_str).to eq '1900'
68
+ end
69
+ end
16
70
 
17
- RSpec.shared_examples "single pub date value" do |method_sym, exp_val_position|
18
- it 'prefers dateIssued to dateCreated' do
19
- mods_str = mods_origin_info_start_str +
20
- '<dateIssued>2005</dateIssued>' +
21
- '</originInfo>' +
22
- '<originInfo>
23
- <dateCreated>1999</dateCreated>' +
24
- mods_origin_info_end_str
25
- smods_rec.from_str(mods_str)
26
- expect(smods_rec.send(method_sym)).to eq method_sym.to_s =~ /int/ ? 2005 : '2005'
27
- end
28
- it 'respects ignore_approximate param' do
29
- mods_str = mods_origin_info_start_str +
30
- '<dateCreated point="start" qualifier="approximate">1000</dateCreated>' +
31
- '<dateCreated point="end">1599</dateCreated>' +
32
- mods_origin_info_end_str
33
- smods_rec.from_str(mods_str)
34
- expect(smods_rec.send(method_sym, ignore_approximate: true)).to eq method_sym.to_s =~ /int/ ? 1599 : '1599'
35
- expect(smods_rec.send(method_sym, ignore_approximate: false)).to eq method_sym.to_s =~ /int/ ? 1000 : '1000'
36
- end
37
- it 'nil if ignore_approximate and all dates are approximate' do
38
- mods_str = mods_origin_info_start_str +
39
- '<dateCreated point="start" qualifier="approximate">1000</dateCreated>' +
40
- '<dateCreated point="end" qualifier="questionable">1599</dateCreated>' +
41
- mods_origin_info_end_str
42
- smods_rec.from_str(mods_str)
43
- expect(smods_rec.send(method_sym, ignore_approximate: true)).to eq nil
44
- expect(smods_rec.send(method_sym, ignore_approximate: false)).to eq method_sym.to_s =~ /int/ ? 1000 : '1000'
45
- end
46
- it 'respects ignore_approximate even for keyDate' do
47
- mods_str = mods_origin_info_start_str +
48
- '<dateCreated point="start" qualifier="approximate" keyDate="yes">1000</dateCreated>' +
49
- '<dateCreated point="end">1599</dateCreated>' +
50
- mods_origin_info_end_str
51
- smods_rec.from_str(mods_str)
52
- expect(smods_rec.send(method_sym, ignore_approximate: true)).to eq method_sym.to_s =~ /int/ ? 1599 : '1599'
53
- expect(smods_rec.send(method_sym, ignore_approximate: false)).to eq method_sym.to_s =~ /int/ ? 1000 : '1000'
54
- end
55
- it 'uses dateCaptured if no dateIssued or dateCreated' do
56
- # for web archive seed files
57
- mods_str = mods_origin_info_start_str +
58
- '<dateCaptured encoding="iso8601" point="start" keyDate="yes">20151215121212</dateCaptured>' +
59
- '<dateCaptured encoding="iso8601" point="end">20151218111111</dateCaptured>' +
60
- mods_origin_info_end_str
61
- smods_rec.from_str(mods_str)
62
- expect(smods_rec.send(method_sym)).to eq method_sym.to_s =~ /int/ ? 2015 : '2015'
63
- end
64
- context 'spotlight actual data' do
65
- require 'fixtures/spotlight_pub_date_data'
66
- SPOTLIGHT_PUB_DATE_DATA.each_pair.each do |coll_name, coll_data|
67
- # papyri - the only Spotlight data with BC dates
68
- next if coll_name == 'papyri' && method_sym == :pub_year_int
69
-
70
- coll_data.each_pair do |mods_str, exp_vals|
71
- expected = exp_vals[exp_val_position]
72
- it "#{expected} for rec in #{coll_name}" do
73
- smods_rec.from_str(mods_str)
74
- expect(smods_rec.send(method_sym)).to eq((method_sym.to_s =~ /int/ ? expected.to_i : expected)) if expected
75
- end
71
+ context 'when it has a key date of the same type' do
72
+ let(:modsxml) do
73
+ <<-EOF
74
+ <mods xmlns="http://www.loc.gov/mods/v3">
75
+ <originInfo>
76
+ <dateIssued keyDate="yes">1900</dateIssued>
77
+ <dateIssued>1800</dateIssued>
78
+ </originInfo>
79
+ </mods>
80
+ EOF
81
+ end
82
+
83
+ it 'returns the year from the keyDate field' do
84
+ expect(record.pub_year_display_str).to eq '1900'
85
+ end
86
+ end
87
+
88
+ context 'when it has a key date of a different type' do
89
+ let(:modsxml) do
90
+ <<-EOF
91
+ <mods xmlns="http://www.loc.gov/mods/v3">
92
+ <originInfo>
93
+ <dateCreated keyDate="yes">1900</dateCreated>
94
+ <dateIssued>1800</dateIssued>
95
+ </originInfo>
96
+ </mods>
97
+ EOF
98
+ end
99
+
100
+ it 'returns the year from the preferred field type regardless of the keyDate' do
101
+ expect(record.pub_year_display_str).to eq '1800'
102
+ end
103
+
104
+ context 'with field filters' do
105
+ it 'returns the year from the requested field' do
106
+ expect(record.pub_year_display_str([:dateCreated])).to eq '1900'
76
107
  end
77
108
  end
78
109
  end
79
- end
80
110
 
81
- context '#pub_year_display_str' do
82
- it_behaves_like "single pub date value", :pub_year_display_str, 1
111
+ context 'when it has multiple dates' do
112
+ let(:modsxml) do
113
+ <<-EOF
114
+ <mods xmlns="http://www.loc.gov/mods/v3">
115
+ <originInfo>
116
+ <dateIssued>1900</dateIssued>
117
+ <dateIssued>1800</dateIssued>
118
+ </originInfo>
119
+ </mods>
120
+ EOF
121
+ end
122
+
123
+ it 'returns the earliest year' do
124
+ expect(record.pub_year_display_str).to eq '1800'
125
+ end
126
+ end
127
+
128
+ context 'when it has multiple originInfo elements' do
129
+ let(:modsxml) do
130
+ <<-EOF
131
+ <mods xmlns="http://www.loc.gov/mods/v3">
132
+ <originInfo>
133
+ <dateIssued>1900</dateIssued>
134
+ </originInfo>
135
+ <originInfo>
136
+ <dateIssued>1800</dateIssued>
137
+ </originInfo>
138
+ </mods>
139
+ EOF
140
+ end
141
+
142
+ it 'returns the earliest year across all the dates' do
143
+ expect(record.pub_year_display_str).to eq '1800'
144
+ end
145
+ end
146
+
147
+ context 'when it has a date range' do
148
+ let(:modsxml) do
149
+ <<-EOF
150
+ <mods xmlns="http://www.loc.gov/mods/v3">
151
+ <originInfo>
152
+ <dateIssued point="start">1800</dateIssued>
153
+ <dateIssued point="end">1900</dateIssued>
154
+ </originInfo>
155
+ </mods>
156
+ EOF
157
+ end
158
+
159
+ it 'returns the date range' do
160
+ expect(record.pub_year_display_str).to eq '1800 - 1900'
161
+ end
162
+ end
163
+
164
+ context 'when it has an open-ended date range' do
165
+ let(:modsxml) do
166
+ <<-EOF
167
+ <mods xmlns="http://www.loc.gov/mods/v3">
168
+ <originInfo>
169
+ <dateIssued point="start">uuuu</dateIssued>
170
+ <dateIssued point="end">1900</dateIssued>
171
+ </originInfo>
172
+ </mods>
173
+ EOF
174
+ end
175
+
176
+ it 'returns the date range' do
177
+ expect(record.pub_year_display_str).to eq ' - 1900'
178
+ end
179
+ end
180
+
181
+ context 'when it has an encoded date' do
182
+ let(:modsxml) do
183
+ <<-EOF
184
+ <mods xmlns="http://www.loc.gov/mods/v3">
185
+ <originInfo>
186
+ <dateIssued>1800</dateIssued>
187
+ <dateIssued encoding="marc">1900</dateIssued>
188
+ </originInfo>
189
+ </mods>
190
+ EOF
191
+ end
192
+
193
+ it 'returns the encoded date' do
194
+ expect(record.pub_year_display_str).to eq '1900'
195
+ end
196
+ end
197
+
198
+ context 'when it has a date range and an earlier single date' do
199
+ let(:modsxml) do
200
+ <<-EOF
201
+ <mods xmlns="http://www.loc.gov/mods/v3">
202
+ <originInfo>
203
+ <dateIssued>1799</dateIssued>
204
+ <dateIssued point="start">1800</dateIssued>
205
+ <dateIssued point="end">1900</dateIssued>
206
+ </originInfo>
207
+ </mods>
208
+ EOF
209
+ end
210
+
211
+ it 'returns the earliest date' do
212
+ expect(record.pub_year_display_str).to eq '1799'
213
+ end
214
+ end
215
+
216
+ context 'when it has a date range and a later single date' do
217
+ let(:modsxml) do
218
+ <<-EOF
219
+ <mods xmlns="http://www.loc.gov/mods/v3">
220
+ <originInfo>
221
+ <dateIssued>1850</dateIssued>
222
+ <dateIssued point="start">1800</dateIssued>
223
+ <dateIssued point="end">1900</dateIssued>
224
+ </originInfo>
225
+ </mods>
226
+ EOF
227
+ end
228
+
229
+ it 'returns the date range' do
230
+ expect(record.pub_year_display_str).to eq '1800 - 1900'
231
+ end
232
+ end
233
+
234
+ context 'with BCE dates' do
235
+ let(:modsxml) do
236
+ <<-EOF
237
+ <mods xmlns="http://www.loc.gov/mods/v3">
238
+ <originInfo>
239
+ <dateIssued encoding="edtf">-0249</dateIssued>
240
+ <dateIssued encoding="edtf">-0149</dateIssued>
241
+ </originInfo>
242
+ </mods>
243
+ EOF
244
+ end
245
+
246
+ it 'returns the earliest date' do
247
+ expect(record.pub_year_display_str).to eq '250 BCE'
248
+ end
249
+ end
250
+
251
+ context 'with a BCE date range' do
252
+ let(:modsxml) do
253
+ <<-EOF
254
+ <mods xmlns="http://www.loc.gov/mods/v3">
255
+ <originInfo>
256
+ <dateIssued encoding="edtf" point="start">-0249</dateIssued>
257
+ <dateIssued encoding="edtf" point="end">-0149</dateIssued>
258
+ </originInfo>
259
+ </mods>
260
+ EOF
261
+ end
262
+
263
+ it 'returns the date range' do
264
+ expect(record.pub_year_display_str).to eq '250 BCE - 150 BCE'
265
+ end
266
+ end
267
+
268
+ context 'with a qualified date' do
269
+ let(:modsxml) do
270
+ <<-EOF
271
+ <mods xmlns="http://www.loc.gov/mods/v3">
272
+ <originInfo>
273
+ <dateIssued qualifier="approximate">249</dateIssued>
274
+ </originInfo>
275
+ </mods>
276
+ EOF
277
+ end
278
+
279
+ it 'returns the date without any qualifiers' do
280
+ expect(record.pub_year_display_str).to eq '249 CE'
281
+ end
282
+
283
+ context 'with ignore_approximate: true' do
284
+ it 'returns nothing' do
285
+ expect(record.pub_year_display_str(ignore_approximate: true)).to eq nil
286
+ end
287
+ end
288
+ end
289
+
290
+ context 'with non-year data in the field' do
291
+ let(:modsxml) do
292
+ <<-EOF
293
+ <mods xmlns="http://www.loc.gov/mods/v3">
294
+ <originInfo>
295
+ <dateIssued>12th May 1800</dateIssued>
296
+ </originInfo>
297
+ </mods>
298
+ EOF
299
+ end
300
+
301
+ it 'returns only the year part of the date' do
302
+ expect(record.pub_year_display_str).to eq '1800'
303
+ end
304
+ end
305
+
306
+ context 'with a placeholder dates' do
307
+ let(:modsxml) do
308
+ <<-EOF
309
+ <mods xmlns="http://www.loc.gov/mods/v3">
310
+ <originInfo>
311
+ <dateIssued qualifier="approximate">9999</dateIssued>
312
+ </originInfo>
313
+ </mods>
314
+ EOF
315
+ end
316
+
317
+ it 'ignores the date' do
318
+ expect(record.pub_year_display_str).to eq nil
319
+ end
320
+ end
83
321
  end
84
322
 
85
323
  context '#pub_year_sort_str' do
86
- it_behaves_like "single pub date value", :pub_year_sort_str, 0
324
+ context 'when it has a dateIssued date' do
325
+ let(:modsxml) do
326
+ <<-EOF
327
+ <mods xmlns="http://www.loc.gov/mods/v3">
328
+ <originInfo>
329
+ <dateIssued>1900</dateIssued>
330
+ </originInfo>
331
+ </mods>
332
+ EOF
333
+ end
334
+
335
+ it 'returns the year from the field' do
336
+ expect(record.pub_year_sort_str).to eq '1900'
337
+ end
338
+ end
339
+
340
+ context 'when it has a date range' do
341
+ let(:modsxml) do
342
+ <<-EOF
343
+ <mods xmlns="http://www.loc.gov/mods/v3">
344
+ <originInfo>
345
+ <dateIssued point="start">1800</dateIssued>
346
+ <dateIssued point="end">1900</dateIssued>
347
+ </originInfo>
348
+ </mods>
349
+ EOF
350
+ end
351
+
352
+ it 'returns just the earliest date in the range' do
353
+ expect(record.pub_year_sort_str).to eq '1800'
354
+ end
355
+ end
356
+
357
+ context 'with BCE dates' do
358
+ let(:modsxml) do
359
+ <<-EOF
360
+ <mods xmlns="http://www.loc.gov/mods/v3">
361
+ <originInfo>
362
+ <dateIssued encoding="edtf">-0249</dateIssued>
363
+ <dateIssued encoding="edtf">-0149</dateIssued>
364
+ </originInfo>
365
+ </mods>
366
+ EOF
367
+ end
368
+
369
+ it 'returns the earliest date with the funky lexical sort encoding' do
370
+ expect(record.pub_year_sort_str).to eq '-751'
371
+ end
372
+ end
373
+
374
+ context 'with a BCE date range' do
375
+ let(:modsxml) do
376
+ <<-EOF
377
+ <mods xmlns="http://www.loc.gov/mods/v3">
378
+ <originInfo>
379
+ <dateIssued encoding="edtf" point="start">-0249</dateIssued>
380
+ <dateIssued encoding="edtf" point="end">-0149</dateIssued>
381
+ </originInfo>
382
+ </mods>
383
+ EOF
384
+ end
385
+
386
+ it 'returns the earliest date of the range with the funky lexical sort encoding' do
387
+ expect(record.pub_year_sort_str).to eq '-751'
388
+ end
389
+ end
390
+
391
+ context 'with a qualified date' do
392
+ let(:modsxml) do
393
+ <<-EOF
394
+ <mods xmlns="http://www.loc.gov/mods/v3">
395
+ <originInfo>
396
+ <dateIssued qualifier="approximate">249</dateIssued>
397
+ </originInfo>
398
+ </mods>
399
+ EOF
400
+ end
401
+
402
+ it 'returns the date without any qualifiers' do
403
+ expect(record.pub_year_sort_str).to eq '0249'
404
+ end
405
+
406
+ context 'with ignore_approximate: true' do
407
+ it 'returns nothing' do
408
+ expect(record.pub_year_sort_str(ignore_approximate: true)).to eq nil
409
+ end
410
+ end
411
+ end
412
+
413
+ context 'with a placeholder dates' do
414
+ let(:modsxml) do
415
+ <<-EOF
416
+ <mods xmlns="http://www.loc.gov/mods/v3">
417
+ <originInfo>
418
+ <dateIssued qualifier="approximate">9999</dateIssued>
419
+ </originInfo>
420
+ </mods>
421
+ EOF
422
+ end
423
+
424
+ it 'ignores the date' do
425
+ expect(record.pub_year_sort_str).to eq nil
426
+ end
427
+ end
428
+
429
+ context 'when it has an open-ended date range' do
430
+ let(:modsxml) do
431
+ <<-EOF
432
+ <mods xmlns="http://www.loc.gov/mods/v3">
433
+ <originInfo>
434
+ <dateIssued point="start">uuuu</dateIssued>
435
+ <dateIssued point="end">1900</dateIssued>
436
+ </originInfo>
437
+ </mods>
438
+ EOF
439
+ end
440
+
441
+ it 'returns the known part of the date range' do
442
+ expect(record.pub_year_sort_str).to eq '1900'
443
+ end
444
+ end
87
445
  end
88
446
 
89
447
  context '#pub_year_int' do
90
- it_behaves_like "single pub date value", :pub_year_int, 0
91
- # papyri - the only Spotlight data with BC dates
92
- it '-200 for 200 B.C.' do
93
- # hd778hw9236
94
- mods_str = mods_origin_info_start_str +
95
- '<dateCreated keyDate="yes" point="start" qualifier="approximate">200 B.C.</dateCreated>' +
96
- '<dateCreated keyDate="yes" point="end" qualifier="approximate">180 B.C.</dateCreated>' +
97
- mods_origin_info_end_str
98
- smods_rec.from_str(mods_str)
99
- expect(smods_rec.pub_year_int).to eq(-199)
100
- end
101
- it '-211 for 211 B.C.' do
102
- # ww728rz0477
103
- mods_str = mods_origin_info_start_str +
104
- '<dateCreated keyDate="yes" point="start" qualifier="approximate">211 B.C.</dateCreated>' +
105
- '<dateCreated keyDate="yes" point="end" qualifier="approximate">150 B.C.</dateCreated>' +
106
- mods_origin_info_end_str
107
- smods_rec.from_str(mods_str)
108
- expect(smods_rec.pub_year_int).to eq(-210)
448
+ context 'when it has a dateIssued date' do
449
+ let(:modsxml) do
450
+ <<-EOF
451
+ <mods xmlns="http://www.loc.gov/mods/v3">
452
+ <originInfo>
453
+ <dateIssued>1900</dateIssued>
454
+ </originInfo>
455
+ </mods>
456
+ EOF
457
+ end
458
+
459
+ it 'returns the year from the dateIssued field' do
460
+ expect(record.pub_year_int).to eq 1900
461
+ end
109
462
  end
110
- end
111
463
 
112
- context '*best_or_earliest_year' do
113
- it 'selects earliest (valid) parseable date from multiple options' do
114
- mods_str = mods_origin_info_start_str +
115
- '<dateIssued point="start" qualifier="questionable">1758</dateIssued>' +
116
- '<dateIssued point="end" qualifier="questionable">uuuu</dateIssued>' +
117
- '<dateIssued>1753]</dateIssued>' +
118
- mods_origin_info_end_str
119
- smods_rec.from_str(mods_str)
120
- expect(Stanford::Mods::OriginInfo.best_or_earliest_year(smods_rec.origin_info.dateIssued).xml.text).to eq '1753]'
121
- end
122
- it 'ignores encoding' do
123
- # encoding matters for choosing display, not for parsing year
124
- mods_str = mods_origin_info_start_str +
125
- '<dateIssued>1100</dateIssued>' +
126
- '<dateIssued encoding="marc">1200</dateIssued>' +
127
- '<dateIssued encoding="w3cdtf">1300</dateIssued>' +
128
- mods_origin_info_end_str
129
- smods_rec.from_str(mods_str)
130
- expect(Stanford::Mods::OriginInfo.best_or_earliest_year(smods_rec.origin_info.dateIssued).xml.text).to eq '1100'
131
- mods_str = mods_origin_info_start_str +
132
- '<dateIssued>1200</dateIssued>' +
133
- '<dateIssued encoding="marc">1300</dateIssued>' +
134
- '<dateIssued encoding="w3cdtf">1100</dateIssued>' +
135
- mods_origin_info_end_str
136
- smods_rec.from_str(mods_str)
137
- expect(Stanford::Mods::OriginInfo.best_or_earliest_year(smods_rec.origin_info.dateIssued).xml.text).to eq '1100'
138
- mods_str = mods_origin_info_start_str +
139
- '<dateIssued>1300</dateIssued>' +
140
- '<dateIssued encoding="marc">1100</dateIssued>' +
141
- '<dateIssued encoding="w3cdtf">1200</dateIssued>' +
142
- mods_origin_info_end_str
143
- smods_rec.from_str(mods_str)
144
- expect(Stanford::Mods::OriginInfo.best_or_earliest_year(smods_rec.origin_info.dateIssued).xml.text).to eq '1100'
464
+ context 'when it has multiple dates' do
465
+ let(:modsxml) do
466
+ <<-EOF
467
+ <mods xmlns="http://www.loc.gov/mods/v3">
468
+ <originInfo>
469
+ <dateIssued>1900</dateIssued>
470
+ <dateIssued>1800</dateIssued>
471
+ </originInfo>
472
+ </mods>
473
+ EOF
474
+ end
475
+
476
+ it 'returns the earliest year' do
477
+ expect(record.pub_year_int).to eq 1800
478
+ end
145
479
  end
146
- end
147
480
 
148
- RSpec.shared_examples "pub date best single value" do |method_sym|
149
- it 'uses keyDate value if specified' do
150
- mods_str = mods_origin_info_start_str +
151
- '<dateIssued>1666</dateIssued>' +
152
- '<dateIssued keyDate="yes">2014</dateIssued>' +
153
- mods_origin_info_end_str
154
- smods_rec.from_str(mods_str)
155
- expect(smods_rec.send(method_sym, smods_rec.origin_info.dateIssued)).to eq method_sym.to_s =~ /int/ ? 2014 : '2014'
156
- end
157
- it 'ignores invalid keyDate value' do
158
- mods_str = mods_origin_info_start_str +
159
- '<dateIssued keyDate="6th">1500</dateIssued>' +
160
- '<dateIssued>1499</dateIssued>' +
161
- mods_origin_info_end_str
162
- smods_rec.from_str(mods_str)
163
- expect(smods_rec.send(method_sym, smods_rec.origin_info.dateIssued)).to eq method_sym.to_s =~ /int/ ? 1499 : '1499'
164
- end
165
- it 'calls earliest_year if multiple keyDates present' do
166
- mods_str = mods_origin_info_start_str +
167
- '<dateCreated keyDate="yes">2003</dateCreated>' +
168
- '<dateCreated keyDate="yes">2001</dateCreated>' +
169
- mods_origin_info_end_str
170
- smods_rec.from_str(mods_str)
171
- expect(Stanford::Mods::OriginInfo).to receive(:best_or_earliest_year).with(smods_rec.origin_info.dateCreated)
172
- expect(smods_rec.send(method_sym, smods_rec.origin_info.dateCreated))
173
- end
174
- it 'calls earliest_year if no keyDate' do
175
- mods_str = mods_origin_info_start_str +
176
- '<dateIssued>1753]</dateIssued>' +
177
- '<dateIssued point="start" qualifier="questionable">1758</dateIssued>' +
178
- '<dateIssued point="end" qualifier="questionable">uuuu</dateIssued>' +
179
- mods_origin_info_end_str
180
- smods_rec.from_str(mods_str)
181
- if method_sym.to_s =~ /int/
182
- expect(Stanford::Mods::OriginInfo).to receive(:best_or_earliest_year).with(smods_rec.origin_info.dateIssued)
183
- else
184
- expect(Stanford::Mods::OriginInfo).to receive(:best_or_earliest_year).with(smods_rec.origin_info.dateIssued)
185
- end
186
- smods_rec.send(method_sym, smods_rec.origin_info.dateIssued)
187
- end
188
- it 'ignores encoding' do
189
- # encoding matters for choosing display, not for parsing year
190
- mods_str = mods_origin_info_start_str +
191
- '<dateIssued keyDate="yes">1100</dateIssued>' +
192
- '<dateIssued encoding="marc">1200</dateIssued>' +
193
- '<dateIssued encoding="w3cdtf">1300</dateIssued>' +
194
- mods_origin_info_end_str
195
- smods_rec.from_str(mods_str)
196
- expect(smods_rec.send(method_sym, smods_rec.origin_info.dateIssued)).to eq method_sym.to_s =~ /int/ ? 1100 : '1100'
197
- mods_str = mods_origin_info_start_str +
198
- '<dateIssued>1200</dateIssued>' +
199
- '<dateIssued encoding="marc">1300</dateIssued>' +
200
- '<dateIssued encoding="w3cdtf" keyDate="yes">1100</dateIssued>' +
201
- mods_origin_info_end_str
202
- smods_rec.from_str(mods_str)
203
- expect(smods_rec.send(method_sym, smods_rec.origin_info.dateIssued)).to eq method_sym.to_s =~ /int/ ? 1100 : '1100'
204
- mods_str = mods_origin_info_start_str +
205
- '<dateIssued>1300</dateIssued>' +
206
- '<dateIssued encoding="marc" keyDate="yes">1100</dateIssued>' +
207
- '<dateIssued encoding="w3cdtf">1200</dateIssued>' +
208
- mods_origin_info_end_str
209
- smods_rec.from_str(mods_str)
210
- expect(smods_rec.send(method_sym, smods_rec.origin_info.dateIssued)).to eq method_sym.to_s =~ /int/ ? 1100 : '1100'
481
+ context 'when it has a date range' do
482
+ let(:modsxml) do
483
+ <<-EOF
484
+ <mods xmlns="http://www.loc.gov/mods/v3">
485
+ <originInfo>
486
+ <dateIssued point="start">1800</dateIssued>
487
+ <dateIssued point="end">1900</dateIssued>
488
+ </originInfo>
489
+ </mods>
490
+ EOF
491
+ end
492
+
493
+ it 'returns the earliest year from the date range' do
494
+ expect(record.pub_year_int).to eq 1800
495
+ end
496
+ end
497
+
498
+ context 'when it has an open-ended date range' do
499
+ let(:modsxml) do
500
+ <<-EOF
501
+ <mods xmlns="http://www.loc.gov/mods/v3">
502
+ <originInfo>
503
+ <dateIssued point="start">uuuu</dateIssued>
504
+ <dateIssued point="end">1900</dateIssued>
505
+ </originInfo>
506
+ </mods>
507
+ EOF
508
+ end
509
+
510
+ it 'returns the known part of the date range' do
511
+ expect(record.pub_year_int).to eq 1900
512
+ end
211
513
  end
212
- end
213
514
 
214
- context '*is_approximate' do
215
- it 'removes elements when date_is_approximate? returns true' do
216
- mods_str = "#{mods_origin_info_start_str}
217
- <dateIssued>1900</dateIssued>
218
- <dateIssued qualifier='inferred'>1910</dateIssued>
219
- <dateIssued qualifier='questionable'>1930</dateIssued>
220
- #{mods_origin_info_end_str}"
221
- smods_rec.from_str(mods_str)
222
- elements = smods_rec.origin_info.dateIssued
223
- expect(elements.size).to eq 3
224
- result = elements.reject { |n| smods_rec.is_approximate(n) }
225
- expect(result).to be_instance_of(Array)
226
- expect(result.size).to eq 2
515
+ context 'with BCE dates' do
516
+ let(:modsxml) do
517
+ <<-EOF
518
+ <mods xmlns="http://www.loc.gov/mods/v3">
519
+ <originInfo>
520
+ <dateIssued encoding="edtf">-0249</dateIssued>
521
+ <dateIssued encoding="edtf">-0149</dateIssued>
522
+ </originInfo>
523
+ </mods>
524
+ EOF
525
+ end
526
+
527
+ it 'returns the earliest date' do
528
+ expect(record.pub_year_int).to eq(-249)
529
+ end
530
+ end
531
+
532
+ context 'with a BCE date range' do
533
+ let(:modsxml) do
534
+ <<-EOF
535
+ <mods xmlns="http://www.loc.gov/mods/v3">
536
+ <originInfo>
537
+ <dateIssued encoding="edtf" point="start">-0249</dateIssued>
538
+ <dateIssued encoding="edtf" point="end">-0149</dateIssued>
539
+ </originInfo>
540
+ </mods>
541
+ EOF
542
+ end
543
+
544
+ it 'returns the year of the earliest date in the range' do
545
+ expect(record.pub_year_int).to eq(-249)
546
+ end
547
+ end
548
+
549
+ context 'with a qualified date' do
550
+ let(:modsxml) do
551
+ <<-EOF
552
+ <mods xmlns="http://www.loc.gov/mods/v3">
553
+ <originInfo>
554
+ <dateIssued qualifier="approximate">249</dateIssued>
555
+ </originInfo>
556
+ </mods>
557
+ EOF
558
+ end
559
+
560
+ it 'returns the date without any qualifiers' do
561
+ expect(record.pub_year_int).to eq 249
562
+ end
563
+
564
+ context 'with ignore_approximate: true' do
565
+ it 'returns nothing' do
566
+ expect(record.pub_year_int(ignore_approximate: true)).to eq nil
567
+ end
568
+ end
569
+ end
570
+
571
+ context 'with a placeholder dates' do
572
+ let(:modsxml) do
573
+ <<-EOF
574
+ <mods xmlns="http://www.loc.gov/mods/v3">
575
+ <originInfo>
576
+ <dateIssued qualifier="approximate">9999</dateIssued>
577
+ </originInfo>
578
+ </mods>
579
+ EOF
580
+ end
581
+
582
+ it 'ignores the date' do
583
+ expect(record.pub_year_int).to eq nil
584
+ end
227
585
  end
228
586
  end
229
587
  end