oai_talia 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- 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
|