require 'spec_helper'
describe BlacklightHelper do
include ERB::Util
include BlacklightHelper
include Devise::TestHelpers
def blacklight_config
@config ||= Blacklight::Configuration.new.configure do |config|
config.index.title_field = 'title_display'
config.index.display_type_field = 'format'
end
end
before(:each) do
helper.stub(:search_action_url) do |*args|
catalog_index_url *args
end
end
def current_search_session
end
describe "#application_name", :test => true do
it "should use the Rails application config application_name if available" do
Rails.application.config.stub(:application_name => 'asdf')
Rails.application.config.should_receive(:respond_to?).with(:application_name).and_return(true)
expect(application_name).to eq 'asdf'
end
it "should default to 'Blacklight'" do
expect(application_name).to eq "Blacklight"
end
end
describe "render_link_rel_alternates" do
class MockDocumentAppHelper
include Blacklight::Solr::Document
end
module MockExtension
def self.extended(document)
document.will_export_as(:weird, "application/weird")
document.will_export_as(:weirder, "application/weirder")
document.will_export_as(:weird_dup, "application/weird")
end
def export_as_weird ; "weird" ; end
def export_as_weirder ; "weirder" ; end
def export_as_weird_dup ; "weird_dup" ; end
end
MockDocumentAppHelper.use_extension(MockExtension)
def mock_document_app_helper_url *args
solr_document_url(*args)
end
before(:each) do
@doc_id = "MOCK_ID1"
@document = MockDocumentAppHelper.new(:id => @doc_id)
render_params = {:controller => "controller", :action => "action"}
helper.stub(:params).and_return(render_params)
end
it "generates tags" do
response = render_link_rel_alternates(@document)
tmp_value = Capybara.ignore_hidden_elements
Capybara.ignore_hidden_elements = false
@document.export_formats.each_pair do |format, spec|
response.should have_selector("link[href$='.#{ format }']") do |matches|
expect(matches).to have(1).match
tag = matches[0]
expect(tag.attributes["rel"].value).to eq "alternate"
expect(tag.attributes["title"].value).to eq format.to_s
expect(tag.attributes["href"].value).to eq mock_document_app_helper_url(@document, :format =>format)
end
end
Capybara.ignore_hidden_elements = tmp_value
end
it "respects :unique=>true" do
response = render_link_rel_alternates(@document, :unique => true)
tmp_value = Capybara.ignore_hidden_elements
Capybara.ignore_hidden_elements = false
expect(response).to have_selector("link[type='application/weird']", :count => 1)
Capybara.ignore_hidden_elements = tmp_value
end
it "excludes formats from :exclude" do
response = render_link_rel_alternates(@document, :exclude => [:weird_dup])
tmp_value = Capybara.ignore_hidden_elements
Capybara.ignore_hidden_elements = false
expect(response).to_not have_selector("link[href$='.weird_dup']")
Capybara.ignore_hidden_elements = tmp_value
end
it "should be html safe" do
response = render_link_rel_alternates(@document)
expect(response).to be_html_safe
end
end
describe "with a config" do
before do
@config = Blacklight::Configuration.new.configure do |config|
config.index.title_field = 'title_display'
config.index.display_type_field = 'format'
end
@document = SolrDocument.new('title_display' => "A Fake Document", 'id'=>'8')
helper.stub(:blacklight_config).and_return(@config)
helper.stub(:has_user_authentication_provider?).and_return(true)
helper.stub(:current_or_guest_user).and_return(User.new)
end
describe "render_index_doc_actions" do
it "should render partials" do
response = helper.render_index_doc_actions(@document)
expect(response).to have_selector(".bookmark_toggle")
end
end
describe "render_show_doc_actions" do
it "should render partials" do
response = helper.render_show_doc_actions(@document)
expect(response).to have_selector(".bookmark_toggle")
end
end
end
describe "render_index_field_value" do
before do
@config = Blacklight::Configuration.new.configure do |config|
config.add_index_field 'qwer'
config.add_index_field 'asdf', :helper_method => :render_asdf_index_field
config.add_index_field 'link_to_search_true', :link_to_search => true
config.add_index_field 'link_to_search_named', :link_to_search => :some_field
config.add_index_field 'highlight', :highlight => true
config.add_index_field 'solr_doc_accessor', :accessor => true
config.add_index_field 'explicit_accessor', :accessor => :solr_doc_accessor
config.add_index_field 'explicit_accessor_with_arg', :accessor => :solr_doc_accessor_with_arg
end
helper.stub(:blacklight_config).and_return(@config)
end
it "should check for an explicit value" do
doc = double()
doc.should_not_receive(:get).with('asdf', :sep => nil)
value = helper.render_index_field_value :value => 'asdf', :document => doc, :field => 'asdf'
expect(value).to eq 'asdf'
end
it "should check for a helper method to call" do
doc = double()
doc.should_receive(:get).with('asdf', :sep => nil)
helper.stub(:render_asdf_index_field).and_return('custom asdf value')
value = helper.render_index_field_value :document => doc, :field => 'asdf'
expect(value).to eq 'custom asdf value'
end
it "should check for a link_to_search" do
doc = double()
doc.should_receive(:get).with('link_to_search_true', :sep => nil).and_return('x')
value = helper.render_index_field_value :document => doc, :field => 'link_to_search_true'
expect(value).to eq helper.link_to("x", helper.search_action_url(:f => { :link_to_search_true => ['x'] }))
end
it "should check for a link_to_search with a field name" do
doc = double()
doc.should_receive(:get).with('link_to_search_named', :sep => nil).and_return('x')
value = helper.render_index_field_value :document => doc, :field => 'link_to_search_named'
expect(value).to eq helper.link_to("x", helper.search_action_url(:f => { :some_field => ['x'] }))
end
it "should gracefully handle when no highlight field is available" do
doc = double()
doc.should_not_receive(:get)
doc.should_receive(:has_highlight_field?).and_return(false)
value = helper.render_index_field_value :document => doc, :field => 'highlight'
expect(value).to be_blank
end
it "should check for a highlighted field" do
doc = double()
doc.should_not_receive(:get)
doc.should_receive(:has_highlight_field?).and_return(true)
doc.should_receive(:highlight_field).with('highlight').and_return(['highlight'.html_safe])
value = helper.render_index_field_value :document => doc, :field => 'highlight'
expect(value).to eq 'highlight'
end
it "should check the document field value" do
doc = double()
doc.should_receive(:get).with('qwer', :sep => nil).and_return('document qwer value')
value = helper.render_index_field_value :document => doc, :field => 'qwer'
expect(value).to eq 'document qwer value'
end
it "should work with index fields that aren't explicitly defined" do
doc = double()
doc.should_receive(:get).with('mnbv', :sep => nil).and_return('document mnbv value')
value = helper.render_index_field_value :document => doc, :field => 'mnbv'
expect(value).to eq 'document mnbv value'
end
it "should call an accessor on the solr document" do
doc = double(:solr_doc_accessor => "123")
value = helper.render_index_field_value :document => doc, :field => 'solr_doc_accessor'
expect(value).to eq "123"
end
it "should call an explicit accessor on the solr document" do
doc = double(:solr_doc_accessor => "123")
value = helper.render_index_field_value :document => doc, :field => 'explicit_accessor'
expect(value).to eq "123"
end
it "should call an implicit accessor on the solr document" do
doc = double()
expect(doc).to receive(:solr_doc_accessor_with_arg).with('explicit_accessor_with_arg').and_return("123")
value = helper.render_index_field_value :document => doc, :field => 'explicit_accessor_with_arg'
expect(value).to eq "123"
end
end
describe "render_document_show_field_value" do
before do
@config = Blacklight::Configuration.new.configure do |config|
config.add_show_field 'qwer'
config.add_show_field 'asdf', :helper_method => :render_asdf_document_show_field
config.add_show_field 'link_to_search_true', :link_to_search => true
config.add_show_field 'link_to_search_named', :link_to_search => :some_field
config.add_show_field 'highlight', :highlight => true
config.add_show_field 'solr_doc_accessor', :accessor => true
config.add_show_field 'explicit_accessor', :accessor => :solr_doc_accessor
config.add_show_field 'explicit_array_accessor', :accessor => [:solr_doc_accessor, :some_method]
config.add_show_field 'explicit_accessor_with_arg', :accessor => :solr_doc_accessor_with_arg
end
helper.stub(:blacklight_config).and_return(@config)
end
it "should check for an explicit value" do
doc = double()
doc.should_not_receive(:get).with('asdf', :sep => nil)
helper.should_not_receive(:render_asdf_document_show_field)
value = helper.render_document_show_field_value :value => 'asdf', :document => doc, :field => 'asdf'
expect(value).to eq 'asdf'
end
it "should check for a helper method to call" do
doc = double()
doc.should_receive(:get).with('asdf', :sep => nil)
helper.stub(:render_asdf_document_show_field).and_return('custom asdf value')
value = helper.render_document_show_field_value :document => doc, :field => 'asdf'
expect(value).to eq 'custom asdf value'
end
it "should check for a link_to_search" do
doc = double()
doc.should_receive(:get).with('link_to_search_true', :sep => nil).and_return('x')
value = helper.render_document_show_field_value :document => doc, :field => 'link_to_search_true'
expect(value).to eq helper.link_to("x", helper.search_action_url(:f => { :link_to_search_true => ['x'] }))
end
it "should check for a link_to_search with a field name" do
doc = double()
doc.should_receive(:get).with('link_to_search_named', :sep => nil).and_return('x')
value = helper.render_document_show_field_value :document => doc, :field => 'link_to_search_named'
expect(value).to eq helper.link_to("x", helper.search_action_url(:f => { :some_field => ['x'] }))
end
it "should gracefully handle when no highlight field is available" do
doc = double()
doc.should_not_receive(:get)
doc.should_receive(:has_highlight_field?).and_return(false)
value = helper.render_document_show_field_value :document => doc, :field => 'highlight'
expect(value).to be_blank
end
it "should check for a highlighted field" do
doc = double()
doc.should_not_receive(:get)
doc.should_receive(:has_highlight_field?).and_return(true)
doc.should_receive(:highlight_field).with('highlight').and_return(['highlight'.html_safe])
value = helper.render_document_show_field_value :document => doc, :field => 'highlight'
expect(value).to eq 'highlight'
end
it "should check the document field value" do
doc = double()
doc.should_receive(:get).with('qwer', :sep => nil).and_return('document qwer value')
value = helper.render_document_show_field_value :document => doc, :field => 'qwer'
expect(value).to eq 'document qwer value'
end
it "should work with show fields that aren't explicitly defined" do
doc = double()
doc.should_receive(:get).with('mnbv', :sep => nil).and_return('document mnbv value')
value = helper.render_document_show_field_value :document => doc, :field => 'mnbv'
expect(value).to eq 'document mnbv value'
end
it "should call an accessor on the solr document" do
doc = double(:solr_doc_accessor => "123")
value = helper.render_document_show_field_value :document => doc, :field => 'solr_doc_accessor'
expect(value).to eq "123"
end
it "should call an explicit accessor on the solr document" do
doc = double(:solr_doc_accessor => "123")
value = helper.render_document_show_field_value :document => doc, :field => 'explicit_accessor'
expect(value).to eq "123"
end
it "should call an explicit array-style accessor on the solr document" do
doc = double(:solr_doc_accessor => double(:some_method => "123"))
value = helper.render_document_show_field_value :document => doc, :field => 'explicit_array_accessor'
expect(value).to eq "123"
end
it "should call an accessor on the solr document with the field as an argument" do
doc = double()
expect(doc).to receive(:solr_doc_accessor_with_arg).with('explicit_accessor_with_arg').and_return("123")
value = helper.render_document_show_field_value :document => doc, :field => 'explicit_accessor_with_arg'
expect(value).to eq "123"
end
end
describe "#should_render_index_field?" do
it "should if the document has the field value" do
doc = double()
doc.stub(:has?).with('asdf').and_return(true)
field_config = double(:field => 'asdf')
helper.should_render_index_field?(doc, field_config).should == true
end
it "should if the document has a highlight field value" do
doc = double()
doc.stub(:has?).with('asdf').and_return(false)
doc.stub(:has_highlight_field?).with('asdf').and_return(true)
field_config = double(:field => 'asdf', :highlight => true)
helper.should_render_index_field?(doc, field_config).should == true
end
it "should if the field has a model accessor" do
doc = double()
doc.stub(:has?).with('asdf').and_return(false)
doc.stub(:has_highlight_field?).with('asdf').and_return(false)
field_config = double(:field => 'asdf', :highlight => true, :accessor => true)
helper.should_render_index_field?(doc, field_config).should == true
end
end
describe "#should_render_show_field?" do
it "should if the document has the field value" do
doc = double()
doc.stub(:has?).with('asdf').and_return(true)
field_config = double(:field => 'asdf')
expect(helper.should_render_show_field?(doc, field_config)).to be_true
end
it "should if the document has a highlight field value" do
doc = double()
doc.stub(:has?).with('asdf').and_return(false)
doc.stub(:has_highlight_field?).with('asdf').and_return(true)
field_config = double(:field => 'asdf', :highlight => true)
expect(helper.should_render_show_field?(doc, field_config)).to be_true
end
it "should if the field has a model accessor" do
doc = double()
doc.stub(:has?).with('asdf').and_return(false)
doc.stub(:has_highlight_field?).with('asdf').and_return(false)
field_config = double(:field => 'asdf', :highlight => true, :accessor => true)
helper.should_render_show_field?(doc, field_config).should == true
end
end
describe "render_grouped_response?" do
it "should check if the response ivar contains grouped data" do
assign(:response, double("SolrResponse", :grouped? => true))
expect(helper.render_grouped_response?).to be_true
end
it "should check if the response param contains grouped data" do
response = double("SolrResponse", :grouped? => true)
expect(helper.render_grouped_response?(response)).to be_true
end
end
describe "render_grouped_document_index" do
end
describe "render_field_value" do
it "should join and html-safe values" do
expect(helper.render_field_value(['a', 'b'])).to eq "a, b"
end
it "should join values using the field_value_separator" do
helper.stub(:field_value_separator).and_return(" -- ")
expect(helper.render_field_value(['a', 'b'])).to eq "a -- b"
end
it "should use the separator from the Blacklight field configuration by default" do
expect(helper.render_field_value(['c', 'd'], double(:separator => '; ', :itemprop => nil))).to eq "c; d"
end
it "should include schema.org itemprop attributes" do
expect(helper.render_field_value('a', double(:separator => nil, :itemprop => 'some-prop'))).to have_selector("span[@itemprop='some-prop']", :text => "a")
end
end
describe "should_show_spellcheck_suggestions?" do
before :each do
helper.stub spell_check_max: 5
end
it "should not show suggestions if there are enough results" do
response = double(total: 10)
expect(helper.should_show_spellcheck_suggestions? response).to be_false
end
it "should only show suggestions if there are very few results" do
response = double(total: 4, spelling: double(words: [1]))
expect(helper.should_show_spellcheck_suggestions? response).to be_true
end
it "should show suggestions only if there are spelling suggestions available" do
response = double(total: 4, spelling: double(words: []))
expect(helper.should_show_spellcheck_suggestions? response).to be_false
end
end
end