oai_talia 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/README +81 -0
  2. data/Rakefile +127 -0
  3. data/bin/oai +68 -0
  4. data/examples/models/file_model.rb +63 -0
  5. data/examples/providers/dublin_core.rb +474 -0
  6. data/lib/oai/client/get_record.rb +15 -0
  7. data/lib/oai/client/header.rb +18 -0
  8. data/lib/oai/client/identify.rb +30 -0
  9. data/lib/oai/client/list_identifiers.rb +12 -0
  10. data/lib/oai/client/list_metadata_formats.rb +12 -0
  11. data/lib/oai/client/list_records.rb +21 -0
  12. data/lib/oai/client/list_sets.rb +19 -0
  13. data/lib/oai/client/metadata_format.rb +12 -0
  14. data/lib/oai/client/record.rb +26 -0
  15. data/lib/oai/client/response.rb +35 -0
  16. data/lib/oai/client.rb +301 -0
  17. data/lib/oai/constants.rb +34 -0
  18. data/lib/oai/exception.rb +75 -0
  19. data/lib/oai/harvester/config.rb +41 -0
  20. data/lib/oai/harvester/harvest.rb +150 -0
  21. data/lib/oai/harvester/logging.rb +70 -0
  22. data/lib/oai/harvester/mailer.rb +17 -0
  23. data/lib/oai/harvester/shell.rb +338 -0
  24. data/lib/oai/harvester.rb +39 -0
  25. data/lib/oai/provider/metadata_format/oai_dc.rb +29 -0
  26. data/lib/oai/provider/metadata_format/oai_europeana.rb +38 -0
  27. data/lib/oai/provider/metadata_format.rb +143 -0
  28. data/lib/oai/provider/model/activerecord_caching_wrapper.rb +134 -0
  29. data/lib/oai/provider/model/activerecord_wrapper.rb +139 -0
  30. data/lib/oai/provider/model.rb +74 -0
  31. data/lib/oai/provider/partial_result.rb +18 -0
  32. data/lib/oai/provider/response/error.rb +16 -0
  33. data/lib/oai/provider/response/get_record.rb +26 -0
  34. data/lib/oai/provider/response/identify.rb +25 -0
  35. data/lib/oai/provider/response/list_identifiers.rb +35 -0
  36. data/lib/oai/provider/response/list_metadata_formats.rb +34 -0
  37. data/lib/oai/provider/response/list_records.rb +34 -0
  38. data/lib/oai/provider/response/list_sets.rb +23 -0
  39. data/lib/oai/provider/response/record_response.rb +70 -0
  40. data/lib/oai/provider/response.rb +161 -0
  41. data/lib/oai/provider/resumption_token.rb +106 -0
  42. data/lib/oai/provider.rb +304 -0
  43. data/lib/oai/set.rb +29 -0
  44. data/lib/oai/xpath.rb +75 -0
  45. data/lib/oai.rb +8 -0
  46. data/lib/test.rb +25 -0
  47. data/test/activerecord_provider/config/connection.rb +5 -0
  48. data/test/activerecord_provider/config/database.yml +6 -0
  49. data/test/activerecord_provider/database/ar_migration.rb +59 -0
  50. data/test/activerecord_provider/database/oaipmhtest +0 -0
  51. data/test/activerecord_provider/fixtures/dc.yml +1501 -0
  52. data/test/activerecord_provider/helpers/providers.rb +44 -0
  53. data/test/activerecord_provider/helpers/set_provider.rb +36 -0
  54. data/test/activerecord_provider/models/dc_field.rb +7 -0
  55. data/test/activerecord_provider/models/dc_set.rb +6 -0
  56. data/test/activerecord_provider/models/oai_token.rb +3 -0
  57. data/test/activerecord_provider/tc_ar_provider.rb +113 -0
  58. data/test/activerecord_provider/tc_ar_sets_provider.rb +72 -0
  59. data/test/activerecord_provider/tc_caching_paging_provider.rb +55 -0
  60. data/test/activerecord_provider/tc_simple_paging_provider.rb +57 -0
  61. data/test/activerecord_provider/test_helper.rb +4 -0
  62. data/test/client/helpers/provider.rb +68 -0
  63. data/test/client/helpers/test_wrapper.rb +11 -0
  64. data/test/client/tc_exception.rb +36 -0
  65. data/test/client/tc_get_record.rb +37 -0
  66. data/test/client/tc_identify.rb +13 -0
  67. data/test/client/tc_libxml.rb +61 -0
  68. data/test/client/tc_list_identifiers.rb +52 -0
  69. data/test/client/tc_list_metadata_formats.rb +18 -0
  70. data/test/client/tc_list_records.rb +13 -0
  71. data/test/client/tc_list_sets.rb +19 -0
  72. data/test/client/tc_low_resolution_dates.rb +14 -0
  73. data/test/client/tc_utf8_escaping.rb +11 -0
  74. data/test/client/tc_xpath.rb +26 -0
  75. data/test/client/test_helper.rb +5 -0
  76. data/test/provider/models.rb +234 -0
  77. data/test/provider/tc_exceptions.rb +96 -0
  78. data/test/provider/tc_functional_tokens.rb +43 -0
  79. data/test/provider/tc_provider.rb +71 -0
  80. data/test/provider/tc_resumption_tokens.rb +46 -0
  81. data/test/provider/tc_simple_provider.rb +92 -0
  82. data/test/provider/test_helper.rb +36 -0
  83. data/test/test.xml +22 -0
  84. 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,5 @@
1
+ require 'oai'
2
+ require 'test/unit'
3
+
4
+ require File.dirname(__FILE__) + '/helpers/provider'
5
+ require File.dirname(__FILE__) + '/helpers/test_wrapper'
@@ -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