bento_search 1.0.2 → 1.0.3

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 (32) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +92 -90
  3. data/app/item_decorators/bento_search/decorator_base.rb +9 -6
  4. data/app/item_decorators/bento_search/standard_decorator.rb +24 -0
  5. data/app/search_engines/bento_search/ebsco_host_engine.rb +180 -179
  6. data/app/search_engines/bento_search/journal_tocs_for_journal.rb +179 -0
  7. data/app/views/bento_search/_std_item.html.erb +4 -4
  8. data/lib/bento_search/version.rb +1 -1
  9. data/test/decorator/decorator_base_test.rb +11 -1
  10. data/test/decorator/standard_decorator_test.rb +21 -0
  11. data/test/dummy/log/development.log +2 -0
  12. data/test/dummy/log/test.log +22324 -0
  13. data/test/{unit → search_engines}/ebsco_host_engine_test.rb +148 -130
  14. data/test/{unit → search_engines}/eds_engine_test.rb +0 -0
  15. data/test/{unit → search_engines}/google_books_engine_test.rb +0 -0
  16. data/test/{unit → search_engines}/google_site_search_test.rb +0 -0
  17. data/test/search_engines/journal_tocs_for_journal_test.rb +93 -0
  18. data/test/{unit → search_engines}/primo_engine_test.rb +0 -0
  19. data/test/{unit → search_engines}/scopus_engine_test.rb +0 -0
  20. data/test/{unit → search_engines}/search_engine_base_test.rb +0 -0
  21. data/test/{unit → search_engines}/search_engine_test.rb +0 -0
  22. data/test/{unit → search_engines}/summon_engine_test.rb +0 -0
  23. data/test/{unit → search_engines}/worldcat_sru_dc_engine_test.rb +0 -0
  24. data/test/{unit → search_engines}/xerxes_engine_test.rb +0 -0
  25. data/test/vcr_cassettes/ebscohost/RILM_record_with_ISSN_in__jid__element.yml +210 -0
  26. data/test/vcr_cassettes/journal_tocs/empty_results_on_bad_ISSN.yml +49 -0
  27. data/test/vcr_cassettes/journal_tocs/error_on_bad_registered_email.yml +41 -0
  28. data/test/vcr_cassettes/journal_tocs/error_on_error_response.yml +51 -0
  29. data/test/vcr_cassettes/journal_tocs/fetch_xml_with_hits.yml +328 -0
  30. data/test/vcr_cassettes/journal_tocs/fills_out_metadata.yml +396 -0
  31. data/test/vcr_cassettes/journal_tocs/smoke_test.yml +328 -0
  32. metadata +62 -61
@@ -5,311 +5,329 @@ require 'uri'
5
5
 
6
6
  class EbscoHostEngineTest < ActiveSupport::TestCase
7
7
  extend TestWithCassette
8
-
8
+
9
9
  @@profile_id = (ENV['EBSCOHOST_PROFILE'] || 'DUMMY_PROFILE')
10
10
  @@profile_pwd = (ENV['EBSCOHOST_PWD'] || 'DUMMY_PWD')
11
11
  @@dbs_to_test = (ENV['EBSCOHOST_TEST_DBS'] || %w{a9h awn} )
12
-
12
+
13
13
  VCR.configure do |c|
14
14
  c.filter_sensitive_data("prof=DUMMY_PROFILE", :ebscohost) { "prof=#{@@profile_id}" }
15
15
  c.filter_sensitive_data("pwd=DUMMY_PWD", :ebscohost) { "pwd=#{@@profile_pwd}" }
16
16
  end
17
-
18
-
17
+
18
+
19
19
  def setup
20
20
  @config = {
21
21
  :profile_id => @@profile_id,
22
22
  :profile_password => @@profile_pwd,
23
23
  :databases => @@dbs_to_test
24
24
  }
25
-
26
- @engine = BentoSearch::EbscoHostEngine.new( @config )
25
+
26
+ @engine = BentoSearch::EbscoHostEngine.new( @config )
27
27
  end
28
-
29
-
28
+
29
+
30
30
  def test_url_construction
31
31
  url = @engine.query_url(:query => "cancer", :start => 10, :per_page => 5)
32
-
32
+
33
33
  assert_present url
34
-
34
+
35
35
  query_params = CGI.parse( URI.parse(url).query )
36
36
 
37
37
  assert_equal [@engine.configuration.profile_id], query_params["prof"]
38
38
  assert_equal [@engine.configuration.profile_password], query_params["pwd"]
39
-
39
+
40
40
  assert_equal ["cancer"], query_params["query"]
41
-
41
+
42
42
  assert_equal ["5"], query_params["numrec"]
43
43
  assert_equal ["11"], query_params["startrec"]
44
-
44
+
45
45
  # default sort relevance
46
46
  assert_equal ["relevance"], query_params["sort"]
47
-
47
+
48
48
  @engine.configuration.databases.each do |db|
49
49
  assert_include query_params["db"], db
50
- end
50
+ end
51
51
  end
52
-
52
+
53
53
  def test_date_sort_construction
54
54
  url = @engine.query_url(:query => "cancer", :sort => "date_desc")
55
-
55
+
56
56
  query_params = CGI.parse( URI.parse(url).query )
57
-
57
+
58
58
  assert_equal ["date"], query_params["sort"]
59
59
  end
60
-
60
+
61
61
  def test_fielded_construction
62
62
  url = @engine.query_url(:query => "cancer", :search_field => "SU")
63
-
63
+
64
64
  query_params = CGI.parse( URI.parse(url).query )
65
-
65
+
66
66
  assert_equal ["(SU cancer)"], query_params["query"]
67
67
  end
68
-
68
+
69
69
  def test_peer_review_limit_construction
70
70
  url = @engine.query_url(:query => "cancer", :search_field => "SU", :peer_reviewed_only => true)
71
-
71
+
72
72
  query_params = CGI.parse( URI.parse(url).query )
73
-
73
+
74
74
  assert_equal ["(SU cancer) AND (RV Y)"], query_params["query"]
75
75
  end
76
-
76
+
77
77
  def test_date_limit_construction
78
- url = @engine.query_url(:query => "cancer", :pubyear_start => "1980", :pubyear_end => "1989")
79
- query_params = CGI.parse( URI.parse(url).query )
80
-
78
+ url = @engine.query_url(:query => "cancer", :pubyear_start => "1980", :pubyear_end => "1989")
79
+ query_params = CGI.parse( URI.parse(url).query )
80
+
81
81
  assert_equal ["cancer AND (DT 1980-1989)"], query_params["query"]
82
-
82
+
83
83
  # just one
84
84
  url = @engine.query_url(:query => "cancer", :pubyear_start => "1980")
85
- query_params = CGI.parse( URI.parse(url).query )
86
-
87
- assert_equal ["cancer AND (DT 1980-)"], query_params["query"]
88
-
85
+ query_params = CGI.parse( URI.parse(url).query )
86
+
87
+ assert_equal ["cancer AND (DT 1980-)"], query_params["query"]
88
+
89
89
  end
90
-
90
+
91
91
  def test_per_search_databases_construction
92
92
  url = @engine.query_url(:query => "cancer", :databases => ["aaa", "bbb"])
93
-
93
+
94
94
  query_params = CGI.parse( URI.parse(url).query )
95
-
96
- assert_equal ["aaa", "bbb"].to_set, query_params["db"].to_set
95
+
96
+ assert_equal ["aaa", "bbb"].to_set, query_params["db"].to_set
97
97
  end
98
-
98
+
99
99
  def test_lookup_by_accession_number_construction
100
100
  url = @engine.query_url(:query => "123456", :search_field => "AN")
101
-
101
+
102
102
  query_params = CGI.parse( URI.parse(url).query )
103
-
103
+
104
104
  assert_equal ["(AN 123456)"], query_params["query"]
105
105
  end
106
-
107
-
106
+
107
+
108
108
  def test_prepare_query
109
109
  query = @engine.ebsco_query_prepare('one :. ; two "three four" and NOT OR five')
110
-
110
+
111
111
  assert_equal 'one AND two AND "three four" AND "and" AND "NOT" AND "OR" AND five', query
112
112
  end
113
-
113
+
114
114
  def test_removes_paren_literals
115
115
  url = @engine.query_url(:query => "cancer)", :sort => "date_desc")
116
-
116
+
117
117
  query_params = CGI.parse( URI.parse(url).query )
118
-
118
+
119
119
  assert_equal ["cancer "], query_params["query"]
120
120
  end
121
-
121
+
122
122
  def test_removes_question_marks
123
123
  # who knows why, ebsco doesn't like question marks even inside
124
- # quoted phrases, some special char to ebsco.
125
- url = @engine.query_url(:query => "cancer?", :sort => "date_desc")
126
- query_params = CGI.parse( URI.parse(url).query )
124
+ # quoted phrases, some special char to ebsco.
125
+ url = @engine.query_url(:query => "cancer?", :sort => "date_desc")
126
+ query_params = CGI.parse( URI.parse(url).query )
127
127
  assert_equal ["cancer "], query_params["query"]
128
-
128
+
129
129
  url = @engine.query_url(:query => '"cancer?"', :sort => "date_desc")
130
- query_params = CGI.parse( URI.parse(url).query )
130
+ query_params = CGI.parse( URI.parse(url).query )
131
131
  assert_equal ['"cancer "'], query_params["query"]
132
132
  end
133
-
133
+
134
+ def test_removes_brackets
135
+ # Ebsco don't like brackets either
136
+ url = @engine.query_url(:query => "[cancer]")
137
+ query_params = CGI.parse( URI.parse(url).query )
138
+ assert_equal [" cancer "], query_params["query"]
139
+ end
140
+
134
141
  def test_has_http_timeout_set
135
142
  assert_equal BentoSearch::EbscoHostEngine::HttpTimeout, @engine.http_client.receive_timeout
136
143
  assert_equal BentoSearch::EbscoHostEngine::HttpTimeout, @engine.http_client.send_timeout
137
144
  assert_equal BentoSearch::EbscoHostEngine::HttpTimeout, @engine.http_client.connect_timeout
138
- end
145
+ end
146
+
139
147
 
140
-
141
148
  test_with_cassette("live search smoke test", :ebscohost) do
142
-
149
+
143
150
  results = @engine.search(:query => "cancer")
144
-
151
+
145
152
  assert_present results
146
153
  assert ! results.failed?
147
-
154
+
148
155
  first = results.first
149
-
156
+
150
157
  assert_present first.title
151
- assert_present first.authors
158
+ assert_present first.authors
152
159
  assert_present first.year
153
-
160
+
154
161
  assert_present first.format
155
162
  assert_present first.format_str
156
-
163
+
157
164
  assert_present first.language_code
158
165
  assert_present first.language_str
159
-
166
+
160
167
  assert_present first.unique_id
161
- # db name, colon, accession number.
168
+ # db name, colon, accession number.
162
169
  assert_match /.+\:.+/, first.unique_id
163
170
  end
164
-
171
+
165
172
  test_with_cassette("get_info", :ebscohost) do
166
173
  xml = @engine.get_info
167
-
174
+
168
175
  assert_present xml
169
-
170
- assert_present xml.xpath("./info/dbInfo/db")
176
+
177
+ assert_present xml.xpath("./info/dbInfo/db")
171
178
  end
172
-
173
- test_with_cassette("error bad password", :ebscohost) do
179
+
180
+ test_with_cassette("error bad password", :ebscohost) do
174
181
  error_engine = BentoSearch::EbscoHostEngine.new(
175
182
  :profile_id => "bad",
176
183
  :profile_password => "bad",
177
184
  :databases => @@dbs_to_test
178
185
  )
179
-
180
- results = error_engine.search(:query => "cancer")
181
- assert results.failed?
186
+
187
+ results = error_engine.search(:query => "cancer")
188
+ assert results.failed?
182
189
  assert_present results.error[:error_info]
183
190
  end
184
-
185
-
191
+
192
+
186
193
  test_with_cassette("error bad db", :ebscohost) do
187
- error_engine = BentoSearch::EbscoHostEngine.new(
194
+ error_engine = BentoSearch::EbscoHostEngine.new(
188
195
  :profile_id => @@profile_id,
189
196
  :profile_password => @@profile_pwd,
190
197
  :databases => ["bad", "does_not_exist"]
191
- )
192
-
193
- results = error_engine.search(:query => "cancer")
194
- assert results.failed?
195
- assert_present results.error[:error_info]
196
-
198
+ )
199
+
200
+ results = error_engine.search(:query => "cancer")
201
+ assert results.failed?
202
+ assert_present results.error[:error_info]
203
+
197
204
  end
198
-
205
+
199
206
  test_with_cassette("fulltext info", :ebscohost) do
200
207
  # We count on SOME records from first 10 for this query having fulltext,
201
208
  # if you need to re-record VCR cassette and this query doesn't work
202
- # for that anymore, then pick a different query.
209
+ # for that anymore, then pick a different query.
203
210
  results = @engine.search("cancer")
204
-
211
+
205
212
  results_with_fulltext = results.find_all {|r| r.custom_data["fulltext_formats"] }
206
-
213
+
207
214
  assert_present results_with_fulltext
208
-
215
+
209
216
  results_with_fulltext.each do |record|
210
217
  array = record.custom_data["fulltext_formats"]
211
218
  # it's an array
212
219
  assert_kind_of Array, array
213
- # who's only legal values are P, T, and C, the EBSCO vocab for formats.
220
+ # who's only legal values are P, T, and C, the EBSCO vocab for formats.
214
221
  assert_equal array.length, array.find_all {|v| %w{P C T}.include?(v)}.length
215
-
222
+
216
223
  assert record.link_is_fulltext?, "#link_is_fulltext set"
217
- end
218
-
224
+ end
225
+
219
226
  end
220
-
221
- test_with_cassette("live book example", :ebscohost) do
227
+
228
+ test_with_cassette("live book example", :ebscohost) do
222
229
  # We keep adjusting the EBSCOHost heuristics for guessing format,
223
- # and causing regressions, this test guards against them.
224
-
230
+ # and causing regressions, this test guards against them.
231
+
225
232
  # This particular example from RILM is a book, but
226
- # is getting listed as a book chapter, sort of.
227
-
228
- engine = BentoSearch::EbscoHostEngine.new( @config.merge(:databases => ["rih"]) )
229
-
233
+ # is getting listed as a book chapter, sort of.
234
+
235
+ engine = BentoSearch::EbscoHostEngine.new( @config.merge(:databases => ["rih"]) )
236
+
230
237
  results = engine.search('"Funk: The music, the people, and the rhythm of the one"', :per_page => 1)
231
-
238
+
232
239
  result = results.first
233
-
240
+
234
241
  assert_equal "Book", result.format
235
242
  assert_equal "St. Martin's Press", result.publisher
236
243
  assert_equal "1996", result.year
237
-
244
+
238
245
  assert_blank result.source_title
239
246
  end
240
-
247
+
241
248
  test_with_cassette("live pathological book_item example", :ebscohost) do
242
249
  # this guy from RILM has really crappy metadata on EBSCO,
243
- # but we still want to detect it as a book_item, not a book.
244
-
250
+ # but we still want to detect it as a book_item, not a book.
251
+
245
252
  a = 'Heidegger and the management of the Haymarket Opera, 1713-1717'
246
-
253
+
247
254
  engine = BentoSearch::EbscoHostEngine.new( @config.merge(:databases => ["rih"]) )
248
255
  results = engine.search('"Heidegger and the management of the Haymarket Opera, 1713-1717"')
249
256
  result = results.first
250
-
257
+
251
258
  assert_equal :book_item, result.format
252
-
253
-
259
+
260
+
254
261
  # for reasons I can't figure out, weird encoding in the hyphen makes us
255
262
  # test start_with instead
256
263
  assert result.title.starts_with?("Heidegger and the management of the Haymarket Opera, 1713")
257
264
  assert result.source_title.starts_with?("Opera remade (1700")
258
265
  end
259
-
266
+
260
267
  test_with_cassette("dissertation example", :ebscohost) do
261
268
  # yeah, all the weird ones are from RILM
262
269
  engine = BentoSearch::EbscoHostEngine.new( @config.merge(:databases => ["rih"]) )
263
-
270
+
264
271
  results = engine.search('"Research into free jazz in France, 1960-1975"')
265
272
  result = results.first
266
-
273
+
267
274
  assert_equal "Research into free jazz in France, 1960-1975", result.title
268
- assert_equal :dissertation, result.format
275
+ assert_equal :dissertation, result.format
269
276
  end
270
-
277
+
271
278
  test_with_cassette("another dissertation", :ebscohost) do
272
279
  # yeah, all the weird edge cases that make good tests are from RILM, it's
273
- # got weird data.
274
-
280
+ # got weird data.
281
+
275
282
  engine = BentoSearch::EbscoHostEngine.new( @config.merge(:databases => ["rih"]) )
276
283
  results = engine.search('"Machine gun voices: Bandits, favelas, and utopia in Brazilian funk"')
277
284
  result = results.first
278
-
285
+
279
286
  assert_equal :dissertation, result.format
280
- assert_equal "Machine gun voices: Bandits, favelas, and utopia in Brazilian funk", result.title
287
+ assert_equal "Machine gun voices: Bandits, favelas, and utopia in Brazilian funk", result.title
281
288
  end
282
-
289
+
283
290
  test_with_cassette("live #get(identifier) round trip", :ebscohost) do
284
291
  results = @engine.search("cancer")
285
-
292
+
286
293
  assert (! results.failed?)
287
-
294
+
288
295
  item = @engine.get( results.first.unique_id )
289
-
296
+
290
297
  assert_not_nil item
291
298
  assert_kind_of BentoSearch::ResultItem, item
292
299
  end
293
-
300
+
294
301
  test_with_cassette("live get(id) with no results raises", :ebscohost) do
295
- assert_raise(BentoSearch::NotFound) do
302
+ assert_raise(BentoSearch::NotFound) do
296
303
  results = @engine.get("a9h:bar")
297
304
  end
298
305
  end
299
-
306
+
300
307
  test_with_cassette("live get(id) on bad db raises", :ebscohost) do
301
308
  assert_raise(Exception) do
302
309
  results = @engine.get("badbad:bar")
303
310
  end
304
311
  end
305
-
306
-
312
+
313
+
307
314
  test("illegal arg for get with id with no colon") do
308
315
  assert_raise ArgumentError do
309
316
  @engine.get("no_colon_in_here")
310
317
  end
311
318
  end
312
-
313
-
314
-
319
+
320
+ test_with_cassette("RILM record with ISSN in <jid> element", :ebscohost) do
321
+ engine = BentoSearch::EbscoHostEngine.new( @config.merge(:databases => ["rih"]) )
322
+ results = engine.search('"Schumann\'s Dichterliebe and early Romantic poetics: Fragmentation of desire"')
323
+
324
+ assert_present results
325
+
326
+ first = results.first
327
+
328
+ assert_present first.issn
329
+ end
330
+
331
+
332
+
315
333
  end