bento_search 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +299 -0
- data/Rakefile +40 -0
- data/app/assets/images/bento_search/large_loader.gif +0 -0
- data/app/assets/javascripts/bento_search.js +3 -0
- data/app/assets/javascripts/bento_search/ajax_load.js +22 -0
- data/app/assets/stylesheets/bento_search/bento.css +4 -0
- data/app/controllers/bento_search/bento_search_controller.rb +7 -0
- data/app/controllers/bento_search/search_controller.rb +72 -0
- data/app/helpers/bento_search_helper.rb +138 -0
- data/app/item_decorators/bento_search/only_premade_openurl.rb +16 -0
- data/app/item_decorators/bento_search/openurl_add_other_link.rb +35 -0
- data/app/item_decorators/bento_search/openurl_main_link.rb +30 -0
- data/app/models/bento_search/author.rb +25 -0
- data/app/models/bento_search/link.rb +30 -0
- data/app/models/bento_search/multi_searcher.rb +109 -0
- data/app/models/bento_search/openurl_creator.rb +128 -0
- data/app/models/bento_search/registrar.rb +70 -0
- data/app/models/bento_search/result_item.rb +203 -0
- data/app/models/bento_search/results.rb +54 -0
- data/app/models/bento_search/results/pagination.rb +67 -0
- data/app/models/bento_search/search_engine.rb +219 -0
- data/app/models/bento_search/search_engine/capabilities.rb +65 -0
- data/app/search_engines/bento_search/#Untitled-1# +11 -0
- data/app/search_engines/bento_search/ebsco_host_engine.rb +356 -0
- data/app/search_engines/bento_search/eds_engine.rb +557 -0
- data/app/search_engines/bento_search/google_books_engine.rb +184 -0
- data/app/search_engines/bento_search/primo_engine.rb +231 -0
- data/app/search_engines/bento_search/scopus_engine.rb +295 -0
- data/app/search_engines/bento_search/summon_engine.rb +398 -0
- data/app/search_engines/bento_search/xerxes_engine.rb +168 -0
- data/app/views/bento_search/_link.html.erb +4 -0
- data/app/views/bento_search/_search_error.html.erb +22 -0
- data/app/views/bento_search/_std_item.html.erb +39 -0
- data/app/views/bento_search/search/search.html.erb +1 -0
- data/config/locales/en.yml +25 -0
- data/lib/bento_search.rb +29 -0
- data/lib/bento_search/engine.rb +5 -0
- data/lib/bento_search/routes.rb +45 -0
- data/lib/bento_search/version.rb +3 -0
- data/lib/generators/bento_search/pull_ebsco_dbs_generator.rb +24 -0
- data/lib/generators/bento_search/templates/ebsco_global_var.erb +6 -0
- data/lib/http_client_patch/include_client.rb +86 -0
- data/lib/tasks/bento_search_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +56 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +6 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +3100 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/functional/bento_search/search_controller_test.rb +81 -0
- data/test/helper/bento_search_helper_test.rb +125 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/support/mock_engine.rb +23 -0
- data/test/support/test_with_cassette.rb +38 -0
- data/test/test_helper.rb +52 -0
- data/test/unit/#vcr_test.rb# +68 -0
- data/test/unit/ebsco_host_engine_test.rb +134 -0
- data/test/unit/eds_engine_test.rb +105 -0
- data/test/unit/google_books_engine_test.rb +93 -0
- data/test/unit/item_decorators_test.rb +66 -0
- data/test/unit/multi_searcher_test.rb +49 -0
- data/test/unit/openurl_creator_test.rb +111 -0
- data/test/unit/pagination_test.rb +59 -0
- data/test/unit/primo_engine_test.rb +37 -0
- data/test/unit/register_engine_test.rb +50 -0
- data/test/unit/result_item_display_test.rb +39 -0
- data/test/unit/result_item_test.rb +36 -0
- data/test/unit/scopus_engine_test.rb +130 -0
- data/test/unit/search_engine_base_test.rb +178 -0
- data/test/unit/search_engine_test.rb +95 -0
- data/test/unit/summon_engine_test.rb +161 -0
- data/test/unit/xerxes_engine_test.rb +70 -0
- data/test/vcr_cassettes/ebscohost/error_bad_db.yml +45 -0
- data/test/vcr_cassettes/ebscohost/error_bad_password.yml +45 -0
- data/test/vcr_cassettes/ebscohost/get_info.yml +3626 -0
- data/test/vcr_cassettes/ebscohost/live_search.yml +45 -0
- data/test/vcr_cassettes/ebscohost/live_search_smoke_test.yml +1311 -0
- data/test/vcr_cassettes/eds/basic_search_smoke_test.yml +1811 -0
- data/test/vcr_cassettes/eds/get_auth_token.yml +75 -0
- data/test/vcr_cassettes/eds/get_auth_token_failure.yml +39 -0
- data/test/vcr_cassettes/eds/get_with_auth.yml +243 -0
- data/test/vcr_cassettes/eds/get_with_auth_recovers_from_bad_auth.yml +368 -0
- data/test/vcr_cassettes/gbs/error_condition.yml +40 -0
- data/test/vcr_cassettes/gbs/pagination.yml +702 -0
- data/test/vcr_cassettes/gbs/search.yml +340 -0
- data/test/vcr_cassettes/primo/search_smoke_test.yml +1112 -0
- data/test/vcr_cassettes/scopus/bad_api_key_should_return_error_response.yml +60 -0
- data/test/vcr_cassettes/scopus/escaped_chars.yml +187 -0
- data/test/vcr_cassettes/scopus/fielded_search.yml +176 -0
- data/test/vcr_cassettes/scopus/simple_search.yml +227 -0
- data/test/vcr_cassettes/scopus/zero_results_search.yml +67 -0
- data/test/vcr_cassettes/summon/bad_auth.yml +54 -0
- data/test/vcr_cassettes/summon/proper_tags_for_snippets.yml +216 -0
- data/test/vcr_cassettes/summon/search.yml +242 -0
- data/test/vcr_cassettes/xerxes/live_search.yml +2580 -0
- data/test/view/std_item_test.rb +98 -0
- metadata +421 -0
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
class EbscoHostEngineTest < ActiveSupport::TestCase
|
7
|
+
extend TestWithCassette
|
8
|
+
|
9
|
+
@@profile_id = (ENV['EBSCOHOST_PROFILE'] || 'DUMMY_PROFILE')
|
10
|
+
@@profile_pwd = (ENV['EBSCOHOST_PWD'] || 'DUMMY_PWD')
|
11
|
+
@@dbs_to_test = (ENV['EBSCOHOST_TEST_DBS'] || %w{a9h awn} )
|
12
|
+
|
13
|
+
VCR.configure do |c|
|
14
|
+
c.filter_sensitive_data("prof=DUMMY_PROFILE", :ebscohost) { "prof=#{@@profile_id}" }
|
15
|
+
c.filter_sensitive_data("pwd=DUMMY_PWD", :ebscohost) { "pwd=#{@@profile_pwd}" }
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@config = {
|
21
|
+
:profile_id => @@profile_id,
|
22
|
+
:profile_password => @@profile_pwd,
|
23
|
+
:databases => @@dbs_to_test
|
24
|
+
}
|
25
|
+
|
26
|
+
@engine = BentoSearch::EbscoHostEngine.new( @config )
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def test_url_construction
|
31
|
+
url = @engine.query_url(:query => "cancer", :start => 10, :per_page => 5)
|
32
|
+
|
33
|
+
assert_present url
|
34
|
+
|
35
|
+
query_params = CGI.parse( URI.parse(url).query )
|
36
|
+
|
37
|
+
assert_equal [@engine.configuration.profile_id], query_params["prof"]
|
38
|
+
assert_equal [@engine.configuration.profile_password], query_params["pwd"]
|
39
|
+
|
40
|
+
assert_equal ["cancer"], query_params["query"]
|
41
|
+
|
42
|
+
assert_equal ["5"], query_params["numrec"]
|
43
|
+
assert_equal ["11"], query_params["startrec"]
|
44
|
+
|
45
|
+
# default sort relevance
|
46
|
+
assert_equal ["relevance"], query_params["sort"]
|
47
|
+
|
48
|
+
@engine.configuration.databases.each do |db|
|
49
|
+
assert_include query_params["db"], db
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_date_sort_construction
|
54
|
+
url = @engine.query_url(:query => "cancer", :sort => "date_desc")
|
55
|
+
|
56
|
+
query_params = CGI.parse( URI.parse(url).query )
|
57
|
+
|
58
|
+
assert_equal ["date"], query_params["sort"]
|
59
|
+
end
|
60
|
+
|
61
|
+
def fielded_construction
|
62
|
+
url = @engine.query_url(:query => "cancer", :search_field => "SU")
|
63
|
+
|
64
|
+
query_params = CGI.parse( URI.parse(url).query )
|
65
|
+
|
66
|
+
assert_equal ["(SU cancer)"], query_params["query"]
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_prepare_query
|
70
|
+
query = @engine.ebsco_query_prepare('one :. ; two "three four" AND NOT OR five')
|
71
|
+
|
72
|
+
assert_equal 'one AND two AND "three four" AND five', query
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_removes_paren_literals
|
76
|
+
url = @engine.query_url(:query => "cancer)", :sort => "date_desc")
|
77
|
+
|
78
|
+
query_params = CGI.parse( URI.parse(url).query )
|
79
|
+
|
80
|
+
assert_equal ["cancer "], query_params["query"]
|
81
|
+
end
|
82
|
+
|
83
|
+
test_with_cassette("live search smoke test", :ebscohost) do
|
84
|
+
|
85
|
+
results = @engine.search(:query => "cancer")
|
86
|
+
|
87
|
+
assert_present results
|
88
|
+
assert ! results.failed?
|
89
|
+
|
90
|
+
first = results.first
|
91
|
+
|
92
|
+
assert_present first.title
|
93
|
+
assert_present first.authors
|
94
|
+
assert_present first.year
|
95
|
+
|
96
|
+
assert_present first.format
|
97
|
+
assert_present first.format_str
|
98
|
+
end
|
99
|
+
|
100
|
+
test_with_cassette("get_info", :ebscohost) do
|
101
|
+
xml = @engine.get_info
|
102
|
+
|
103
|
+
assert_present xml
|
104
|
+
|
105
|
+
assert_present xml.xpath("./info/dbInfo/db")
|
106
|
+
end
|
107
|
+
|
108
|
+
test_with_cassette("error bad password", :ebscohost) do
|
109
|
+
error_engine = BentoSearch::EbscoHostEngine.new(
|
110
|
+
:profile_id => "bad",
|
111
|
+
:profile_password => "bad",
|
112
|
+
:databases => @@dbs_to_test
|
113
|
+
)
|
114
|
+
|
115
|
+
results = error_engine.search(:query => "cancer")
|
116
|
+
assert results.failed?
|
117
|
+
assert_present results.error[:error_info]
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
test_with_cassette("error bad db", :ebscohost) do
|
122
|
+
error_engine = BentoSearch::EbscoHostEngine.new(
|
123
|
+
:profile_id => @@profile_id,
|
124
|
+
:profile_password => @@profile_pwd,
|
125
|
+
:databases => ["bad", "does_not_exist"]
|
126
|
+
)
|
127
|
+
|
128
|
+
results = error_engine.search(:query => "cancer")
|
129
|
+
assert results.failed?
|
130
|
+
assert_present results.error[:error_info]
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class EdsEngineTest < ActiveSupport::TestCase
|
4
|
+
extend TestWithCassette
|
5
|
+
|
6
|
+
@@user_id = (ENV['EDS_USER_ID'] || 'DUMMY_USER_ID')
|
7
|
+
@@password = (ENV['EDS_PASSWORD'] || 'DUMMY_PWD')
|
8
|
+
@@profile = (ENV['EDS_PROFILE'] || 'edsapi')
|
9
|
+
|
10
|
+
|
11
|
+
VCR.configure do |c|
|
12
|
+
c.filter_sensitive_data("DUMMY_USER_ID", :eds) { @@user_id }
|
13
|
+
c.filter_sensitive_data("DUMMY_PWD", :eds) { @@password }
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
# Class-level remembered auth token messes up our VCR-recording,
|
18
|
+
# 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.
|
20
|
+
BentoSearch::EdsEngine.remembered_auth = nil
|
21
|
+
|
22
|
+
|
23
|
+
@engine = BentoSearch::EdsEngine.new(:user_id => @@user_id, :password => @@password, :profile => @@profile, :auth => true)
|
24
|
+
end
|
25
|
+
|
26
|
+
test_with_cassette("get_auth_token failure", :eds) do
|
27
|
+
engine = BentoSearch::EdsEngine.new(:user_id => "bad", :password => "bad", :profile => "bad")
|
28
|
+
exception = assert_raise(BentoSearch::EdsEngine::EdsCommException) do
|
29
|
+
token = engine.get_auth_token
|
30
|
+
end
|
31
|
+
|
32
|
+
assert_present exception.http_status
|
33
|
+
assert_present exception.http_body
|
34
|
+
end
|
35
|
+
|
36
|
+
test_with_cassette("get_auth_token", :eds) do
|
37
|
+
token = @engine.get_auth_token
|
38
|
+
|
39
|
+
assert_present token
|
40
|
+
end
|
41
|
+
|
42
|
+
# No idea why VCR is having buggy problems with record and playback of this request
|
43
|
+
# We'll emcompass it in the get_with_auth test
|
44
|
+
#
|
45
|
+
#test_with_cassette("with_session", :eds, :match_requests_on => [:method, :uri, :headers, :body]) do
|
46
|
+
# @engine.with_session do |session_token|
|
47
|
+
# assert_present session_token
|
48
|
+
# end
|
49
|
+
#end
|
50
|
+
|
51
|
+
test_with_cassette("get_with_auth", :eds) do
|
52
|
+
@engine.with_session do |session_token|
|
53
|
+
assert_present session_token
|
54
|
+
|
55
|
+
# Coudln't get 'info' request to work even as a test, let's
|
56
|
+
# try a simple search.
|
57
|
+
url = "#{@engine.configuration.base_url}info"
|
58
|
+
response = @engine.get_with_auth(url, session_token)
|
59
|
+
|
60
|
+
assert_present response
|
61
|
+
assert_kind_of Nokogiri::XML::Document, response
|
62
|
+
|
63
|
+
assert_nil response.at_xpath("//ErrorNumber"), "no error report in result"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
test_with_cassette("get_with_auth recovers from bad auth", :eds) do
|
68
|
+
@engine.with_session do |session_token|
|
69
|
+
BentoSearch::EdsEngine.remembered_auth = "BAD"
|
70
|
+
|
71
|
+
url = "#{@engine.configuration.base_url}info"
|
72
|
+
response = @engine.get_with_auth(url, session_token)
|
73
|
+
|
74
|
+
assert_present response
|
75
|
+
assert_kind_of Nokogiri::XML::Document, response
|
76
|
+
|
77
|
+
assert_nil response.at_xpath("//ErrorNumber"), "no error report in result"
|
78
|
+
end
|
79
|
+
|
80
|
+
BentoSearch::EdsEngine.remembered_auth = nil
|
81
|
+
end
|
82
|
+
|
83
|
+
test_with_cassette("basic search smoke test", :eds) do
|
84
|
+
results = @engine.search("cancer")
|
85
|
+
|
86
|
+
assert_present results
|
87
|
+
|
88
|
+
assert_present results.total_items
|
89
|
+
|
90
|
+
first = results.first
|
91
|
+
|
92
|
+
assert_present first.title
|
93
|
+
assert first.title.html_safe? # yeah, for now we use EDS html
|
94
|
+
|
95
|
+
assert_present first.abstract
|
96
|
+
assert_present first.abstract.html_safe?
|
97
|
+
|
98
|
+
assert_present first.custom_data["citation_blob"]
|
99
|
+
|
100
|
+
assert_present first.format_str
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
end
|
105
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class GoogleBooksEngineTest < ActiveSupport::TestCase
|
4
|
+
extend TestWithCassette
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@engine = BentoSearch::GoogleBooksEngine.new
|
8
|
+
# tell it not to send our bad API key
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
test_with_cassette("search", :gbs) do
|
14
|
+
results = @engine.search("cancer")
|
15
|
+
|
16
|
+
assert_kind_of BentoSearch::Results, results
|
17
|
+
|
18
|
+
assert ! results.failed?
|
19
|
+
|
20
|
+
assert_not_nil results.total_items
|
21
|
+
assert_equal 0, results.start
|
22
|
+
assert_equal 10, results.per_page
|
23
|
+
|
24
|
+
assert_not_empty results
|
25
|
+
|
26
|
+
first = results.first
|
27
|
+
|
28
|
+
assert_kind_of BentoSearch::ResultItem, first
|
29
|
+
|
30
|
+
assert_not_empty first.title
|
31
|
+
assert_not_empty first.publisher
|
32
|
+
assert_not_empty first.link
|
33
|
+
assert_not_empty first.format
|
34
|
+
assert_not_nil first.year
|
35
|
+
assert_not_empty first.abstract
|
36
|
+
assert first.abstract.html_safe?
|
37
|
+
|
38
|
+
|
39
|
+
assert_not_empty first.authors
|
40
|
+
assert_not_empty first.authors.first.display
|
41
|
+
end
|
42
|
+
|
43
|
+
test_with_cassette("pagination", :gbs) do
|
44
|
+
results = @engine.search("cancer", :per_page => 20, :start => 40)
|
45
|
+
|
46
|
+
assert ! results.failed?
|
47
|
+
|
48
|
+
assert_equal 20, results.length
|
49
|
+
|
50
|
+
assert_equal 20, results.per_page
|
51
|
+
assert_equal 20, results.size
|
52
|
+
assert_equal 40, results.start
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
test_with_cassette("error condition", :gbs) do
|
58
|
+
# send a bad API key on purpose to get error
|
59
|
+
@engine = BentoSearch::GoogleBooksEngine.new(:api_key => "BAD_KEY")
|
60
|
+
|
61
|
+
results = @engine.search("cancer")
|
62
|
+
|
63
|
+
assert results.failed?
|
64
|
+
assert_not_nil results.error
|
65
|
+
assert_not_nil results.error[:status]
|
66
|
+
assert_not_nil results.error[:error_info]
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def test_sort_construction
|
71
|
+
url = @engine.send(:args_to_search_url, :query => "cancer", :sort => "date_desc")
|
72
|
+
|
73
|
+
assert_match '&sort=newest', url
|
74
|
+
|
75
|
+
url = @engine.send(:args_to_search_url, :query => "cancer", :sort => "relevance")
|
76
|
+
|
77
|
+
assert_not_match "&sort", url
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_fielded_search
|
81
|
+
# Have to use protected methods to get at what we want to test.
|
82
|
+
# Is there a better way to factor this for testing?
|
83
|
+
norm_args = @engine.send(:parse_search_arguments, 'cancer "by radiation"', :search_field => :intitle)
|
84
|
+
url = @engine.send(:args_to_search_url, norm_args)
|
85
|
+
|
86
|
+
query_params = CGI.parse( URI.parse(url).query )
|
87
|
+
|
88
|
+
assert_match /^|\sintitle\:cancer\s|$/, query_params["q"].first
|
89
|
+
assert_match /^|\sintitle\:"by radiation"\s|$/, query_params["q"].first
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LinkDecoratorsTest < ActiveSupport::TestCase
|
4
|
+
# simple decorator that replaces main link
|
5
|
+
module Decorator
|
6
|
+
def link
|
7
|
+
"http://newlink.com"
|
8
|
+
end
|
9
|
+
|
10
|
+
def other_links
|
11
|
+
super + [ BentoSearch::Link.new(:label => "One", :url => "http://one.com") ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
setup do
|
16
|
+
@engine = MockEngine.new(:item_decorators => [Decorator])
|
17
|
+
end
|
18
|
+
|
19
|
+
test "decorators" do
|
20
|
+
results = @engine.search(:query => "Query")
|
21
|
+
|
22
|
+
assert_present results
|
23
|
+
|
24
|
+
results.each do |result|
|
25
|
+
assert_kind_of Decorator, result
|
26
|
+
|
27
|
+
assert_equal "http://newlink.com", result.link
|
28
|
+
|
29
|
+
assert_present result.other_links
|
30
|
+
|
31
|
+
assert_equal "One", result.other_links.first.label
|
32
|
+
assert_equal "http://one.com", result.other_links.first.url
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Is it a good idea to have a decorator that mutates on 'extend'?
|
37
|
+
# I'm not sure, I think probably not, but it is possible.
|
38
|
+
# Here we'll use it to move an original link to other links
|
39
|
+
module MutatingDecorator
|
40
|
+
def self.extended(item)
|
41
|
+
orig_link = item.link
|
42
|
+
|
43
|
+
item.link = nil
|
44
|
+
|
45
|
+
item.other_links << BentoSearch::Link.new(:label => "Some Other", :url => orig_link)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
test "mutating decorator" do
|
50
|
+
@engine = MockEngine.new(:item_decorators => [MutatingDecorator], :link => "http://example2.org")
|
51
|
+
results = @engine.search("query")
|
52
|
+
|
53
|
+
assert_present results
|
54
|
+
|
55
|
+
results.each do |result|
|
56
|
+
assert_blank result.link
|
57
|
+
assert_equal "http://example2.org", result.other_links.first.url
|
58
|
+
assert_equal "Some Other", result.other_links.first.label
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# Doesn't really test the concurrency, but basic smoke test with fake
|
4
|
+
# searchers.
|
5
|
+
class MultiSearcherTest < ActiveSupport::TestCase
|
6
|
+
setup do
|
7
|
+
BentoSearch.register_engine("one") do |conf|
|
8
|
+
conf.engine = "MockEngine"
|
9
|
+
end
|
10
|
+
BentoSearch.register_engine("two") do |conf|
|
11
|
+
conf.engine = "MockEngine"
|
12
|
+
end
|
13
|
+
BentoSearch.register_engine("three") do |conf|
|
14
|
+
conf.engine = "MockEngine"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
teardown do
|
19
|
+
BentoSearch.reset_engine_registrations!
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def test_multisearch
|
24
|
+
searcher = BentoSearch::MultiSearcher.new(:one, :two, :three)
|
25
|
+
start_returnval = searcher.start("cancer")
|
26
|
+
|
27
|
+
assert_same searcher, start_returnval
|
28
|
+
|
29
|
+
results = searcher.results
|
30
|
+
|
31
|
+
assert_kind_of Hash, results
|
32
|
+
assert_equal ["one", "two", "three"].sort, results.keys.sort
|
33
|
+
|
34
|
+
["one", "two", "three"].each do |key|
|
35
|
+
assert_kind_of BentoSearch::Results, results[key]
|
36
|
+
end
|
37
|
+
|
38
|
+
# call results again, we get an empty hash, can only call
|
39
|
+
# results once per start.
|
40
|
+
new_results = searcher.results
|
41
|
+
assert_kind_of Hash, new_results
|
42
|
+
assert_empty new_results
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
end
|