require 'test_helper'
require 'cgi'
require 'uri'
#
# To run queries live (without recorded VCR), you must have ENV variables
# set: SUMMON_ACCESS_ID and SUMMON_SECRET_KEY
class SummonEngineTest < ActiveSupport::TestCase
extend TestWithCassette
@@access_id = (ENV['SUMMON_ACCESS_ID'] || "DUMMY_ACCESS_ID")
@@secret_key = (ENV['SUMMON_SECRET_KEY'] || "DUMMY_SECRET_KEY")
VCR.configure do |c|
c.filter_sensitive_data("DUMMY_ACCESS_ID", :summon) { @@access_id }
c.filter_sensitive_data("DUMMY_SECRET_KEY", :summon) { @@secret_key }
end
def setup
@config = {
'access_id' => @@access_id,
'secret_key' => @@secret_key
}
@engine = BentoSearch::SummonEngine.new(@config)
end
def test_request_construction
uri, headers = @engine.construct_request(:query => "elephant's")
assert_present headers
assert_present headers["Content-Type"]
assert_present headers["Accept"]
assert_present headers["x-summon-date"]
assert_present headers["Authorization"]
assert_present uri
query_params = CGI.parse( URI.parse(uri).query )
assert_present query_params["s.q"]
end
def test_request_construction_with_lang
engine = BentoSearch::SummonEngine.new(@config.merge(:lang => 'en'))
uri, headers = engine.construct_request(:query => "cancer")
assert_present uri
query_params = CGI.parse( URI.parse(uri).query )
assert_equal ["en"], query_params["s.l"]
end
def test_summon_escape
uri, headers = @engine.construct_request(:query=> "Foo: A) \\Bar \"a phrase\"")
query_params = CGI.parse( URI.parse(uri).query )
assert_present (query = query_params["s.q"].first)
# double backslashes are escaping for ruby string literal,
# it's actually only a single backslash in output.
assert_equal "Foo\\: A\\) \\\\Bar \"a phrase\"", query
end
def test_sort_construction
uri, headers = @engine.construct_request(:query => "elephants", :sort => "date_desc")
query_params = CGI.parse( URI.parse(uri).query )
assert_present (sort = query_params["s.sort"].first )
assert_equal("PublicationDate:desc", sort)
end
def test_fielded_search_construction
uri, headers = @engine.construct_request(:query => "eleph)ants", :search_field => "SomeField")
query_params = CGI.parse( URI.parse(uri).query )
assert_equal "SomeField:(eleph\\\)ants)", query_params["s.q"].first
end
def test_pagination_construction
uri, headers = @engine.construct_request(:query => "elephants_per_page", :per_page => 20, :page => 2)
query_params = CGI.parse( URI.parse(uri).query )
assert_equal "20", query_params["s.ps"].first
assert_equal "2", query_params["s.pn"].first
end
def test_authenticated_user_construction
uri, headers = @engine.construct_request(:query => "elephants", :auth => true)
query_params = CGI.parse( URI.parse(uri).query )
assert_present query_params['s.role']
assert_equal "authenticated", query_params['s.role'].first
end
def test_construct_fixed_param_config
engine = BentoSearch::SummonEngine.new('access_id' => @@access_id,
'secret_key' => @@secret_key,
'fixed_params' => {
"s.fvf" => ["ContentType,Newspaper Article,true", "ContentType,Book,true"],
"s.role" => "authenticated"
})
uri, headers = engine.construct_request(:query => "elephants")
query_params = CGI.parse( URI.parse(uri).query )
assert_include query_params["s.fvf"], "ContentType,Newspaper Article,true"
assert_include query_params["s.fvf"], "ContentType,Book,true"
assert_include query_params["s.role"], "authenticated"
end
def test_construct_no_highlighting
engine = BentoSearch::SummonEngine.new('access_id' => @@access_id,
'secret_key' => @@secret_key,
'highlighting' => false)
uri, headers = engine.construct_request(:query => "elephants")
query_params = CGI.parse( URI.parse(uri).query )
assert_include query_params['s.hl'], "false"
end
def test_construct_summon_params_on_search
engine = BentoSearch::SummonEngine.new('access_id' => @@access_id,
'secret_key' => @@secret_key
)
uri, headers = engine.construct_request(:query => "elephants", :summon_params => {"a" => "a", "b" => ["b1", "b2"]})
query_params = CGI.parse( URI.parse(uri).query )
assert_equal 1, query_params["a"].try(:length)
assert_include query_params["a"], "a"
assert_equal 2, query_params["b"].try(:length)
assert_include query_params["b"], "b1"
assert_include query_params["b"], "b2"
end
def test_construct_peer_reviewed_only
uri, headers = @engine.construct_request(:query => "foo", :peer_reviewed_only => "true")
query_params = CGI.parse( URI.parse(uri).query )
assert_kind_of Array, query_params["s.fvf"]
assert_include query_params["s.fvf"], "IsPeerReviewed,true"
end
def test_construct_online_only
uri, headers = @engine.construct_request(:query => "foo", :online_only => "true")
query_params = CGI.parse( URI.parse(uri).query )
assert_kind_of Array, query_params["s.fvf"]
assert_include query_params["s.fvf"], "IsFullText,true"
end
def test_construct_pubyear_range
uri, headers = @engine.construct_request(:query => "foo", :pubyear_start => "1990", :pubyear_end => 2000)
query_params = CGI.parse( URI.parse(uri).query )
assert_include query_params["s.rf"], "PublicationDate,1990:2000"
end
def test_construct_pubyear_range_open_bottom
uri, headers = @engine.construct_request(:query => "foo", :pubyear_end => 2000)
query_params = CGI.parse( URI.parse(uri).query )
assert_include query_params["s.rf"], "PublicationDate,*:2000"
end
def test_construct_pubyear_range_open_top
uri, headers = @engine.construct_request(:query => "foo", :pubyear_start => "1990")
query_params = CGI.parse( URI.parse(uri).query )
assert_include query_params["s.rf"], "PublicationDate,1990:*"
end
test_with_cassette("bad auth", :summon) do
engine = BentoSearch::SummonEngine.new('access_id' => "bad_access_id", :secret_key => 'bad_secret_key')
results = engine.search("elephants")
assert results.failed?, "should return #failed?"
end
test_with_cassette("search", :summon) do
results = @engine.search("elephants")
assert ! results.failed?
assert_present results
assert_present results.total_items
assert_not_equal 0, results.total_items
first = results.first
assert_present first.title
assert_present first.format_str
# just smoke test to make sure it's set to something
assert_not_nil first.link_is_fulltext?
assert_present first.unique_id
# Make sure we have the summon.original_data hash
assert_kind_of Hash, first.custom_data["summon.original_data"]
end
test_with_cassette("proper tags for snippets", :summon) do
results = @engine.search("cancer")
first = results.first
assert_include first.title, ''
assert_include first.title, ''
assert first.title.html_safe?, "title is HTML safe"
end
test_with_cassette("snippets array", :summon) do
results = @engine.search("noam chomsky")
assert_present results.first
assert_present results.first.snippets
assert_include results.first.snippets.first, ''
end
test_with_cassette("live #get(id)", :summon) do
results = @engine.search("cancer")
assert_present results
item = @engine.get(results.first.unique_id)
assert_not_nil item
assert_kind_of BentoSearch::ResultItem, item
assert_equal results.first.unique_id, item.unique_id
end
test_with_cassette("live get(id) on non-existing id", :summon) do
assert_raise(BentoSearch::NotFound) do
item = @engine.get("NONE SUCH")
end
end
end