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.
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