bento_search 1.5.0 → 2.0.0.rc1

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 (61) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +27 -24
  3. data/Rakefile +30 -11
  4. data/app/assets/javascripts/bento_search/ajax_load.js +54 -22
  5. data/app/controllers/bento_search/search_controller.rb +31 -30
  6. data/app/helpers/bento_search_helper.rb +72 -74
  7. data/app/models/bento_search/concurrent_searcher.rb +136 -0
  8. data/app/models/bento_search/result_item.rb +15 -12
  9. data/app/models/bento_search/results/serialization.rb +22 -13
  10. data/app/models/bento_search/search_engine.rb +170 -140
  11. data/app/search_engines/bento_search/doaj_articles_engine.rb +20 -20
  12. data/app/search_engines/bento_search/ebsco_host_engine.rb +3 -3
  13. data/app/search_engines/bento_search/eds_engine.rb +326 -206
  14. data/app/search_engines/bento_search/google_books_engine.rb +2 -2
  15. data/app/search_engines/bento_search/scopus_engine.rb +87 -87
  16. data/app/search_engines/bento_search/summon_engine.rb +1 -1
  17. data/app/views/bento_search/_ajax_loading.html.erb +17 -0
  18. data/app/views/bento_search/_item_title.html.erb +2 -4
  19. data/app/views/bento_search/_link.html.erb +3 -3
  20. data/lib/bento_search.rb +24 -9
  21. data/lib/bento_search/engine.rb +2 -0
  22. data/lib/bento_search/version.rb +1 -1
  23. data/lib/generators/bento_search/install/ajax_load_js_generator.rb +15 -0
  24. data/test/decorator/standard_decorator_test.rb +30 -30
  25. data/test/dummy/app/assets/config/manifest.js +4 -0
  26. data/test/dummy/config/application.rb +7 -0
  27. data/test/dummy/config/boot.rb +4 -9
  28. data/test/dummy/config/environments/development.rb +2 -0
  29. data/test/dummy/config/environments/production.rb +7 -1
  30. data/test/dummy/config/environments/test.rb +10 -3
  31. data/test/functional/bento_search/search_controller_test.rb +68 -58
  32. data/test/helper/bento_search_helper_test.rb +103 -103
  33. data/test/search_engines/doaj_articles_engine_test.rb +9 -9
  34. data/test/search_engines/eds_engine_test.rb +91 -59
  35. data/test/search_engines/google_site_search_test.rb +48 -48
  36. data/test/search_engines/scopus_engine_test.rb +51 -51
  37. data/test/search_engines/search_engine_base_test.rb +108 -86
  38. data/test/search_engines/search_engine_test.rb +68 -56
  39. data/test/support/atom.xsd.xml +3 -3
  40. data/test/support/xml.xsd +117 -0
  41. data/test/test_helper.rb +23 -12
  42. data/test/unit/concurrent_searcher_test.rb +75 -0
  43. data/test/unit/pagination_test.rb +12 -12
  44. data/test/vcr_cassettes/eds/FullText_CustomLink.yml +198 -0
  45. data/test/vcr_cassettes/eds/basic_search_smoke_test.yml +1036 -1729
  46. data/test/vcr_cassettes/eds/catalog_ebook_query.yml +218 -0
  47. data/test/vcr_cassettes/eds/catalog_query.yml +255 -0
  48. data/test/vcr_cassettes/eds/get_auth_token.yml +11 -44
  49. data/test/vcr_cassettes/eds/get_auth_token_failure.yml +10 -7
  50. data/test/vcr_cassettes/eds/get_with_auth.yml +144 -153
  51. data/test/vcr_cassettes/eds/get_with_auth_recovers_from_bad_auth.yml +167 -223
  52. data/test/view/atom_results_test.rb +94 -94
  53. metadata +36 -46
  54. data/app/assets/javascripts/bento_search.js +0 -3
  55. data/app/item_decorators/bento_search/ebscohost/conditional_openurl_main_link.rb +0 -36
  56. data/app/item_decorators/bento_search/only_premade_openurl.rb +0 -20
  57. data/app/item_decorators/bento_search/openurl_add_other_link.rb +0 -39
  58. data/app/item_decorators/bento_search/openurl_main_link.rb +0 -34
  59. data/app/models/bento_search/multi_searcher.rb +0 -131
  60. data/test/dummy/config/initializers/secret_token.rb +0 -8
  61. data/test/unit/multi_searcher_test.rb +0 -49
@@ -1,246 +1,246 @@
1
1
  # encoding: UTF-8
2
+ require 'nokogiri'
2
3
 
3
4
  require 'test_helper'
4
5
 
5
6
  class BentoSearchHelperTest < ActionView::TestCase
6
7
  include BentoSearchHelper
7
-
8
+
8
9
  MockEngine = BentoSearch::MockEngine
9
-
10
+
10
11
  def teardown
11
12
  BentoSearch.reset_engine_registrations!
12
13
  end
13
-
14
+
14
15
  def setup
15
16
  # Make routing work
16
- @routes = Rails.application.routes
17
-
17
+ @routes = Rails.application.routes
18
+
18
19
  end
19
-
20
+
20
21
  def test_with_results_arg
21
22
  results = MockEngine.new.search(:query => "foo")
22
- bento_search(results)
23
-
23
+ bento_search(results)
24
+
24
25
  assert_select("div.bento_item", 10)
25
26
  end
26
-
27
+
27
28
  def test_custom_partial
28
29
  results = MockEngine.new(:for_display => {:item_partial => "test_custom_item_partial"})
29
-
30
+
30
31
  bento_search(results)
31
-
32
+
32
33
  assert_select("p.custom_item_partial")
33
34
  end
34
-
35
+
35
36
  def test_with_failed_search
36
37
  results = BentoSearch::Results.new
37
38
  results.error = {:error => true}
38
-
39
+
39
40
  assert results.failed?
40
-
41
- response = HTML::Document.new(bento_search(results))
42
-
43
- assert (no_results_div = response.find(:attributes => {:class => "bento_search_error alert alert-error"})), "has search_error div"
44
-
45
- assert no_results_div.match(Regexp.new I18n.translate("bento_search.search_error")), "has error message"
46
41
 
47
- assert_nil response.find(:attributes => {:class => "bento_item"})
42
+ response = Nokogiri::HTML(bento_search(results))
43
+
44
+ assert (no_results_div = response.at_css(".bento_search_error.alert.alert-error")), "has search_error div"
45
+
46
+ assert no_results_div.text =~ Regexp.new(I18n.translate("bento_search.search_error")), "has error message"
47
+
48
+ assert_nil response.at_css(".bento_item")
48
49
  end
49
-
50
+
50
51
  def test_with_empty_results
51
52
  results = MockEngine.new(:num_results => 0).search(:query => "foo")
52
-
53
- response = HTML::Document.new(bento_search(results))
54
-
55
- assert (no_results_div = response.find(:attributes => {:class => "bento_search_no_results"})), "has no_results div"
56
- assert no_results_div.match(Regexp.new(I18n.translate("bento_search.no_results")))
57
53
 
58
-
59
- assert_nil response.find(:attributes => {:class => "bento_item"}), "has no results message"
54
+ response = Nokogiri::HTML(bento_search(results))
55
+
56
+ assert (no_results_div = response.at_css(".bento_search_no_results")), "has no_results div"
57
+ assert no_results_div.text =~ (Regexp.new(I18n.translate("bento_search.no_results")))
58
+
59
+ assert_nil response.at_css(".bento_item"), "has no results message"
60
60
  end
61
-
61
+
62
62
  def test_with_engine_arg
63
63
  engine = MockEngine.new
64
64
  bento_search(engine, :query => "QUERY")
65
-
65
+
66
66
  assert_select("div.bento_item", 10).each_with_index do |node, i|
67
67
  assert_select node, "*", /QUERY/
68
68
  assert_select node, "*", /#{i +1 }/
69
- end
69
+ end
70
70
  end
71
-
71
+
72
72
  def test_with_registered_id
73
73
  BentoSearch.register_engine("test_engine") do |conf|
74
74
  conf.engine = "MockEngine"
75
75
  end
76
-
76
+
77
77
  bento_search("test_engine", :query => "QUERY")
78
-
78
+
79
79
  assert_select("div.bento_item", 10).each_with_index do |node, i|
80
80
  assert_select node, "*", /QUERY/
81
- assert_select node, "*", /#{i +1 }/
82
- end
81
+ assert_select node, "*", /#{i +1 }/
82
+ end
83
83
  end
84
-
84
+
85
85
  def test_ajax_load_without_registration
86
86
  assert_raises(ArgumentError) { bento_search(MockEngine.new, :load => :ajax_auto) }
87
87
  end
88
-
89
88
 
90
-
91
- def test_ajax_load
89
+
90
+
91
+ def test_ajax_load
92
92
  BentoSearch.register_engine("test_engine") do |conf|
93
93
  conf.engine = "MockEngine"
94
94
  end
95
-
95
+
96
96
  results = bento_search("test_engine", :query => "QUERY", :load => :ajax_auto)
97
- results = HTML::Document.new(results)
98
-
99
-
100
- div = results.find(:attributes => {:class => "bento_search_ajax_wait"})
97
+ results = Nokogiri::HTML(results)
98
+
99
+
100
+ div = results.at_css(".bento_search_ajax_wait")
101
101
  assert div, "produces div.bento_search_ajax_wait"
102
+
102
103
  assert_equal "ajax_auto", div["data-bento-search-load"], "has data-bento-search-load attribute"
103
104
 
104
-
105
- assert_present div.attributes["data-bento-ajax-url"]
106
- url = URI.parse(div.attributes["data-bento-ajax-url"])
105
+ assert_present div["data-bento-ajax-url"]
106
+ url = URI.parse(div["data-bento-ajax-url"])
107
107
  assert_equal "/bento/test_engine", url.path
108
-
108
+
109
109
  query = CGI.parse(url.query.gsub("&amp;", "&")) # gsub weirdness of HTML::Tag
110
110
  assert_equal ["QUERY"], query["query"]
111
111
  assert_empty query["load"]
112
-
112
+
113
113
  # hidden loading msg
114
- loading_msg = div.find(:attributes => {:class => "bento_search_ajax_loading"})
114
+ loading_msg = div.at_css(".bento_search_ajax_loading")
115
115
  assert_present loading_msg, "bento_search_ajax_loading present"
116
116
  assert_match /display\:none/, loading_msg["style"], "loading has CSS style hidden"
117
-
118
- assert div.find(:tag => "noscript"), "has <noscript> tag"
119
-
120
- assert (img = loading_msg.find(:tag => "img")), "Has spinner gif"
121
- assert_equal I18n.translate("bento_search.ajax_loading"), img.attributes["alt"]
117
+
118
+ assert div.at_css("noscript"), "has <noscript> tag"
119
+
120
+ assert (img = loading_msg.at_css("img")), "Has spinner gif"
121
+ assert_equal I18n.translate("bento_search.ajax_loading"), img["alt"]
122
122
  end
123
-
123
+
124
124
  def test_ajax_triggered_load
125
125
  BentoSearch.register_engine("test_engine") do |conf|
126
126
  conf.engine = "MockEngine"
127
127
  end
128
-
128
+
129
129
  results = bento_search("test_engine", :query => "QUERY", :load => :ajax_triggered)
130
- results = HTML::Document.new(results)
130
+ results = Nokogiri::HTML(results)
131
131
 
132
- div = results.find(:attributes => {:class => "bento_search_ajax_wait"})
132
+ div = results.at_css(".bento_search_ajax_wait")
133
133
  assert div, "produces div.bento_search_ajax_wait"
134
134
  assert_equal "ajax_triggered", div["data-bento-search-load"], "has data-bento-search-load attribute"
135
135
 
136
136
  # hidden loading msg
137
- loading_msg = div.find(:attributes => {:class => "bento_search_ajax_loading"})
137
+ loading_msg = div.at_css(".bento_search_ajax_loading")
138
138
  assert_present loading_msg, "bento_search_ajax_loading present"
139
139
  assert_match /display\:none/, loading_msg["style"], "loading has CSS style hidden"
140
140
  end
141
-
142
-
141
+
142
+
143
143
  def test_sort_hash_for
144
144
  tested_keys = %w{title_asc date_desc relevance author_asc}
145
-
145
+
146
146
  sort_definitions = {}
147
147
  tested_keys.each {|k| sort_definitions[k] = {}}
148
-
148
+
149
149
  engine = MockEngine.new(:sort_definitions => sort_definitions)
150
150
 
151
151
  hash = bento_sort_hash_for(engine)
152
-
152
+
153
153
  assert_present hash
154
-
154
+
155
155
  tested_keys.each do |key|
156
156
  assert_equal key, hash[ I18n.translate(key, :scope => "bento_search.sort_keys") ]
157
- end
157
+ end
158
158
  end
159
-
159
+
160
160
  def test_sort_hash_for_no_i18n
161
- # If there's no 18n key available, use reasonable humanized approximation
162
-
161
+ # If there's no 18n key available, use reasonable humanized approximation
162
+
163
163
  engine = MockEngine.new(:sort_definitions => {"no_key_test" => {}})
164
-
164
+
165
165
  hash = bento_sort_hash_for(engine)
166
-
166
+
167
167
  assert_present hash
168
-
168
+
169
169
  key = hash.key("no_key_test")
170
-
170
+
171
171
  assert_no_match /translation missing/, key
172
-
172
+
173
173
  assert_equal "No Key Test", key
174
174
  end
175
-
175
+
176
176
  def test_field_hash_for
177
177
  # generic
178
178
  hash = bento_field_hash_for(nil)
179
-
179
+
180
180
  assert_equal I18n.t("bento_search.search_fields").invert, hash
181
-
181
+
182
182
  # specific engine
183
183
  engine = MockEngine.new(:search_field_definitions => {
184
184
  :mytitle => {:semantic => :title},
185
185
  :myauthor => {:semantic => :author},
186
186
  :myissn => {:semantic => :issn},
187
- :mycustom => {}
188
- })
187
+ :mycustom => {}
188
+ })
189
189
  hash = bento_field_hash_for(engine)
190
190
  expected = { I18n.t("bento_search.search_fields.title") => 'title',
191
191
  I18n.t("bento_search.search_fields.author") => 'author',
192
- I18n.t("bento_search.search_fields.issn") => 'issn',
192
+ I18n.t("bento_search.search_fields.issn") => 'issn',
193
193
  }
194
194
  assert_equal expected, hash
195
-
195
+
196
196
  # only
197
197
  hash = bento_field_hash_for(engine, :only => :author)
198
198
  assert_equal( {"Author" => "author"}, hash )
199
199
  hash = bento_field_hash_for(engine, :only => ["author", "title"])
200
200
  assert_equal( {"Title" => "title", "Author" => "author"}, hash )
201
-
201
+
202
202
  # except
203
-
204
-
203
+
204
+
205
205
  end
206
-
206
+
207
207
  def test_bento_decorate
208
208
  item = BentoSearch::ResultItem.new(:title => "foo")
209
-
209
+
210
210
  decorated = bento_decorate(item)
211
-
211
+
212
212
  assert_kind_of BentoSearch::StandardDecorator, decorated
213
-
213
+
214
214
  assert_equal "foo", decorated.title
215
-
216
- assert decorated.send("_h").respond_to?(:url_for), "has ActionView helpers available internally"
215
+
216
+ assert decorated.send("_h").respond_to?(:url_for), "has ActionView helpers available internally"
217
217
  end
218
-
218
+
219
219
  def test_bento_decorate_with_yield
220
220
  item = BentoSearch::ResultItem.new(:title => "foo")
221
-
221
+
222
222
  got_here = false
223
-
223
+
224
224
  bento_decorate(item) do |decorated|
225
225
  got_here = true
226
226
  assert_equal "foo", decorated.title
227
227
  end
228
-
228
+
229
229
  assert got_here, "Yielded block is called"
230
-
230
+
231
231
  end
232
-
232
+
233
233
  class SomeDecorator < BentoSearch::StandardDecorator ; end
234
-
234
+
235
235
  def test_bento_decorate_with_custom_decorator
236
236
  item = BentoSearch::ResultItem.new(:title => "foo", :decorator => "BentoSearchHelperTest::SomeDecorator")
237
-
237
+
238
238
  decorated = bento_decorate(item)
239
-
239
+
240
240
  assert_kind_of BentoSearchHelperTest::SomeDecorator, decorated
241
241
  end
242
242
 
243
-
244
243
 
245
-
244
+
245
+
246
246
  end
@@ -5,7 +5,7 @@ require 'cgi'
5
5
  class DoajArticlesEngineTest < ActiveSupport::TestCase
6
6
  extend TestWithCassette
7
7
 
8
- def setup
8
+ def setup
9
9
  @engine = BentoSearch::DoajArticlesEngine.new
10
10
  # tell it not to send our bad API key
11
11
  end
@@ -13,15 +13,15 @@ class DoajArticlesEngineTest < ActiveSupport::TestCase
13
13
  test_with_cassette("basic search", :doaj_articles) do
14
14
  results = @engine.search("Breast cancer patients with lobular cancer more commonly have a father than a mother diagnosed with cancer")
15
15
 
16
- assert_kind_of BentoSearch::Results, results
16
+ assert_kind_of BentoSearch::Results, results
17
17
  assert ! results.failed?
18
18
 
19
19
  assert_not_nil results.total_items
20
20
  assert_equal 0, results.start
21
21
  assert_equal 10, results.per_page
22
-
22
+
23
23
  assert_not_empty results
24
-
24
+
25
25
  first = results.first
26
26
 
27
27
  assert_present first.unique_id
@@ -52,11 +52,11 @@ class DoajArticlesEngineTest < ActiveSupport::TestCase
52
52
 
53
53
  test_with_cassette("pagination", :doaj_articles) do
54
54
  results = @engine.search("cancer", :per_page => 20, :page => 3)
55
-
55
+
56
56
  assert ! results.failed?
57
-
57
+
58
58
  assert_equal 20, results.length
59
-
59
+
60
60
  assert_equal 20, results.size
61
61
  assert_equal 40, results.start
62
62
  assert_equal 20, results.per_page
@@ -70,7 +70,7 @@ class DoajArticlesEngineTest < ActiveSupport::TestCase
70
70
  assert results.failed?
71
71
  assert_kind_of Hash, results.error
72
72
  assert_present results.error[:message]
73
- assert_present results.error[:status]
73
+ assert_present results.error[:status]
74
74
  end
75
75
 
76
76
  test_with_cassette("live #get(identifier) round trip", :doaj_articles) do
@@ -197,4 +197,4 @@ class DoajArticlesEngineTest < ActiveSupport::TestCase
197
197
  assert_equal ["article.created_date:desc"], query["sort"]
198
198
  end
199
199
 
200
- end
200
+ end
@@ -2,12 +2,14 @@ require 'test_helper'
2
2
 
3
3
  class EdsEngineTest < ActiveSupport::TestCase
4
4
  extend TestWithCassette
5
-
5
+
6
6
  @@user_id = (ENV['EDS_USER_ID'] || 'DUMMY_USER_ID')
7
7
  @@password = (ENV['EDS_PASSWORD'] || 'DUMMY_PWD')
8
- @@profile = (ENV['EDS_PROFILE'] || 'edsapi')
9
-
10
-
8
+ @@profile = (ENV['EDS_PROFILE'] || 'wsapi')
9
+ # something where the first hit will be from catalog for the profile above
10
+ @@catalog_result_query = (ENV['EDS_CATALOG_RESULT_QUERY'] || 'New York exposed the gilded age police scandal that launched the progressive era Daniel Czitrom')
11
+ @@catalog_ebook_result_query = (ENV['EDS_CATALOG_EBOOK_RESULT_QUERY'] || 'Stakeholder forum on federal wetlands mitigation environmental law institute')
12
+ @@catalog_custom_result_query = (ENV['EDS_CATALOG_CUSTOM_RESULT_QUERY'] || 'Drafting New York Civil-Litigation Documents Part XXIV Summary-Judgment Motions Continued')
11
13
  VCR.configure do |c|
12
14
  c.filter_sensitive_data("DUMMY_USER_ID", :eds) { @@user_id }
13
15
  c.filter_sensitive_data("DUMMY_PWD", :eds) { @@password }
@@ -16,140 +18,170 @@ class EdsEngineTest < ActiveSupport::TestCase
16
18
  def setup
17
19
  # Class-level remembered auth token messes up our VCR-recording,
18
20
  # since one test will try to use an auth token fetched by a different
19
- # test. For testing, blank out the cache before each test.
21
+ # test. For testing, blank out the cache before each test.
20
22
  BentoSearch::EdsEngine.remembered_auth = nil
21
23
 
22
24
  @config = {:user_id => @@user_id, :password => @@password, :profile => @@profile, :auth => true}
23
25
  @engine = BentoSearch::EdsEngine.new(@config)
24
26
  end
25
-
27
+
26
28
  test "construct simple search, with comma escaping" do
27
29
  url = @engine.construct_search_url(:query => "foo, bar,baz")
28
-
30
+
29
31
  query_params = CGI.parse( URI.parse(url).query )
30
32
 
31
33
  assert_equal ["all"], query_params["searchmode"]
32
-
34
+
33
35
  assert_equal ["detailed"], query_params["view"]
34
-
35
- assert_equal ["AND,foo bar baz"], query_params["query"]
36
+
37
+ assert_equal ["AND,foo bar baz"], query_params["query"]
36
38
  end
37
-
39
+
38
40
  test "only_source_types config" do
39
41
  engine = BentoSearch::EdsEngine.new( @config.merge(:only_source_types => [
40
42
  "Academic Journals", "Magazines"
41
43
  ]))
42
-
44
+
43
45
  url = engine.construct_search_url(:query => "cancer", :per_page => 10)
44
-
46
+
45
47
  query_params = CGI.parse( URI.parse(url).query )
46
-
48
+
47
49
  # should be
48
50
  # facetfilter=1,SourceType:Academic Journals,SourceType:Magazines
49
51
  # but with value query encoded
50
-
52
+
51
53
  assert_equal 1, query_params["facetfilter"].length
52
-
54
+
53
55
  facetfilter = query_params["facetfilter"].first
54
-
56
+
55
57
  parts = facetfilter.split(",")
56
-
58
+
57
59
  assert_equal 3, parts.length
58
-
60
+
59
61
  assert_equal "1", parts.first
60
-
62
+
61
63
  assert_includes parts, "SourceType:Academic Journals"
62
- assert_includes parts, "SourceType:Magazines"
64
+ assert_includes parts, "SourceType:Magazines"
63
65
  end
64
-
66
+
65
67
  def test_has_http_timeout_set
66
68
  assert_equal BentoSearch::EdsEngine::HttpTimeout, @engine.http_client.receive_timeout
67
69
  assert_equal BentoSearch::EdsEngine::HttpTimeout, @engine.http_client.send_timeout
68
70
  assert_equal BentoSearch::EdsEngine::HttpTimeout, @engine.http_client.connect_timeout
69
- end
71
+ end
72
+
70
73
 
71
-
72
74
  test_with_cassette("get_auth_token failure", :eds) do
73
75
  engine = BentoSearch::EdsEngine.new(:user_id => "bad", :password => "bad", :profile => "bad")
74
76
  exception = assert_raise(BentoSearch::EdsEngine::EdsCommException) do
75
77
  token = engine.get_auth_token
76
- end
77
-
78
+ end
79
+
78
80
  assert_present exception.http_status
79
- assert_present exception.http_body
81
+ assert_present exception.http_body
80
82
  end
81
-
83
+
82
84
  test_with_cassette("get_auth_token", :eds) do
83
85
  token = @engine.get_auth_token
84
-
86
+
85
87
  assert_present token
86
88
  end
87
-
89
+
88
90
  # No idea why VCR is having buggy problems with record and playback of this request
89
- # We'll emcompass it in the get_with_auth test
91
+ # We'll emcompass it in the get_with_auth test
90
92
  #
91
- #test_with_cassette("with_session", :eds, :match_requests_on => [:method, :uri, :headers, :body]) do
93
+ #test_with_cassette("with_session", :eds, :match_requests_on => [:method, :uri, :headers, :body]) do
92
94
  # @engine.with_session do |session_token|
93
95
  # assert_present session_token
94
- # end
96
+ # end
95
97
  #end
96
-
98
+
97
99
  test_with_cassette("get_with_auth", :eds) do
98
100
  @engine.with_session do |session_token|
99
101
  assert_present session_token
100
-
102
+
101
103
  # Coudln't get 'info' request to work even as a test, let's
102
- # try a simple search.
104
+ # try a simple search.
103
105
  url = "#{@engine.configuration.base_url}info"
104
106
  response = @engine.get_with_auth(url, session_token)
105
-
107
+
106
108
  assert_present response
107
109
  assert_kind_of Nokogiri::XML::Document, response
108
-
109
- assert_nil response.at_xpath("//ErrorNumber"), "no error report in result"
110
- end
110
+
111
+ assert_nil response.at_xpath("//ErrorNumber"), "no error report in result"
112
+ end
111
113
  end
112
-
114
+
113
115
  test_with_cassette("get_with_auth recovers from bad auth", :eds) do
114
116
  @engine.with_session do |session_token|
115
117
  BentoSearch::EdsEngine.remembered_auth = "BAD"
116
-
118
+
117
119
  url = "#{@engine.configuration.base_url}info"
118
120
  response = @engine.get_with_auth(url, session_token)
119
-
121
+
120
122
  assert_present response
121
123
  assert_kind_of Nokogiri::XML::Document, response
122
-
123
- assert_nil response.at_xpath("//ErrorNumber"), "no error report in result"
124
- end
125
-
124
+
125
+ assert_nil response.at_xpath("//ErrorNumber"), "no error report in result"
126
+ end
127
+
126
128
  BentoSearch::EdsEngine.remembered_auth = nil
127
129
  end
128
-
130
+
129
131
  test_with_cassette("basic search smoke test", :eds) do
130
- results = @engine.search("cancer")
131
-
132
+ results = @engine.search("cancer")
133
+
132
134
  assert_present results
133
-
135
+
134
136
  assert_present results.total_items
135
-
137
+
136
138
  first = results.first
137
139
 
138
140
  assert_present first.title
139
141
  assert first.title.html_safe? # yeah, for now we use EDS html
140
-
142
+
141
143
  assert_present first.abstract
142
144
  assert_present first.abstract.html_safe?
143
-
144
- assert_present first.custom_data["citation_blob"]
145
-
145
+
146
+ assert_present first.custom_data["citation_blob"]
147
+
148
+ assert_present first.source_title
149
+ assert_present first.issn
150
+ assert_present first.volume
151
+ assert_present first.issue
152
+ assert_present first.year
153
+ assert_present first.publication_date
154
+ assert_present first.start_page
155
+ assert_present first.end_page
156
+
157
+ assert_present first.doi
158
+
146
159
  assert_present first.format_str
147
-
160
+
148
161
  assert_present first.unique_id
149
162
  # EDS id is db name, colon, accession number
150
163
  assert_match /.+\:.+/, first.unique_id
151
164
  end
152
-
153
-
165
+
166
+ test_with_cassette("catalog query", :eds) do
167
+ results = @engine.search(@@catalog_result_query)
168
+
169
+ cat_result = results.first
170
+
171
+ assert_present cat_result.custom_data[:holdings]
172
+ assert cat_result.custom_data[:holdings].all? { |h| h.location.present? && h.call_number.present? }
173
+ end
174
+
175
+ test_with_cassette("catalog ebook query", :eds) do
176
+ result = @engine.search(@@catalog_ebook_result_query).first
177
+
178
+ assert_present result.other_links
179
+ end
180
+
181
+ test_with_cassette("FullText CustomLink", :eds) do
182
+ result = @engine.search(@@catalog_custom_result_query).first
183
+ assert_present result
184
+ assert result.other_links.any? { |r| r.label.present? && r.label != "Link" && r.url.present? && URI::regexp =~ r.url && r.rel == "alternate"}
185
+ end
154
186
  end
155
187