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.
- checksums.yaml +5 -5
- data/README.md +27 -24
- data/Rakefile +30 -11
- data/app/assets/javascripts/bento_search/ajax_load.js +54 -22
- data/app/controllers/bento_search/search_controller.rb +31 -30
- data/app/helpers/bento_search_helper.rb +72 -74
- data/app/models/bento_search/concurrent_searcher.rb +136 -0
- data/app/models/bento_search/result_item.rb +15 -12
- data/app/models/bento_search/results/serialization.rb +22 -13
- data/app/models/bento_search/search_engine.rb +170 -140
- data/app/search_engines/bento_search/doaj_articles_engine.rb +20 -20
- data/app/search_engines/bento_search/ebsco_host_engine.rb +3 -3
- data/app/search_engines/bento_search/eds_engine.rb +326 -206
- data/app/search_engines/bento_search/google_books_engine.rb +2 -2
- data/app/search_engines/bento_search/scopus_engine.rb +87 -87
- data/app/search_engines/bento_search/summon_engine.rb +1 -1
- data/app/views/bento_search/_ajax_loading.html.erb +17 -0
- data/app/views/bento_search/_item_title.html.erb +2 -4
- data/app/views/bento_search/_link.html.erb +3 -3
- data/lib/bento_search.rb +24 -9
- data/lib/bento_search/engine.rb +2 -0
- data/lib/bento_search/version.rb +1 -1
- data/lib/generators/bento_search/install/ajax_load_js_generator.rb +15 -0
- data/test/decorator/standard_decorator_test.rb +30 -30
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/config/application.rb +7 -0
- data/test/dummy/config/boot.rb +4 -9
- data/test/dummy/config/environments/development.rb +2 -0
- data/test/dummy/config/environments/production.rb +7 -1
- data/test/dummy/config/environments/test.rb +10 -3
- data/test/functional/bento_search/search_controller_test.rb +68 -58
- data/test/helper/bento_search_helper_test.rb +103 -103
- data/test/search_engines/doaj_articles_engine_test.rb +9 -9
- data/test/search_engines/eds_engine_test.rb +91 -59
- data/test/search_engines/google_site_search_test.rb +48 -48
- data/test/search_engines/scopus_engine_test.rb +51 -51
- data/test/search_engines/search_engine_base_test.rb +108 -86
- data/test/search_engines/search_engine_test.rb +68 -56
- data/test/support/atom.xsd.xml +3 -3
- data/test/support/xml.xsd +117 -0
- data/test/test_helper.rb +23 -12
- data/test/unit/concurrent_searcher_test.rb +75 -0
- data/test/unit/pagination_test.rb +12 -12
- data/test/vcr_cassettes/eds/FullText_CustomLink.yml +198 -0
- data/test/vcr_cassettes/eds/basic_search_smoke_test.yml +1036 -1729
- data/test/vcr_cassettes/eds/catalog_ebook_query.yml +218 -0
- data/test/vcr_cassettes/eds/catalog_query.yml +255 -0
- data/test/vcr_cassettes/eds/get_auth_token.yml +11 -44
- data/test/vcr_cassettes/eds/get_auth_token_failure.yml +10 -7
- data/test/vcr_cassettes/eds/get_with_auth.yml +144 -153
- data/test/vcr_cassettes/eds/get_with_auth_recovers_from_bad_auth.yml +167 -223
- data/test/view/atom_results_test.rb +94 -94
- metadata +36 -46
- data/app/assets/javascripts/bento_search.js +0 -3
- data/app/item_decorators/bento_search/ebscohost/conditional_openurl_main_link.rb +0 -36
- data/app/item_decorators/bento_search/only_premade_openurl.rb +0 -20
- data/app/item_decorators/bento_search/openurl_add_other_link.rb +0 -39
- data/app/item_decorators/bento_search/openurl_main_link.rb +0 -34
- data/app/models/bento_search/multi_searcher.rb +0 -131
- data/test/dummy/config/initializers/secret_token.rb +0 -8
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
98
|
-
|
99
|
-
|
100
|
-
div = results.
|
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
|
-
|
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("&", "&")) # 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.
|
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.
|
119
|
-
|
120
|
-
assert (img = loading_msg.
|
121
|
-
assert_equal I18n.translate("bento_search.ajax_loading"), img
|
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
|
130
|
+
results = Nokogiri::HTML(results)
|
131
131
|
|
132
|
-
div = results.
|
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.
|
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'] || '
|
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
|
|