bento_search 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +299 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/images/bento_search/large_loader.gif +0 -0
  5. data/app/assets/javascripts/bento_search.js +3 -0
  6. data/app/assets/javascripts/bento_search/ajax_load.js +22 -0
  7. data/app/assets/stylesheets/bento_search/bento.css +4 -0
  8. data/app/controllers/bento_search/bento_search_controller.rb +7 -0
  9. data/app/controllers/bento_search/search_controller.rb +72 -0
  10. data/app/helpers/bento_search_helper.rb +138 -0
  11. data/app/item_decorators/bento_search/only_premade_openurl.rb +16 -0
  12. data/app/item_decorators/bento_search/openurl_add_other_link.rb +35 -0
  13. data/app/item_decorators/bento_search/openurl_main_link.rb +30 -0
  14. data/app/models/bento_search/author.rb +25 -0
  15. data/app/models/bento_search/link.rb +30 -0
  16. data/app/models/bento_search/multi_searcher.rb +109 -0
  17. data/app/models/bento_search/openurl_creator.rb +128 -0
  18. data/app/models/bento_search/registrar.rb +70 -0
  19. data/app/models/bento_search/result_item.rb +203 -0
  20. data/app/models/bento_search/results.rb +54 -0
  21. data/app/models/bento_search/results/pagination.rb +67 -0
  22. data/app/models/bento_search/search_engine.rb +219 -0
  23. data/app/models/bento_search/search_engine/capabilities.rb +65 -0
  24. data/app/search_engines/bento_search/#Untitled-1# +11 -0
  25. data/app/search_engines/bento_search/ebsco_host_engine.rb +356 -0
  26. data/app/search_engines/bento_search/eds_engine.rb +557 -0
  27. data/app/search_engines/bento_search/google_books_engine.rb +184 -0
  28. data/app/search_engines/bento_search/primo_engine.rb +231 -0
  29. data/app/search_engines/bento_search/scopus_engine.rb +295 -0
  30. data/app/search_engines/bento_search/summon_engine.rb +398 -0
  31. data/app/search_engines/bento_search/xerxes_engine.rb +168 -0
  32. data/app/views/bento_search/_link.html.erb +4 -0
  33. data/app/views/bento_search/_search_error.html.erb +22 -0
  34. data/app/views/bento_search/_std_item.html.erb +39 -0
  35. data/app/views/bento_search/search/search.html.erb +1 -0
  36. data/config/locales/en.yml +25 -0
  37. data/lib/bento_search.rb +29 -0
  38. data/lib/bento_search/engine.rb +5 -0
  39. data/lib/bento_search/routes.rb +45 -0
  40. data/lib/bento_search/version.rb +3 -0
  41. data/lib/generators/bento_search/pull_ebsco_dbs_generator.rb +24 -0
  42. data/lib/generators/bento_search/templates/ebsco_global_var.erb +6 -0
  43. data/lib/http_client_patch/include_client.rb +86 -0
  44. data/lib/tasks/bento_search_tasks.rake +4 -0
  45. data/test/dummy/README.rdoc +261 -0
  46. data/test/dummy/Rakefile +7 -0
  47. data/test/dummy/app/assets/javascripts/application.js +15 -0
  48. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  49. data/test/dummy/app/controllers/application_controller.rb +3 -0
  50. data/test/dummy/app/helpers/application_helper.rb +2 -0
  51. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  52. data/test/dummy/config.ru +4 -0
  53. data/test/dummy/config/application.rb +56 -0
  54. data/test/dummy/config/boot.rb +10 -0
  55. data/test/dummy/config/database.yml +25 -0
  56. data/test/dummy/config/environment.rb +5 -0
  57. data/test/dummy/config/environments/development.rb +37 -0
  58. data/test/dummy/config/environments/production.rb +67 -0
  59. data/test/dummy/config/environments/test.rb +37 -0
  60. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  61. data/test/dummy/config/initializers/inflections.rb +15 -0
  62. data/test/dummy/config/initializers/mime_types.rb +5 -0
  63. data/test/dummy/config/initializers/secret_token.rb +7 -0
  64. data/test/dummy/config/initializers/session_store.rb +8 -0
  65. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  66. data/test/dummy/config/locales/en.yml +5 -0
  67. data/test/dummy/config/routes.rb +6 -0
  68. data/test/dummy/db/test.sqlite3 +0 -0
  69. data/test/dummy/log/test.log +3100 -0
  70. data/test/dummy/public/404.html +26 -0
  71. data/test/dummy/public/422.html +26 -0
  72. data/test/dummy/public/500.html +25 -0
  73. data/test/dummy/public/favicon.ico +0 -0
  74. data/test/dummy/script/rails +6 -0
  75. data/test/functional/bento_search/search_controller_test.rb +81 -0
  76. data/test/helper/bento_search_helper_test.rb +125 -0
  77. data/test/integration/navigation_test.rb +10 -0
  78. data/test/support/mock_engine.rb +23 -0
  79. data/test/support/test_with_cassette.rb +38 -0
  80. data/test/test_helper.rb +52 -0
  81. data/test/unit/#vcr_test.rb# +68 -0
  82. data/test/unit/ebsco_host_engine_test.rb +134 -0
  83. data/test/unit/eds_engine_test.rb +105 -0
  84. data/test/unit/google_books_engine_test.rb +93 -0
  85. data/test/unit/item_decorators_test.rb +66 -0
  86. data/test/unit/multi_searcher_test.rb +49 -0
  87. data/test/unit/openurl_creator_test.rb +111 -0
  88. data/test/unit/pagination_test.rb +59 -0
  89. data/test/unit/primo_engine_test.rb +37 -0
  90. data/test/unit/register_engine_test.rb +50 -0
  91. data/test/unit/result_item_display_test.rb +39 -0
  92. data/test/unit/result_item_test.rb +36 -0
  93. data/test/unit/scopus_engine_test.rb +130 -0
  94. data/test/unit/search_engine_base_test.rb +178 -0
  95. data/test/unit/search_engine_test.rb +95 -0
  96. data/test/unit/summon_engine_test.rb +161 -0
  97. data/test/unit/xerxes_engine_test.rb +70 -0
  98. data/test/vcr_cassettes/ebscohost/error_bad_db.yml +45 -0
  99. data/test/vcr_cassettes/ebscohost/error_bad_password.yml +45 -0
  100. data/test/vcr_cassettes/ebscohost/get_info.yml +3626 -0
  101. data/test/vcr_cassettes/ebscohost/live_search.yml +45 -0
  102. data/test/vcr_cassettes/ebscohost/live_search_smoke_test.yml +1311 -0
  103. data/test/vcr_cassettes/eds/basic_search_smoke_test.yml +1811 -0
  104. data/test/vcr_cassettes/eds/get_auth_token.yml +75 -0
  105. data/test/vcr_cassettes/eds/get_auth_token_failure.yml +39 -0
  106. data/test/vcr_cassettes/eds/get_with_auth.yml +243 -0
  107. data/test/vcr_cassettes/eds/get_with_auth_recovers_from_bad_auth.yml +368 -0
  108. data/test/vcr_cassettes/gbs/error_condition.yml +40 -0
  109. data/test/vcr_cassettes/gbs/pagination.yml +702 -0
  110. data/test/vcr_cassettes/gbs/search.yml +340 -0
  111. data/test/vcr_cassettes/primo/search_smoke_test.yml +1112 -0
  112. data/test/vcr_cassettes/scopus/bad_api_key_should_return_error_response.yml +60 -0
  113. data/test/vcr_cassettes/scopus/escaped_chars.yml +187 -0
  114. data/test/vcr_cassettes/scopus/fielded_search.yml +176 -0
  115. data/test/vcr_cassettes/scopus/simple_search.yml +227 -0
  116. data/test/vcr_cassettes/scopus/zero_results_search.yml +67 -0
  117. data/test/vcr_cassettes/summon/bad_auth.yml +54 -0
  118. data/test/vcr_cassettes/summon/proper_tags_for_snippets.yml +216 -0
  119. data/test/vcr_cassettes/summon/search.yml +242 -0
  120. data/test/vcr_cassettes/xerxes/live_search.yml +2580 -0
  121. data/test/view/std_item_test.rb +98 -0
  122. metadata +421 -0
@@ -0,0 +1,178 @@
1
+ require 'test_helper'
2
+
3
+ class ParseSearchArgumentsTest < ActiveSupport::TestCase
4
+ class Dummy
5
+ include BentoSearch::SearchEngine
6
+
7
+ def search_implementation(args)
8
+ # no-op for now
9
+ BentoSearch::Results.new
10
+ end
11
+
12
+ def test_parse(*args)
13
+ # original method is protected, this is a lame way
14
+ # to expose it.
15
+ parse_search_arguments(*args)
16
+ end
17
+
18
+ def max_per_page
19
+ 40
20
+ end
21
+
22
+ def search_field_definitions
23
+ {
24
+ "my_title" => {:semantic => :title},
25
+ "my_author" => {:semantic => :author},
26
+ "my_other" => nil
27
+ }
28
+ end
29
+
30
+ end
31
+
32
+
33
+ def test_single_arg
34
+ d = Dummy.new
35
+
36
+ args = d.test_parse("query")
37
+
38
+ assert_equal( {:query => "query", :per_page => BentoSearch::SearchEngine::DefaultPerPage }, args )
39
+ end
40
+
41
+ def test_two_arg
42
+ d = Dummy.new
43
+
44
+ args = d.test_parse("query", :arg => "1")
45
+
46
+ assert_equal( {:query => "query", :arg => "1", :per_page => BentoSearch::SearchEngine::DefaultPerPage }, args )
47
+ end
48
+
49
+
50
+
51
+ def test_convert_page_to_start
52
+ d = Dummy.new
53
+
54
+ args = d.test_parse(:query => "query", :page => 1, :per_page => 20)
55
+
56
+ assert_equal 0, args[:start]
57
+ assert_equal 1, args[:page]
58
+ assert_equal 20, args[:per_page]
59
+
60
+ args = d.test_parse(:query => "query", :page => 3, :per_page => 20)
61
+
62
+ assert_equal 40, args[:start]
63
+ assert_equal 3, args[:page]
64
+ assert_equal 20, args[:per_page]
65
+ end
66
+
67
+ def test_convert_start_to_page
68
+ d = Dummy.new
69
+
70
+ # rounds down to get closest 'page' if need be.
71
+ args = d.test_parse(:query => "query", :start => '19', :per_page => '20')
72
+
73
+ assert_equal 19, args[:start]
74
+ assert_equal 1, args[:page]
75
+
76
+ args = d.test_parse(:query => "query", :start => '20', :per_page => '20')
77
+ assert_equal 2, args[:page]
78
+ end
79
+
80
+
81
+ def test_pagination_to_integer
82
+ d = Dummy.new
83
+
84
+ args = d.test_parse(:query => "query", :page => "1", :per_page => "20")
85
+ assert_equal 0, args[:start]
86
+ assert_equal 1, args[:page]
87
+ assert_equal 20, args[:per_page]
88
+
89
+ args = d.test_parse(:query => "query", :start => "20", :per_page => "20")
90
+ assert_equal 20, args[:start]
91
+ assert_equal 20, args[:per_page]
92
+
93
+ end
94
+
95
+ def test_ignore_blank_pagination_args
96
+ d = Dummy.new
97
+
98
+ args = d.test_parse(:query => "query", :page => "", :per_page => "", :start => "")
99
+
100
+ assert ! (args.has_key? :page)
101
+ assert ! (args.has_key? :start)
102
+ assert (args.has_key? :per_page) # default per page always provided
103
+ end
104
+
105
+ def test_enforce_max_per_page
106
+ d = Dummy.new
107
+
108
+ assert_raise(ArgumentError) { d.test_parse(:query => "query", :per_page => 1000) }
109
+ end
110
+
111
+ def test_search_field_keys
112
+ assert_equal ["my_title", "my_author", "my_other"], Dummy.new.search_keys
113
+ assert_equal ["title", "author"], Dummy.new.semantic_search_keys
114
+ end
115
+
116
+ def test_semantic_search_map
117
+ assert_equal( {"title" => "my_title", "author" => "my_author"},
118
+ Dummy.new.semantic_search_map)
119
+ end
120
+
121
+ def test_translate_search_field_semantics
122
+ d = Dummy.new
123
+
124
+ args = d.test_parse(:query => "query", :semantic_search_field => :title)
125
+
126
+ assert ! (args.has_key? :semantic_search_field), "translates semantic_search_field to search_field"
127
+ assert_equal "my_title", args[:search_field]
128
+
129
+ assert_raise(ArgumentError, "Raises for undefined semantic_search_field") do
130
+ d.test_parse(:query => "query", :semantic_search_field => :subject)
131
+ end
132
+ end
133
+
134
+ def test_semantic_blank_ignored
135
+ d = Dummy.new
136
+
137
+ args1 = d.test_parse(:query => "query", :semantic_search_field => nil)
138
+ args2 = d.test_parse(:query => "query", :semantic_search_field => nil)
139
+
140
+ assert_nil args1[:search_field]
141
+ assert_nil args2[:search_field]
142
+ end
143
+
144
+ def test_semantic_string_or_symbol
145
+ d = Dummy.new
146
+
147
+ args1 = d.test_parse(:query => "query", :semantic_search_field => :title)
148
+ args2 = d.test_parse(:query => "query", :semantic_search_field => "title")
149
+
150
+ assert_equal args1, args2
151
+ end
152
+
153
+ def test_converts_sort_to_string
154
+ d = Dummy.new
155
+
156
+ args = d.test_parse(:query => "query", :sort => :title_asc)
157
+
158
+ assert_equal "title_asc", args[:sort]
159
+ end
160
+
161
+ def test_sets_timing
162
+ d = Dummy.new
163
+ results = d.search("foo")
164
+
165
+ assert_not_nil results.timing
166
+ end
167
+
168
+ def test_passes_arbitrary_keys
169
+ d = Dummy.new
170
+ args = d.test_parse(:query => "foo", :custom_auth => true)
171
+
172
+ assert_present args[:custom_auth]
173
+ assert_equal true, args[:custom_auth]
174
+
175
+ end
176
+
177
+ end
178
+
@@ -0,0 +1,95 @@
1
+ require 'test_helper'
2
+
3
+
4
+
5
+ class SearchEngineTest < ActiveSupport::TestCase
6
+
7
+ def setup
8
+ @dummy_class = Class.new do
9
+ include BentoSearch::SearchEngine
10
+
11
+ def self.required_configuration
12
+ ["required.key"]
13
+ end
14
+
15
+ def search_implementation(arguments)
16
+ #no-op for now
17
+ BentoSearch::Results.new
18
+ end
19
+
20
+ end
21
+ end
22
+
23
+
24
+ test "takes configuration" do
25
+ conf = Confstruct::Configuration.new( :foo => "foo", :bar => "bar", :required => {:key => "required key"} )
26
+ engine = @dummy_class.new(conf)
27
+
28
+ assert_not_nil engine.configuration
29
+ assert_equal engine.configuration.foo, "foo"
30
+ assert_equal engine.configuration.bar, "bar"
31
+ end
32
+
33
+ test "required configuration keys" do
34
+ conf = Confstruct::Configuration.new( :foo => "foo", :bar => "bar" )
35
+ assert_raise ArgumentError do
36
+ @dummy_class.new(conf)
37
+ end
38
+ end
39
+
40
+ test "merges default configuration" do
41
+ @dummy_class = Class.new do
42
+ include BentoSearch::SearchEngine
43
+ def self.default_configuration
44
+ { :one => "default",
45
+ :two => "default",
46
+ :array => [:a, :b, :c],
47
+ :nested => {:one => "default", :two => "default"}
48
+ }
49
+ end
50
+ end
51
+
52
+ engine = @dummy_class.new( :two => "new", :array => ["one", "two"], :nested => {:two => "new"}, :required => {:key => "required key"} )
53
+
54
+ assert_kind_of Confstruct::Configuration, engine.configuration
55
+ assert_equal "default" , engine.configuration.one
56
+ assert_equal "new" , engine.configuration.two
57
+ assert_equal "default" , engine.configuration.nested.one
58
+ assert_equal "new" , engine.configuration.nested.two
59
+ assert_equal ["one", "two"] , engine.configuration.array
60
+ end
61
+
62
+ test "no default configuration" do
63
+ @dummy_class = Class.new do
64
+ include BentoSearch::SearchEngine
65
+ end
66
+
67
+ engine = @dummy_class.new( :one => "one" )
68
+
69
+ assert_kind_of Confstruct::Configuration, engine.configuration
70
+ assert_equal "one", engine.configuration.one
71
+ end
72
+
73
+ test "sets metadata on results" do
74
+ engine = MockEngine.new(:id => "foo")
75
+
76
+ results = engine.search(:query => "cancer", :per_page => 20)
77
+
78
+ assert_present results.search_args
79
+ assert_equal "foo", results.engine_id
80
+
81
+ pagination = results.pagination
82
+ assert_present pagination
83
+
84
+ assert_equal 20, pagination.per_page
85
+ assert_equal 1, pagination.current_page
86
+ assert_equal 1, pagination.start_record
87
+ assert_equal 20, pagination.end_record
88
+ assert pagination.first_page?
89
+
90
+ assert_present pagination.total_pages
91
+ assert_present pagination.count_records
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1,161 @@
1
+ require 'test_helper'
2
+
3
+ require 'cgi'
4
+ require 'uri'
5
+
6
+ #
7
+ # To run queries live (without recorded VCR), you must have ENV variables
8
+ # set: SUMMON_ACCESS_ID and SUMMON_SECRET_KEY
9
+
10
+
11
+ class SummonEngineTest < ActiveSupport::TestCase
12
+ extend TestWithCassette
13
+
14
+ @@access_id = (ENV['SUMMON_ACCESS_ID'] || "DUMMY_ACCESS_ID")
15
+ @@secret_key = (ENV['SUMMON_SECRET_KEY'] || "DUMMY_SECRET_KEY")
16
+
17
+ VCR.configure do |c|
18
+ c.filter_sensitive_data("DUMMY_ACCESS_ID", :summon) { @@access_id }
19
+ c.filter_sensitive_data("DUMMY_SECRET_KEY", :summon) { @@secret_key }
20
+ end
21
+
22
+ def setup
23
+ @engine = BentoSearch::SummonEngine.new('access_id' => @@access_id,
24
+ 'secret_key' => @@secret_key)
25
+ end
26
+
27
+ def test_request_construction
28
+ uri, headers = @engine.construct_request(:query => "elephant's")
29
+
30
+
31
+ assert_present headers
32
+ assert_present headers["Content-Type"]
33
+ assert_present headers["Accept"]
34
+ assert_present headers["x-summon-date"]
35
+ assert_present headers["Authorization"]
36
+
37
+
38
+ assert_present uri
39
+ query_params = CGI.parse( URI.parse(uri).query )
40
+ assert_present query_params["s.q"]
41
+ end
42
+
43
+ def test_summon_escape
44
+ uri, headers = @engine.construct_request(:query=> "Foo: A) \\Bar \"a phrase\"")
45
+
46
+ query_params = CGI.parse( URI.parse(uri).query )
47
+
48
+ assert_present (query = query_params["s.q"].first)
49
+
50
+ # double backslashes are escaping for ruby string literal,
51
+ # it's actually only a single backslash in output.
52
+ assert_equal "Foo\\: A\\) \\\\Bar \"a phrase\"", query
53
+ end
54
+
55
+ def test_sort_construction
56
+ uri, headers = @engine.construct_request(:query => "elephants", :sort => "date_desc")
57
+
58
+ query_params = CGI.parse( URI.parse(uri).query )
59
+
60
+ assert_present (sort = query_params["s.sort"].first )
61
+
62
+ assert_equal("PublicationDate:desc", sort)
63
+
64
+ end
65
+
66
+ def test_fielded_search_construction
67
+ uri, headers = @engine.construct_request(:query => "eleph)ants", :search_field => "SomeField")
68
+
69
+ query_params = CGI.parse( URI.parse(uri).query )
70
+
71
+ assert_equal "SomeField:(eleph\\\)ants)", query_params["s.q"].first
72
+ end
73
+
74
+ def test_pagination_construction
75
+ uri, headers = @engine.construct_request(:query => "elephants_per_page", :per_page => 20, :page => 2)
76
+
77
+ query_params = CGI.parse( URI.parse(uri).query )
78
+
79
+ assert_equal "20", query_params["s.ps"].first
80
+ assert_equal "2", query_params["s.pn"].first
81
+ end
82
+
83
+ def test_authenticated_user_construction
84
+ uri, headers = @engine.construct_request(:query => "elephants", :auth => true)
85
+
86
+ query_params = CGI.parse( URI.parse(uri).query )
87
+
88
+ assert_present query_params['s.role']
89
+ assert_equal "authenticated", query_params['s.role'].first
90
+ end
91
+
92
+ def test_construct_fixed_param_config
93
+ engine = BentoSearch::SummonEngine.new('access_id' => @@access_id,
94
+ 'secret_key' => @@secret_key,
95
+ 'fixed_params' => {
96
+ "s.fvf" => ["ContentType,Newspaper Article,true", "ContentType,Book,true"],
97
+ "s.role" => "authenticated"
98
+ })
99
+
100
+ uri, headers = engine.construct_request(:query => "elephants")
101
+
102
+ query_params = CGI.parse( URI.parse(uri).query )
103
+
104
+ assert_include query_params["s.fvf"], "ContentType,Newspaper Article,true"
105
+ assert_include query_params["s.fvf"], "ContentType,Book,true"
106
+ assert_include query_params["s.role"], "authenticated"
107
+
108
+ end
109
+
110
+ def test_construct_no_highlighting
111
+ engine = BentoSearch::SummonEngine.new('access_id' => @@access_id,
112
+ 'secret_key' => @@secret_key,
113
+ 'highlighting' => false)
114
+
115
+ uri, headers = engine.construct_request(:query => "elephants")
116
+
117
+ query_params = CGI.parse( URI.parse(uri).query )
118
+
119
+ assert_include query_params['s.hl'], "false"
120
+ end
121
+
122
+ test_with_cassette("bad auth", :summon) do
123
+ engine = BentoSearch::SummonEngine.new('access_id' => "bad_access_id", :secret_key => 'bad_secret_key')
124
+
125
+ results = engine.search("elephants")
126
+
127
+ assert results.failed?, "should return #failed?"
128
+ end
129
+
130
+
131
+ test_with_cassette("search", :summon) do
132
+ results = @engine.search("elephants")
133
+
134
+ assert ! results.failed?
135
+
136
+ assert_present results
137
+
138
+ assert_present results.total_items
139
+ assert_not_equal 0, results.total_items
140
+
141
+ first = results.first
142
+
143
+ assert_present first.title
144
+ assert_present first.format_str
145
+ end
146
+
147
+ test_with_cassette("proper tags for snippets", :summon) do
148
+ results = @engine.search("cancer")
149
+
150
+ first = results.first
151
+
152
+ assert_include first.title, '<b class="bento_search_highlight">'
153
+
154
+ assert first.title.html_safe?, "title is HTML safe"
155
+
156
+ assert_present first.custom_data['raw_title']
157
+ assert_not_include first.custom_data['raw_title'], '<b class="bento_search_highlight">'
158
+
159
+ end
160
+
161
+ end
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+
3
+ require 'cgi'
4
+ require 'uri'
5
+
6
+ # If you need to re-record cassette, you need to REMOVE
7
+ # the :refresh_wait => 0 below, along with
8
+ # the :record => once in the use_cassette
9
+ class XerxesEngineTest < ActiveSupport::TestCase
10
+ extend TestWithCassette
11
+
12
+ def setup
13
+ conf = Confstruct::Configuration.new( :base_url => "http://jhsearch.library.jhu.edu/",
14
+ :databases => ["JHU04066","JHU06614"] ,
15
+ # when we have a VCR recorded, we don't need to wait
16
+ # if re-recording, change this key to nil.
17
+ :refresh_wait => 0
18
+ )
19
+ @engine = BentoSearch::XerxesEngine.new( conf )
20
+ end
21
+
22
+
23
+ def test_construct_xerxes_url
24
+ url = @engine.send(:xerxes_search_url, {:query => "skin disease"})
25
+
26
+ uri = nil
27
+ assert_nothing_raised { uri = URI.parse(url) }
28
+
29
+ assert uri.to_s.start_with?(@engine.configuration.base_url), "starts with base_url"
30
+
31
+ query_hash = CGI.parse( uri.query )
32
+
33
+ assert_equal ["metasearch"], query_hash["base"]
34
+ assert_equal ["search"], query_hash["action"]
35
+ #assert_equal [@engine.configuration.xerxes_context], query_hash["context"]
36
+ assert_equal ["WRD"], query_hash["field"]
37
+ assert_equal ["skin disease"],query_hash["query"]
38
+
39
+ @engine.configuration.databases.each do |db|
40
+ assert query_hash["database"].include?( db )
41
+ end
42
+ end
43
+
44
+ test_with_cassette("live search", :xerxes, :record => :none) do
45
+ results = @engine.search("skin disease")
46
+
47
+ assert results.length > 0, "returns results"
48
+
49
+ record = results.first
50
+
51
+ assert_present record.title
52
+ assert_present record.format
53
+ assert_present record.link
54
+ assert_present record.volume
55
+ assert_present record.issue
56
+ assert_present record.start_page
57
+ assert_present record.end_page
58
+ assert_present record.abstract
59
+ assert_present record.openurl_kev_co
60
+ assert_present record.journal_title
61
+ assert_present record.issn
62
+
63
+ assert_operator record.authors.length, :>, 0
64
+
65
+ assert_present record.authors.first.first
66
+ assert_present record.authors.first.last
67
+
68
+ end
69
+
70
+ end