oai_talia 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +81 -0
- data/Rakefile +127 -0
- data/bin/oai +68 -0
- data/examples/models/file_model.rb +63 -0
- data/examples/providers/dublin_core.rb +474 -0
- data/lib/oai/client/get_record.rb +15 -0
- data/lib/oai/client/header.rb +18 -0
- data/lib/oai/client/identify.rb +30 -0
- data/lib/oai/client/list_identifiers.rb +12 -0
- data/lib/oai/client/list_metadata_formats.rb +12 -0
- data/lib/oai/client/list_records.rb +21 -0
- data/lib/oai/client/list_sets.rb +19 -0
- data/lib/oai/client/metadata_format.rb +12 -0
- data/lib/oai/client/record.rb +26 -0
- data/lib/oai/client/response.rb +35 -0
- data/lib/oai/client.rb +301 -0
- data/lib/oai/constants.rb +34 -0
- data/lib/oai/exception.rb +75 -0
- data/lib/oai/harvester/config.rb +41 -0
- data/lib/oai/harvester/harvest.rb +150 -0
- data/lib/oai/harvester/logging.rb +70 -0
- data/lib/oai/harvester/mailer.rb +17 -0
- data/lib/oai/harvester/shell.rb +338 -0
- data/lib/oai/harvester.rb +39 -0
- data/lib/oai/provider/metadata_format/oai_dc.rb +29 -0
- data/lib/oai/provider/metadata_format/oai_europeana.rb +38 -0
- data/lib/oai/provider/metadata_format.rb +143 -0
- data/lib/oai/provider/model/activerecord_caching_wrapper.rb +134 -0
- data/lib/oai/provider/model/activerecord_wrapper.rb +139 -0
- data/lib/oai/provider/model.rb +74 -0
- data/lib/oai/provider/partial_result.rb +18 -0
- data/lib/oai/provider/response/error.rb +16 -0
- data/lib/oai/provider/response/get_record.rb +26 -0
- data/lib/oai/provider/response/identify.rb +25 -0
- data/lib/oai/provider/response/list_identifiers.rb +35 -0
- data/lib/oai/provider/response/list_metadata_formats.rb +34 -0
- data/lib/oai/provider/response/list_records.rb +34 -0
- data/lib/oai/provider/response/list_sets.rb +23 -0
- data/lib/oai/provider/response/record_response.rb +70 -0
- data/lib/oai/provider/response.rb +161 -0
- data/lib/oai/provider/resumption_token.rb +106 -0
- data/lib/oai/provider.rb +304 -0
- data/lib/oai/set.rb +29 -0
- data/lib/oai/xpath.rb +75 -0
- data/lib/oai.rb +8 -0
- data/lib/test.rb +25 -0
- data/test/activerecord_provider/config/connection.rb +5 -0
- data/test/activerecord_provider/config/database.yml +6 -0
- data/test/activerecord_provider/database/ar_migration.rb +59 -0
- data/test/activerecord_provider/database/oaipmhtest +0 -0
- data/test/activerecord_provider/fixtures/dc.yml +1501 -0
- data/test/activerecord_provider/helpers/providers.rb +44 -0
- data/test/activerecord_provider/helpers/set_provider.rb +36 -0
- data/test/activerecord_provider/models/dc_field.rb +7 -0
- data/test/activerecord_provider/models/dc_set.rb +6 -0
- data/test/activerecord_provider/models/oai_token.rb +3 -0
- data/test/activerecord_provider/tc_ar_provider.rb +113 -0
- data/test/activerecord_provider/tc_ar_sets_provider.rb +72 -0
- data/test/activerecord_provider/tc_caching_paging_provider.rb +55 -0
- data/test/activerecord_provider/tc_simple_paging_provider.rb +57 -0
- data/test/activerecord_provider/test_helper.rb +4 -0
- data/test/client/helpers/provider.rb +68 -0
- data/test/client/helpers/test_wrapper.rb +11 -0
- data/test/client/tc_exception.rb +36 -0
- data/test/client/tc_get_record.rb +37 -0
- data/test/client/tc_identify.rb +13 -0
- data/test/client/tc_libxml.rb +61 -0
- data/test/client/tc_list_identifiers.rb +52 -0
- data/test/client/tc_list_metadata_formats.rb +18 -0
- data/test/client/tc_list_records.rb +13 -0
- data/test/client/tc_list_sets.rb +19 -0
- data/test/client/tc_low_resolution_dates.rb +14 -0
- data/test/client/tc_utf8_escaping.rb +11 -0
- data/test/client/tc_xpath.rb +26 -0
- data/test/client/test_helper.rb +5 -0
- data/test/provider/models.rb +234 -0
- data/test/provider/tc_exceptions.rb +96 -0
- data/test/provider/tc_functional_tokens.rb +43 -0
- data/test/provider/tc_provider.rb +71 -0
- data/test/provider/tc_resumption_tokens.rb +46 -0
- data/test/provider/tc_simple_provider.rb +92 -0
- data/test/provider/test_helper.rb +36 -0
- data/test/test.xml +22 -0
- metadata +181 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ListIdentifiersTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_list_with_resumption_token
|
6
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
7
|
+
|
8
|
+
# get a list of identifier headers
|
9
|
+
response = client.list_identifiers :metadata_prefix => 'oai_dc'
|
10
|
+
assert_kind_of OAI::ListIdentifiersResponse, response
|
11
|
+
assert_kind_of OAI::Response, response
|
12
|
+
assert response.entries.size > 0
|
13
|
+
|
14
|
+
# make sure header is put together reasonably
|
15
|
+
header = response.entries[0]
|
16
|
+
assert_kind_of OAI::Header, header
|
17
|
+
assert header.identifier
|
18
|
+
assert header.datestamp
|
19
|
+
assert header.set_spec
|
20
|
+
|
21
|
+
# exercise a resumption token and make sure first identifier is different
|
22
|
+
first_identifier = response.entries[0].identifier
|
23
|
+
token = response.resumption_token
|
24
|
+
assert_not_nil token
|
25
|
+
response = client.list_identifiers :resumption_token => token
|
26
|
+
assert response.entries.size > 0
|
27
|
+
assert_not_equal response.entries[0].identifier, first_identifier
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_list_with_date_range
|
31
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
32
|
+
from_date = Date.new(1998,1,1)
|
33
|
+
until_date = Date.new(2002,1,1)
|
34
|
+
response = client.list_identifiers :from => from_date, :until => until_date
|
35
|
+
assert response.entries.size > 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_list_with_datetime_range
|
39
|
+
# xtcat should support higher granularity
|
40
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
41
|
+
from_date = DateTime.new(2001,1,1)
|
42
|
+
until_date = DateTime.now
|
43
|
+
response = client.list_identifiers :from => from_date, :until => until_date
|
44
|
+
assert response.entries.size > 0
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_invalid_argument
|
48
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
49
|
+
assert_raise(OAI::ArgumentException) {client.list_identifiers :foo => 'bar'}
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ListMetadataFormatsTest < Test::Unit::TestCase
|
4
|
+
def test_list
|
5
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
6
|
+
response = client.list_metadata_formats
|
7
|
+
assert_kind_of OAI::ListMetadataFormatsResponse, response
|
8
|
+
assert response.entries.size > 0
|
9
|
+
|
10
|
+
format = response.entries[0]
|
11
|
+
assert_kind_of OAI::MetadataFormat, format
|
12
|
+
assert_equal 'oai_dc', format.prefix
|
13
|
+
assert_equal 'http://www.openarchives.org/OAI/2.0/oai_dc.xsd', format.schema
|
14
|
+
assert_equal 'http://www.openarchives.org/OAI/2.0/oai_dc/', format.namespace
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class GetRecordsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_get_records
|
6
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
7
|
+
response = client.list_records
|
8
|
+
assert_kind_of OAI::ListRecordsResponse, response
|
9
|
+
assert response.entries.size > 0
|
10
|
+
assert_kind_of OAI::Record, response.entries[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ListSetsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_list
|
6
|
+
client = OAI::Client.new 'http://localhost:3333/oai'
|
7
|
+
response = client.list_sets
|
8
|
+
assert_kind_of OAI::ListSetsResponse, response
|
9
|
+
assert response.entries.size > 0
|
10
|
+
assert_kind_of OAI::Set, response.entries[0]
|
11
|
+
|
12
|
+
# test iterator
|
13
|
+
for set in response
|
14
|
+
assert_kind_of OAI::Set, set
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LowResolutionDatesTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_low_res_date_parsing
|
6
|
+
client = OAI::Client.new 'http://caltechcstr.library.caltech.edu/perl/oai2'
|
7
|
+
|
8
|
+
date = Date.new 2003, 1, 1
|
9
|
+
|
10
|
+
# get a list of identifier headers
|
11
|
+
assert_nothing_raised { client.list_identifiers :from => date }
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class UTF8Test < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_escaping_invalid_utf_8_characters
|
6
|
+
client = OAI::Client.new 'http://localhost:3333/oai' #, :parser => 'libxml'
|
7
|
+
invalid_utf_8 = [2, 3, 4, 104, 5, 101, 6, 108, 66897, 108, 66535, 111, 1114112, 33, 55234123, 33].pack("U*")
|
8
|
+
assert_equal("hello!!", client.send(:strip_invalid_utf_8_chars, invalid_utf_8).gsub(/\?/, ''))
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class XpathTest < Test::Unit::TestCase
|
4
|
+
include OAI::XPath
|
5
|
+
|
6
|
+
def test_rexml
|
7
|
+
require 'rexml/document'
|
8
|
+
doc = REXML::Document.new(File.new('test/test.xml'))
|
9
|
+
assert_equal xpath(doc, './/responseDate'), '2006-09-11T14:33:15Z'
|
10
|
+
assert_equal xpath(doc, './/foobar'), nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_libxml
|
14
|
+
begin
|
15
|
+
require 'xml/libxml'
|
16
|
+
rescue LoadError
|
17
|
+
# libxml not available so nothing to test!
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
doc = LibXML::XML::Document.file('test/test.xml')
|
22
|
+
assert_equal xpath(doc, './/responseDate'), '2006-09-11T14:33:15Z'
|
23
|
+
assert_equal xpath(doc, './/foobar'), nil
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
class Record
|
2
|
+
attr_accessor :id, :titles, :creator, :tags, :sets, :updated_at, :deleted
|
3
|
+
|
4
|
+
def initialize(id,
|
5
|
+
titles = 'title',
|
6
|
+
creator = 'creator',
|
7
|
+
tags = 'tag',
|
8
|
+
sets = nil,
|
9
|
+
deleted = false,
|
10
|
+
updated_at = Time.now.utc.xmlschema)
|
11
|
+
|
12
|
+
@id = id
|
13
|
+
@titles = titles
|
14
|
+
@creator = creator
|
15
|
+
@tags = tags
|
16
|
+
@sets = sets
|
17
|
+
@deleted = deleted
|
18
|
+
@updated_at = updated_at
|
19
|
+
end
|
20
|
+
|
21
|
+
# Override Object.id
|
22
|
+
def id
|
23
|
+
@id
|
24
|
+
end
|
25
|
+
|
26
|
+
def in_set(spec)
|
27
|
+
if @sets.respond_to?(:each)
|
28
|
+
@sets.each { |set| return true if set.spec == spec }
|
29
|
+
else
|
30
|
+
return true if @sets.spec == spec
|
31
|
+
end
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class TestModel < OAI::Provider::Model
|
37
|
+
include OAI::Provider
|
38
|
+
|
39
|
+
def initialize(limit = nil)
|
40
|
+
super(limit)
|
41
|
+
@records = []
|
42
|
+
@sets = []
|
43
|
+
@earliest = Time.now.utc.xmlschema
|
44
|
+
end
|
45
|
+
|
46
|
+
def earliest
|
47
|
+
(@records.min {|a,b| a.updated_at <=> b.updated_at }).updated_at.utc.xmlschema
|
48
|
+
end
|
49
|
+
|
50
|
+
def latest
|
51
|
+
@records.max {|a,b| a.updated_at <=> b.updated_at }.updated_at.utc.xmlschema
|
52
|
+
end
|
53
|
+
|
54
|
+
def sets
|
55
|
+
@sets
|
56
|
+
end
|
57
|
+
|
58
|
+
def find(selector, opts={})
|
59
|
+
return nil unless selector
|
60
|
+
|
61
|
+
case selector
|
62
|
+
when :all
|
63
|
+
if opts[:resumption_token]
|
64
|
+
raise OAI::ResumptionTokenException.new unless @limit
|
65
|
+
begin
|
66
|
+
token = ResumptionToken.parse(opts[:resumption_token])
|
67
|
+
|
68
|
+
if token.last < @groups.size - 1
|
69
|
+
PartialResult.new(@groups[token.last], token.next(token.last + 1))
|
70
|
+
else
|
71
|
+
@groups[token.last]
|
72
|
+
end
|
73
|
+
rescue
|
74
|
+
raise OAI::ResumptionTokenException.new
|
75
|
+
end
|
76
|
+
else
|
77
|
+
records = @records.select do |rec|
|
78
|
+
((opts[:set].nil? || rec.in_set(opts[:set])) &&
|
79
|
+
(opts[:from].nil? || rec.updated_at >= opts[:from]) &&
|
80
|
+
(opts[:until].nil? || rec.updated_at <= opts[:until]))
|
81
|
+
#else
|
82
|
+
# ((opts[:set].nil? || rec.in_set(opts[:set])) &&
|
83
|
+
# (opts[:from].nil? || rec.updated_at >= opts[:from]) &&
|
84
|
+
# (opts[:until].nil? || rec.updated_at <= opts[:until]))
|
85
|
+
#end
|
86
|
+
end
|
87
|
+
|
88
|
+
if @limit && records.size > @limit
|
89
|
+
@groups = generate_chunks(records, @limit)
|
90
|
+
return PartialResult.new(@groups[0],
|
91
|
+
ResumptionToken.new(opts.merge({:last => 1})))
|
92
|
+
end
|
93
|
+
return records
|
94
|
+
end
|
95
|
+
else
|
96
|
+
begin
|
97
|
+
@records.each do |record|
|
98
|
+
return record if record.id.to_s == selector
|
99
|
+
end
|
100
|
+
rescue
|
101
|
+
end
|
102
|
+
nil
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def generate_chunks(records, limit)
|
107
|
+
groups = []
|
108
|
+
records.each_slice(limit) do |group|
|
109
|
+
groups << group
|
110
|
+
end
|
111
|
+
groups
|
112
|
+
end
|
113
|
+
|
114
|
+
def generate_records(number, timestamp = Time.now.utc.xmlschema, sets = [], deleted = false)
|
115
|
+
@earliest = timestamp.dup if @earliest.nil? || timestamp.to_s < @earliest
|
116
|
+
|
117
|
+
# Add any sets we don't already have
|
118
|
+
sets = [sets] unless sets.respond_to?(:each)
|
119
|
+
sets.each do |set|
|
120
|
+
@sets << set unless @sets.include?(set)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Generate some records
|
124
|
+
number.times do |id|
|
125
|
+
rec = Record.new(@records.size, "title_#{id}", "creator_#{id}", "tag_#{id}")
|
126
|
+
rec.updated_at = timestamp.utc
|
127
|
+
rec.sets = sets
|
128
|
+
rec.deleted = deleted
|
129
|
+
@records << rec
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
class SimpleModel < TestModel
|
136
|
+
|
137
|
+
def initialize
|
138
|
+
super
|
139
|
+
# Create a couple of sets
|
140
|
+
set_one = OAI::Set.new()
|
141
|
+
set_one.name = "Test Set One"
|
142
|
+
set_one.spec = "A"
|
143
|
+
set_one.description = "This is test set one."
|
144
|
+
|
145
|
+
set_two = OAI::Set.new()
|
146
|
+
set_two.name = "Test Set Two"
|
147
|
+
set_two.spec = "A:B"
|
148
|
+
set_two.description = "This is test set two."
|
149
|
+
|
150
|
+
generate_records(5, Time.parse("2002-10-5"), set_one)
|
151
|
+
generate_records(1, Time.parse("2002-11-5"), [set_two], true)
|
152
|
+
generate_records(4, Time.parse("2002-11-5"), [set_two])
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
class BigModel < TestModel
|
158
|
+
|
159
|
+
def initialize(limit = nil)
|
160
|
+
super(limit)
|
161
|
+
generate_records(100, Time.parse("October 2 2000"))
|
162
|
+
generate_records(100, Time.parse("November 2 2000"))
|
163
|
+
generate_records(100, Time.parse("December 2 2000"))
|
164
|
+
generate_records(100, Time.parse("January 2 2001"))
|
165
|
+
generate_records(100, Time.parse("February 2 2001"))
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
|
170
|
+
class MappedModel < TestModel
|
171
|
+
|
172
|
+
def initialize
|
173
|
+
super
|
174
|
+
set_one = OAI::Set.new()
|
175
|
+
set_one.name = "Test Set One"
|
176
|
+
set_one.spec = "A"
|
177
|
+
set_one.description = "This is test set one."
|
178
|
+
|
179
|
+
generate_records(5, Time.parse("dec 1 2006"), set_one)
|
180
|
+
end
|
181
|
+
|
182
|
+
def map_oai_dc
|
183
|
+
{:title => :creator, :creator => :titles, :subject => :tags}
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
class ComplexModel < TestModel
|
189
|
+
|
190
|
+
def initialize(limit = nil)
|
191
|
+
super(limit)
|
192
|
+
# Create a couple of sets
|
193
|
+
set_one = OAI::Set.new
|
194
|
+
set_one.name = "Set One"
|
195
|
+
set_one.spec = "One"
|
196
|
+
set_one.description = "This is test set one."
|
197
|
+
|
198
|
+
set_two = OAI::Set.new
|
199
|
+
set_two.name = "Set Two"
|
200
|
+
set_two.spec = "Two"
|
201
|
+
set_two.description = "This is test set two."
|
202
|
+
|
203
|
+
set_three = OAI::Set.new
|
204
|
+
set_three.name = "Set Three"
|
205
|
+
set_three.spec = "Three"
|
206
|
+
set_three.description = "This is test set three."
|
207
|
+
|
208
|
+
set_four = OAI::Set.new
|
209
|
+
set_four.name = "Set Four"
|
210
|
+
set_four.spec = "Four"
|
211
|
+
set_four.description = "This is test set four."
|
212
|
+
|
213
|
+
set_one_two = OAI::Set.new
|
214
|
+
set_one_two.name = "Set One and Two"
|
215
|
+
set_one_two.spec = "One:Two"
|
216
|
+
set_one_two.description = "This is combination set of One and Two."
|
217
|
+
|
218
|
+
set_three_four = OAI::Set.new
|
219
|
+
set_three_four.name = "Set Three and Four"
|
220
|
+
set_three_four.spec = "Three:Four"
|
221
|
+
set_three_four.description = "This is combination set of Three and Four."
|
222
|
+
|
223
|
+
generate_records(250, Time.parse("May 2 1998"), [set_one, set_one_two])
|
224
|
+
generate_records(50, Time.parse("June 2 1998"), [set_one, set_one_two], true)
|
225
|
+
generate_records(50, Time.parse("October 10 1998"), [set_three, set_three_four], true)
|
226
|
+
generate_records(250, Time.parse("July 2 2002"), [set_two, set_one_two])
|
227
|
+
|
228
|
+
generate_records(250, Time.parse("September 15 2004"), [set_three, set_three_four])
|
229
|
+
generate_records(50, Time.parse("October 10 2004"), [set_three, set_three_four], true)
|
230
|
+
generate_records(250, Time.parse("December 25 2005"), [set_four, set_three_four])
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ProviderExceptions < Test::Unit::TestCase
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@provider = ComplexProvider.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_resumption_token_exception
|
11
|
+
assert_raise(OAI::ResumptionTokenException) do
|
12
|
+
@provider.list_records(:resumption_token => 'aaadddd:1000')
|
13
|
+
end
|
14
|
+
assert_raise(OAI::ResumptionTokenException) do
|
15
|
+
@provider.list_records(:resumption_token => 'oai_dc:1000')
|
16
|
+
end
|
17
|
+
assert_raise(OAI::ResumptionTokenException) do
|
18
|
+
@provider.list_identifiers(:resumption_token => '..::!:.:!:')
|
19
|
+
end
|
20
|
+
assert_raise(OAI::ResumptionTokenException) do
|
21
|
+
@provider.list_identifiers(:resumption_token => '\:\\:\/$%^&*!@#!:1')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_bad_verb_raises_exception
|
26
|
+
assert @provider.process_request(:verb => 'BadVerb') =~ /badVerb/
|
27
|
+
assert @provider.process_request(:verb => '\a$#^%!@') =~ /badVerb/
|
28
|
+
assert @provider.process_request(:verb => 'identity') =~ /badVerb/
|
29
|
+
assert @provider.process_request(:verb => '!!\\$\$\.+') =~ /badVerb/
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_bad_format_raises_exception
|
33
|
+
assert_raise(OAI::FormatException) do
|
34
|
+
@provider.get_record(:identifier => 'oai:test/1', :metadataPrefix => 'html')
|
35
|
+
end
|
36
|
+
assert_raise(OAI::FormatException) do
|
37
|
+
@provider.list_identifiers(:metadataPrefix => 'fjdsklfj')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_bad_id_raises_exception
|
42
|
+
assert_raise(OAI::IdException) do
|
43
|
+
@provider.get_record(:identifier => 'oai:test/5000', :metadataPrefix => 'oai_dc')
|
44
|
+
end
|
45
|
+
assert_raise(OAI::IdException) do
|
46
|
+
@provider.get_record(:identifier => 'oai:test/-1', :metadataPrefix => 'oai_dc')
|
47
|
+
end
|
48
|
+
assert_raise(OAI::IdException) do
|
49
|
+
@provider.get_record(:identifier => 'oai:test/one', :metadataPrefix => 'oai_dc')
|
50
|
+
end
|
51
|
+
assert_raise(OAI::IdException) do
|
52
|
+
@provider.get_record(:identifier => 'oai:test/\\$1\1!', :metadataPrefix => 'oai_dc')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_no_records_match_dates_that_are_out_of_range
|
57
|
+
assert_raise(OAI::NoMatchException) do
|
58
|
+
@provider.list_records(:from => Time.parse("November 2 2000"),
|
59
|
+
:until => Time.parse("November 1 2000"),
|
60
|
+
:metadataPrefix => 'oai_dc')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_bad_datespecs_raise_exception
|
65
|
+
assert_raise(OAI::ArgumentException) do
|
66
|
+
@provider.list_records( :from => "iamnotadate",
|
67
|
+
:until => "2005-06-05T12:20:40Z",
|
68
|
+
:metadataPrefix => 'oai_dc' )
|
69
|
+
end
|
70
|
+
assert_raise(OAI::ArgumentException) do
|
71
|
+
@provider.list_records( :from => "2005-06-05T12:20:40Z",
|
72
|
+
:until => "iamnotadate",
|
73
|
+
:metadataPrefix => 'oai_dc' )
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_extra_parameter_for_identify_raises_correct_exception
|
78
|
+
assert_raise(OAI::ArgumentException) do
|
79
|
+
@provider.identify( :metadataPrefix => 'oai_dc' )
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_different_granularities_raises_exception
|
84
|
+
assert_raise(OAI::ArgumentException) do
|
85
|
+
@provider.list_records( :from => "2000-01-01",
|
86
|
+
:until => "2007-06-05T12:00:00Z",
|
87
|
+
:metadataPrefix => 'oai_dc'
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_no_records_match_bad_set
|
93
|
+
assert_raise(OAI::NoMatchException) { @provider.list_records(:set => 'unknown', :metadataPrefix => 'oai_dc') }
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ResumptionTokenFunctionalTest < Test::Unit::TestCase
|
4
|
+
include REXML
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@provider = ComplexProvider.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_resumption_tokens
|
11
|
+
assert_nothing_raised { Document.new(@provider.list_records(:metadataPrefix => 'oai_dc')) }
|
12
|
+
doc = Document.new(@provider.list_records(:metadataPrefix => 'oai_dc'))
|
13
|
+
assert_not_nil doc.elements["/OAI-PMH/ListRecords/resumptionToken"]
|
14
|
+
assert_equal 101, doc.elements["/OAI-PMH/ListRecords"].to_a.size
|
15
|
+
token = doc.elements["/OAI-PMH/ListRecords/resumptionToken"].text
|
16
|
+
doc = Document.new(@provider.list_records(:resumption_token => token))
|
17
|
+
assert_not_nil doc.elements["/OAI-PMH/ListRecords/resumptionToken"]
|
18
|
+
assert_equal 101, doc.elements["/OAI-PMH/ListRecords"].to_a.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_from_and_until_with_resumption_tokens
|
22
|
+
# Should return 300 records broken into 3 groups of 100.
|
23
|
+
assert_nothing_raised { Document.new(@provider.list_records(:metadataPrefix => 'oai_dc')) }
|
24
|
+
doc = Document.new(
|
25
|
+
@provider.list_records(
|
26
|
+
:from => Time.parse("September 1 2004"),
|
27
|
+
:until => Time.parse("November 30 2004"),
|
28
|
+
:metadataPrefix => 'oai_dc')
|
29
|
+
)
|
30
|
+
assert_equal 101, doc.elements["/OAI-PMH/ListRecords"].to_a.size
|
31
|
+
token = doc.elements["/OAI-PMH/ListRecords/resumptionToken"].text
|
32
|
+
|
33
|
+
doc = Document.new(@provider.list_records(:resumption_token => token))
|
34
|
+
assert_not_nil doc.elements["/OAI-PMH/ListRecords/resumptionToken"]
|
35
|
+
assert_equal 101, doc.elements["/OAI-PMH/ListRecords"].to_a.size
|
36
|
+
token = doc.elements["/OAI-PMH/ListRecords/resumptionToken"].text
|
37
|
+
|
38
|
+
doc = Document.new(@provider.list_records(:resumption_token => token))
|
39
|
+
assert_nil doc.elements["/OAI-PMH/ListRecords/resumptionToken"]
|
40
|
+
assert_equal 100, doc.elements["/OAI-PMH/ListRecords"].to_a.size
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class OaiTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@mapped_provider = MappedProvider.new
|
7
|
+
@big_provider = BigProvider.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_list_identifiers_for_correct_xml
|
11
|
+
doc = REXML::Document.new(@mapped_provider.list_identifiers(:metadataPrefix => 'oai_dc'))
|
12
|
+
assert_not_nil doc.elements['OAI-PMH/ListIdentifiers']
|
13
|
+
assert_not_nil doc.elements['OAI-PMH/ListIdentifiers/header']
|
14
|
+
assert_not_nil doc.elements['OAI-PMH/ListIdentifiers/header/identifier']
|
15
|
+
assert_not_nil doc.elements['OAI-PMH/ListIdentifiers/header/datestamp']
|
16
|
+
assert_not_nil doc.elements['OAI-PMH/ListIdentifiers/header/setSpec']
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_list_records_for_correct_xml
|
20
|
+
doc = REXML::Document.new(@mapped_provider.list_records(:metadataPrefix => 'oai_dc'))
|
21
|
+
assert_not_nil doc.elements['OAI-PMH/ListRecords/record/header']
|
22
|
+
assert_not_nil doc.elements['OAI-PMH/ListRecords/record/metadata']
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_mapped_source
|
26
|
+
assert_nothing_raised { REXML::Document.new(@mapped_provider.list_records(:metadataPrefix => 'oai_dc')) }
|
27
|
+
doc = REXML::Document.new(@mapped_provider.list_records(:metadataPrefix => 'oai_dc'))
|
28
|
+
assert_equal "title_0", doc.elements['OAI-PMH/ListRecords/record/metadata/oai_dc:dc/dc:creator'].text
|
29
|
+
assert_equal "creator_0", doc.elements['OAI-PMH/ListRecords/record/metadata/oai_dc:dc/dc:title'].text
|
30
|
+
assert_equal "tag_0", doc.elements['OAI-PMH/ListRecords/record/metadata/oai_dc:dc/dc:subject'].text
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_from
|
34
|
+
assert_nothing_raised { REXML::Document.new(@big_provider.list_records(:metadataPrefix => 'oai_dc')) }
|
35
|
+
doc = REXML::Document.new(
|
36
|
+
@big_provider.list_records(:from => Time.parse("February 1 2001"), :metadataPrefix => 'oai_dc')
|
37
|
+
)
|
38
|
+
assert_equal 100, doc.elements['OAI-PMH/ListRecords'].to_a.size
|
39
|
+
|
40
|
+
doc = REXML::Document.new(
|
41
|
+
@big_provider.list_records(:from => Time.parse("January 1 2001"), :metadataPrefix => 'oai_dc')
|
42
|
+
)
|
43
|
+
assert_equal 200, doc.elements['OAI-PMH/ListRecords'].to_a.size
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_until
|
47
|
+
assert_nothing_raised { REXML::Document.new(@big_provider.list_records(:metadataPrefix => 'oai_dc')) }
|
48
|
+
doc = REXML::Document.new(
|
49
|
+
@big_provider.list_records(:until => Time.parse("November 1 2000"), :metadataPrefix => 'oai_dc')
|
50
|
+
)
|
51
|
+
assert_equal 100, doc.elements['OAI-PMH/ListRecords'].to_a.size
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_from_and_until
|
55
|
+
assert_nothing_raised { REXML::Document.new(@big_provider.list_records(:metadataPrefix => 'oai_dc')) }
|
56
|
+
doc = REXML::Document.new(
|
57
|
+
@big_provider.list_records(:from => Time.parse("November 1 2000"),
|
58
|
+
:until => Time.parse("November 30 2000"),
|
59
|
+
:metadataPrefix => 'oai_dc')
|
60
|
+
)
|
61
|
+
assert_equal 100, doc.elements['OAI-PMH/ListRecords'].to_a.size
|
62
|
+
|
63
|
+
doc = REXML::Document.new(
|
64
|
+
@big_provider.list_records(:from => Time.parse("December 1 2000"),
|
65
|
+
:until => Time.parse("December 31 2000"),
|
66
|
+
:metadataPrefix => 'oai_dc')
|
67
|
+
)
|
68
|
+
assert_equal 100, doc.elements['OAI-PMH/ListRecords'].to_a.size
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ResumptionTokenTest < Test::Unit::TestCase
|
4
|
+
include REXML
|
5
|
+
include OAI::Provider
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@token = ResumptionToken.new(
|
9
|
+
:from => Time.utc(2005,"jan",1,17,0,0),
|
10
|
+
:until => Time.utc(2005,"jan",31,17,0,0),
|
11
|
+
:set => "A",
|
12
|
+
:metadata_prefix => "oai_dc",
|
13
|
+
:last => 1
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_resumption_token_options_encoding
|
18
|
+
assert_equal "oai_dc.s(A).f(2005-01-01T17:00:00Z).u(2005-01-31T17:00:00Z)",
|
19
|
+
@token.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_resumption_token_next_method
|
23
|
+
assert_equal 100, @token.next(100).last
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_resumption_token_to_condition_hash
|
27
|
+
hash = @token.to_conditions_hash
|
28
|
+
assert_equal @token.from, hash[:from]
|
29
|
+
assert_equal @token.until, hash[:until]
|
30
|
+
assert_equal @token.set, hash[:set]
|
31
|
+
assert_equal @token.prefix, hash[:metadata_prefix]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_resumption_token_parsing
|
35
|
+
new_token = ResumptionToken.parse(
|
36
|
+
"oai_dc.s(A).f(2005-01-01T17:00:00Z).u(2005-01-31T17:00:00Z):1"
|
37
|
+
)
|
38
|
+
assert_equal @token, new_token
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_resumption_token_to_xml
|
42
|
+
doc = REXML::Document.new(@token.to_xml)
|
43
|
+
assert_equal "#{@token.to_s}:#{@token.last}", doc.elements['/resumptionToken'].text
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|