blacklight 5.0.0.pre3 → 5.0.0.pre4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -16
  3. data/Gemfile +4 -0
  4. data/README.md +15 -1
  5. data/VERSION +1 -1
  6. data/app/assets/stylesheets/blacklight/_bookmark.css.scss +1 -1
  7. data/app/assets/stylesheets/blacklight/_catalog.css.scss +2 -12
  8. data/app/assets/stylesheets/blacklight/_facets.css.scss +1 -1
  9. data/app/assets/stylesheets/blacklight/_header.css.scss +1 -0
  10. data/app/assets/stylesheets/blacklight/_modal.css.scss +4 -2
  11. data/app/assets/stylesheets/blacklight/blacklight_defaults.css.scss +0 -5
  12. data/app/controllers/bookmarks_controller.rb +4 -0
  13. data/app/helpers/blacklight/blacklight_helper_behavior.rb +26 -187
  14. data/app/helpers/blacklight/catalog_helper_behavior.rb +20 -8
  15. data/app/helpers/blacklight/facets_helper_behavior.rb +0 -83
  16. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +1 -1
  17. data/app/helpers/blacklight/url_helper_behavior.rb +201 -0
  18. data/app/helpers/blacklight_url_helper.rb +3 -0
  19. data/app/views/bookmarks/_tools.html.erb +4 -7
  20. data/app/views/catalog/_citation.html.erb +1 -1
  21. data/app/views/catalog/_did_you_mean.html.erb +1 -1
  22. data/app/views/catalog/_document.html.erb +1 -1
  23. data/app/views/catalog/_search_form.html.erb +1 -1
  24. data/app/views/catalog/_show_more_like_this.html.erb +1 -1
  25. data/app/views/catalog/_view_type_group.html.erb +4 -4
  26. data/app/views/catalog/email.html.erb +2 -2
  27. data/app/views/catalog/facet.html.erb +1 -1
  28. data/app/views/catalog/show.html.erb +1 -1
  29. data/app/views/catalog/sms.html.erb +1 -1
  30. data/blacklight.gemspec +2 -2
  31. data/config/jetty.yml +4 -1
  32. data/config/locales/blacklight.en.yml +3 -0
  33. data/config/locales/blacklight.fr.yml +3 -0
  34. data/{lib/generators/blacklight/templates/migrations/create_searches.rb → db/migrate/20140202020201_create_searches.rb} +2 -0
  35. data/{lib/generators/blacklight/templates/migrations/create_bookmarks.rb → db/migrate/20140202020202_create_bookmarks.rb} +1 -2
  36. data/gemfiles/rails3.gemfile +2 -0
  37. data/gemfiles/rails4.gemfile +2 -0
  38. data/lib/blacklight.rb +1 -40
  39. data/lib/blacklight/base.rb +3 -9
  40. data/lib/blacklight/catalog.rb +3 -16
  41. data/lib/blacklight/catalog/search_context.rb +8 -1
  42. data/lib/blacklight/configurable.rb +1 -2
  43. data/lib/blacklight/configuration.rb +13 -3
  44. data/lib/blacklight/configuration/view_config.rb +71 -0
  45. data/lib/blacklight/engine.rb +1 -0
  46. data/lib/blacklight/routes.rb +0 -1
  47. data/lib/blacklight/solr/document.rb +0 -4
  48. data/lib/blacklight/solr_helper.rb +8 -2
  49. data/lib/blacklight/user.rb +1 -16
  50. data/lib/blacklight/utils.rb +72 -1
  51. data/lib/generators/blacklight/install_generator.rb +92 -0
  52. data/lib/generators/blacklight/models_generator.rb +1 -25
  53. data/lib/generators/blacklight/templates/catalog_controller.rb +28 -32
  54. data/spec/helpers/blacklight_helper_spec.rb +24 -417
  55. data/spec/helpers/catalog_helper_spec.rb +13 -13
  56. data/spec/helpers/facets_helper_spec.rb +0 -127
  57. data/spec/helpers/hash_as_hidden_fields_spec.rb +1 -1
  58. data/spec/helpers/url_helper_spec.rb +360 -0
  59. data/spec/lib/blacklight/configuration_spec.rb +2 -3
  60. data/spec/lib/blacklight/solr_helper_spec.rb +11 -17
  61. data/spec/lib/blacklight/user_spec.rb +0 -41
  62. data/spec/lib/blacklight_spec.rb +0 -22
  63. data/spec/lib/utils_spec.rb +35 -4
  64. data/spec/spec_helper.rb +4 -3
  65. data/spec/test_app_templates/lib/generators/test_app_generator.rb +2 -2
  66. data/spec/views/catalog/_constraints.html.erb_spec.rb +4 -2
  67. data/spec/views/catalog/_index_default.erb_spec.rb +1 -1
  68. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +1 -5
  69. data/spec/views/catalog/_show_default.erb_spec.rb +1 -1
  70. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +11 -3
  71. data/tasks/blacklight.rake +1 -5
  72. metadata +14 -16
  73. data/.gitmodules +0 -0
  74. data/app/views/catalog/endnote.endnote.erb +0 -1
  75. data/app/views/catalog/show.endnote.erb +0 -1
  76. data/lib/generators/blacklight/blacklight_generator.rb +0 -97
  77. data/lib/generators/blacklight/templates/migrations/add_user_types_to_bookmarks_searches.rb +0 -16
  78. data/lib/generators/blacklight/templates/migrations/remove_editable_fields_from_bookmarks.rb +0 -12
  79. data/lib/railties/all_tests.rake +0 -39
  80. data/lib/railties/blacklight_rspec.rake +0 -128
@@ -12,19 +12,10 @@ module Blacklight::User
12
12
  end
13
13
  end
14
14
 
15
- def has_bookmarks?
16
- bookmarks.any?
17
- end
18
-
19
- def has_searches?
20
- searches.any?
21
- end
22
-
23
15
  def bookmarked_document_ids
24
16
  self.bookmarks.pluck(:document_id)
25
17
  end
26
-
27
- # see #current_bookmark_for, is easier
18
+
28
19
  def document_is_bookmarked?(document_id)
29
20
  bookmarked_document_ids.include? document_id.to_s
30
21
  end
@@ -34,10 +25,4 @@ module Blacklight::User
34
25
  def existing_bookmark_for(document_id)
35
26
  self.bookmarks.where(:document_id => document_id).first
36
27
  end
37
-
38
- def documents_to_bookmark=(docs)
39
- docs.reject { |doc| document_is_bookmarked?(doc[:document_id]) }.each do |doc|
40
- self.bookmarks.create(doc)
41
- end
42
- end
43
28
  end
@@ -1,7 +1,7 @@
1
1
  require 'ostruct'
2
2
  module Blacklight
3
3
  class OpenStructWithHashAccess < OpenStruct
4
- delegate :keys, :merge, :to => :to_h
4
+ delegate :keys, :has_key?, :delete, :length, :reject!, :select!, :include, :fetch, :to => :to_h
5
5
 
6
6
  def []=(key, value)
7
7
  send "#{key}=", value
@@ -14,5 +14,76 @@ module Blacklight
14
14
  def to_h
15
15
  @table
16
16
  end
17
+
18
+ def merge other_hash
19
+ self.class.new to_h.merge((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
20
+ end
21
+
22
+ def merge! other_hash
23
+ @table.merge!((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
24
+ end
25
+ end
26
+
27
+ class NestedOpenStructWithHashAccess < OpenStructWithHashAccess
28
+ attr_reader :nested_class
29
+ delegate :default_proc=, :to => :to_h
30
+
31
+ def initialize klass, *args
32
+ @nested_class = klass
33
+ hash = {}
34
+
35
+ hashes_and_keys = args.flatten
36
+ lazy_configs = hashes_and_keys.extract_options!
37
+
38
+ args.each do |v|
39
+ if v.is_a? Hash
40
+ key = v.first
41
+ value = v[key]
42
+
43
+ hash[key] = nested_class.new value
44
+ else
45
+ hash[v] = nested_class.new
46
+ end
47
+ end
48
+
49
+ lazy_configs.each do |k,v|
50
+ hash[k] = nested_class.new v
51
+ end
52
+
53
+ super hash
54
+ set_default_proc!
55
+ end
56
+
57
+ def << key
58
+ @table[key]
59
+ end
60
+
61
+ def []=(key, value)
62
+ if value.is_a? Hash
63
+ send "#{key}=", nested_class.new(value)
64
+ else
65
+ send "#{key}=", value
66
+ end
67
+ end
68
+
69
+ def marshal_dump
70
+ h = to_h.dup
71
+ h.default = nil
72
+
73
+ [nested_class, h]
74
+ end
75
+
76
+ def marshal_load x
77
+ @nested_class = x.first
78
+ super x.last
79
+ set_default_proc!
80
+ end
81
+
82
+ private
83
+ def set_default_proc!
84
+ self.default_proc = lambda do |hash, key|
85
+ hash[key] = self.nested_class.new
86
+ end
87
+ end
17
88
  end
18
89
  end
@@ -0,0 +1,92 @@
1
+ module Blacklight
2
+ class Install < Rails::Generators::Base
3
+
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ argument :model_name, :type => :string , :default => "user"
7
+ class_option :devise , :type => :boolean, :default => false, :aliases => "-d", :desc => "Use Devise as authentication logic."
8
+ class_option :marc , :type => :boolean, :default => false, :aliases => "-m", :desc => "Generate MARC-based demo ."
9
+
10
+ desc """
11
+ This generator makes the following changes to your application:
12
+ 1. Generates blacklight:models
13
+ 2. Creates a number of public assets, including images, stylesheets, and javascript
14
+ 3. Injects behavior into your user application_controller.rb
15
+ 4. Adds example configurations for dealing with MARC-like data
16
+ 5. Adds Blacklight routes to your ./config/routes.rb
17
+
18
+
19
+ Thank you for Installing Blacklight.
20
+ """
21
+
22
+ def bundle_install
23
+ Bundler.with_clean_env do
24
+ run "bundle install"
25
+ end
26
+ end
27
+
28
+ # Copy all files in templates/public/ directory to public/
29
+ # Call external generator in AssetsGenerator, so we can
30
+ # leave that callable seperately too.
31
+ def copy_public_assets
32
+ generate "blacklight:assets"
33
+ end
34
+
35
+ def generate_blacklight_models
36
+
37
+ generator_args = []
38
+ if options[:devise]
39
+ generator_args << "--devise #{options[:devise]}"
40
+ end
41
+
42
+ generate 'blacklight:models', generator_args.join(" ")
43
+ end
44
+
45
+ # Add Blacklight to the application controller
46
+ def inject_blacklight_controller_behavior
47
+ # prepend_file("app/controllers/application_controller.rb", "require 'blacklight/controller'\n\n")
48
+ inject_into_class "app/controllers/application_controller.rb", "ApplicationController" do
49
+ " # Adds a few additional behaviors into the application controller \n " +
50
+ " include Blacklight::Controller\n" +
51
+ " # Please be sure to impelement current_user and user_session. Blacklight depends on \n" +
52
+ " # these methods in order to perform user specific actions. \n\n" +
53
+ " layout 'blacklight'\n\n"
54
+ end
55
+ end
56
+
57
+ # Generate blacklight catalog controller
58
+ def create_blacklight_catalog
59
+ copy_file "catalog_controller.rb", "app/controllers/catalog_controller.rb"
60
+ end
61
+
62
+ def generate_blacklight_marc_demo
63
+ if options[:marc]
64
+ gem "blacklight_marc", ">= 0.0.9"
65
+
66
+ Bundler.with_clean_env do
67
+ run "bundle install"
68
+ end
69
+
70
+ generate 'blacklight_marc:marc'
71
+ end
72
+ end
73
+
74
+ def inject_blacklight_routes
75
+ # These will end up in routes.rb file in reverse order
76
+ # we add em, since each is added at the top of file.
77
+ # we want "root" to be FIRST for optimal url generation.
78
+ route('blacklight_for :catalog')
79
+ route('root :to => "catalog#index"')
80
+ end
81
+
82
+ def add_sass_configuration
83
+
84
+ insert_into_file "config/application.rb", :after => "config.assets.enabled = true" do <<EOF
85
+
86
+ # Default SASS Configuration, check out https://github.com/rails/sass-rails for details
87
+ config.assets.compress = !Rails.env.development?
88
+ EOF
89
+ end
90
+ end
91
+ end
92
+ end
@@ -17,20 +17,6 @@ This generator makes the following changes to your application:
17
17
  3. Injects behavior into your user model
18
18
  4. Creates a blacklight document in your /app/models directory
19
19
  """
20
- # Implement the required interface for Rails::Generators::Migration.
21
- # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
22
- def self.next_migration_number(path)
23
- if @prev_migration_nr
24
- @prev_migration_nr += 1
25
- else
26
- if last_migration = Dir[File.join(path, '*.rb')].sort.last
27
- @prev_migration_nr = last_migration.sub(File.join(path, '/'), '').to_i + 1
28
- else
29
- @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
30
- end
31
- end
32
- @prev_migration_nr.to_s
33
- end
34
20
 
35
21
  def check_arguments
36
22
  if File.exists?("app/models/#{model_name}.rb") and options[:devise]
@@ -77,11 +63,7 @@ This generator makes the following changes to your application:
77
63
 
78
64
  # Setup the database migrations
79
65
  def copy_migrations
80
- # Can't get this any more DRY, because we need this order.
81
- better_migration_template "create_searches.rb"
82
- better_migration_template "create_bookmarks.rb"
83
- better_migration_template "remove_editable_fields_from_bookmarks.rb"
84
- better_migration_template "add_user_types_to_bookmarks_searches.rb"
66
+ rake "blacklight:install:migrations"
85
67
  end
86
68
 
87
69
 
@@ -103,11 +85,5 @@ This generator makes the following changes to your application:
103
85
  copy_file "solr_document.rb", "app/models/solr_document.rb"
104
86
  end
105
87
 
106
- private
107
-
108
- def better_migration_template(file)
109
- migration_template "migrations/#{file}", "db/migrate/#{file}"
110
- end
111
-
112
88
  end
113
89
  end
@@ -1,6 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
- require 'blacklight/catalog'
3
-
2
+ #
4
3
  class CatalogController < ApplicationController
5
4
 
6
5
  include Blacklight::Catalog
@@ -24,13 +23,12 @@ class CatalogController < ApplicationController
24
23
  #}
25
24
 
26
25
  # solr field configuration for search results/index views
27
- config.index.show_link = 'title_display'
28
- config.index.record_display_type = 'format'
26
+ config.index.title_field = 'title_display'
27
+ config.index.display_type_field = 'format'
29
28
 
30
29
  # solr field configuration for document/show views
31
- config.show.html_title = 'title_display'
32
- config.show.heading = 'title_display'
33
- config.show.display_type = 'format'
30
+ #config.show.title_field = 'title_display'
31
+ #config.show.display_type_field = 'format'
34
32
 
35
33
  # solr fields that will be treated as facets by the blacklight application
36
34
  # The ordering of the field names is the order of the display
@@ -75,32 +73,32 @@ class CatalogController < ApplicationController
75
73
 
76
74
  # solr fields to be displayed in the index (search results) view
77
75
  # The ordering of the field names is the order of the display
78
- config.add_index_field 'title_display', :label => 'Title:'
79
- config.add_index_field 'title_vern_display', :label => 'Title:'
80
- config.add_index_field 'author_display', :label => 'Author:'
81
- config.add_index_field 'author_vern_display', :label => 'Author:'
82
- config.add_index_field 'format', :label => 'Format:'
83
- config.add_index_field 'language_facet', :label => 'Language:'
84
- config.add_index_field 'published_display', :label => 'Published:'
85
- config.add_index_field 'published_vern_display', :label => 'Published:'
86
- config.add_index_field 'lc_callnum_display', :label => 'Call number:'
76
+ config.add_index_field 'title_display', :label => 'Title'
77
+ config.add_index_field 'title_vern_display', :label => 'Title'
78
+ config.add_index_field 'author_display', :label => 'Author'
79
+ config.add_index_field 'author_vern_display', :label => 'Author'
80
+ config.add_index_field 'format', :label => 'Format'
81
+ config.add_index_field 'language_facet', :label => 'Language'
82
+ config.add_index_field 'published_display', :label => 'Published'
83
+ config.add_index_field 'published_vern_display', :label => 'Published'
84
+ config.add_index_field 'lc_callnum_display', :label => 'Call number'
87
85
 
88
86
  # solr fields to be displayed in the show (single result) view
89
87
  # The ordering of the field names is the order of the display
90
- config.add_show_field 'title_display', :label => 'Title:'
91
- config.add_show_field 'title_vern_display', :label => 'Title:'
92
- config.add_show_field 'subtitle_display', :label => 'Subtitle:'
93
- config.add_show_field 'subtitle_vern_display', :label => 'Subtitle:'
94
- config.add_show_field 'author_display', :label => 'Author:'
95
- config.add_show_field 'author_vern_display', :label => 'Author:'
96
- config.add_show_field 'format', :label => 'Format:'
97
- config.add_show_field 'url_fulltext_display', :label => 'URL:'
98
- config.add_show_field 'url_suppl_display', :label => 'More Information:'
99
- config.add_show_field 'language_facet', :label => 'Language:'
100
- config.add_show_field 'published_display', :label => 'Published:'
101
- config.add_show_field 'published_vern_display', :label => 'Published:'
102
- config.add_show_field 'lc_callnum_display', :label => 'Call number:'
103
- config.add_show_field 'isbn_t', :label => 'ISBN:'
88
+ config.add_show_field 'title_display', :label => 'Title'
89
+ config.add_show_field 'title_vern_display', :label => 'Title'
90
+ config.add_show_field 'subtitle_display', :label => 'Subtitle'
91
+ config.add_show_field 'subtitle_vern_display', :label => 'Subtitle'
92
+ config.add_show_field 'author_display', :label => 'Author'
93
+ config.add_show_field 'author_vern_display', :label => 'Author'
94
+ config.add_show_field 'format', :label => 'Format'
95
+ config.add_show_field 'url_fulltext_display', :label => 'URL'
96
+ config.add_show_field 'url_suppl_display', :label => 'More Information'
97
+ config.add_show_field 'language_facet', :label => 'Language'
98
+ config.add_show_field 'published_display', :label => 'Published'
99
+ config.add_show_field 'published_vern_display', :label => 'Published'
100
+ config.add_show_field 'lc_callnum_display', :label => 'Call number'
101
+ config.add_show_field 'isbn_t', :label => 'ISBN'
104
102
 
105
103
  # "fielded" search configuration. Used by pulldown among other places.
106
104
  # For supported keys in hash, see rdoc for Blacklight::SearchFields
@@ -175,6 +173,4 @@ class CatalogController < ApplicationController
175
173
  config.spell_max = 5
176
174
  end
177
175
 
178
-
179
-
180
176
  end
@@ -1,82 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
- def exportable_record
4
- "<record>
5
- <leader>01828cjm a2200409 a 4500</leader>
6
- <controlfield tag=\"001\">a4768316</controlfield>
7
- <controlfield tag=\"003\">SIRSI</controlfield>
8
- <controlfield tag=\"007\">sd fungnnmmned</controlfield>
9
- <controlfield tag=\"008\">020117p20011990xxuzz h d</controlfield>
10
-
11
- <datafield tag=\"245\" ind1=\"0\" ind2=\"0\">
12
- <subfield code=\"a\">Music for horn</subfield>
13
- <subfield code=\"h\">[sound recording] /</subfield>
14
- <subfield code=\"c\">Brahms, Beethoven, von Krufft.</subfield>
15
- </datafield>
16
-
17
- <datafield tag=\"260\" ind1=\" \" ind2=\" \">
18
- <subfield code=\"a\">[United States] :</subfield>
19
- <subfield code=\"b\">Harmonia Mundi USA,</subfield>
20
- <subfield code=\"c\">p2001.</subfield>
21
- </datafield>
22
-
23
- <datafield tag=\"700\" ind1=\"1\" ind2=\" \">
24
- <subfield code=\"a\">Greer, Lowell.</subfield>
25
- </datafield>
26
-
27
- <datafield tag=\"700\" ind1=\"1\" ind2=\" \">
28
- <subfield code=\"a\">Lubin, Steven.</subfield>
29
- </datafield>
30
-
31
- <datafield tag=\"700\" ind1=\"1\" ind2=\" \">
32
- <subfield code=\"a\">Chase, Stephanie,</subfield>
33
- <subfield code=\"d\">1957-</subfield>
34
- </datafield>
35
-
36
- <datafield tag=\"700\" ind1=\"1\" ind2=\"2\">
37
- <subfield code=\"a\">Brahms, Johannes,</subfield>
38
- <subfield code=\"d\">1833-1897.</subfield>
39
- <subfield code=\"t\">Trios,</subfield>
40
- <subfield code=\"m\">piano, violin, horn,</subfield>
41
- <subfield code=\"n\">op. 40,</subfield>
42
- <subfield code=\"r\">E? major.</subfield>
43
- </datafield>
44
-
45
- <datafield tag=\"700\" ind1=\"1\" ind2=\"2\">
46
- <subfield code=\"a\">Beethoven, Ludwig van,</subfield>
47
- <subfield code=\"d\">1770-1827.</subfield>
48
- <subfield code=\"t\">Sonatas,</subfield>
49
- <subfield code=\"m\">horn, piano,</subfield>
50
- <subfield code=\"n\">op. 17,</subfield>
51
- <subfield code=\"r\">F major.</subfield>
52
- </datafield>
53
-
54
- <datafield tag=\"700\" ind1=\"1\" ind2=\"2\">
55
- <subfield code=\"a\">Krufft, Nikolaus von,</subfield>
56
- <subfield code=\"d\">1779-1818.</subfield>
57
- <subfield code=\"t\">Sonata,</subfield>
58
- <subfield code=\"m\">horn, piano,</subfield>
59
- <subfield code=\"r\">F major.</subfield>
60
- </datafield>
61
- </record>"
62
- end
63
-
64
3
  describe BlacklightHelper do
65
4
  include ERB::Util
66
5
  include BlacklightHelper
67
6
  include Devise::TestHelpers
68
7
  def blacklight_config
69
8
  @config ||= Blacklight::Configuration.new.configure do |config|
70
- config.show.html_title = "title_display"
71
- config.show.heading = "title_display"
72
- config.show.display_type = 'format'
73
-
74
- config.index.show_link = 'title_display'
75
- config.index.record_display_type = 'format'
9
+ config.index.title_field = 'title_display'
10
+ config.index.display_type_field = 'format'
76
11
  end
77
-
78
- #CatalogController.blacklight_config
79
- #@config ||= {:show => {:html_title => 'title_display', :heading => 'title_display', :display_type => 'format'}, :index => { :show_link => 'title_display', :record_display_type => 'format' } }
80
12
  end
81
13
 
82
14
  before(:each) do
@@ -100,344 +32,6 @@ describe BlacklightHelper do
100
32
  end
101
33
  end
102
34
 
103
- describe "link_back_to_catalog" do
104
- let(:query_params) {{:q => "query", :f => "facets", :per_page => "10", :page => "2", :controller=>'catalog'}}
105
- let(:bookmarks_query_params) {{ :page => "2", :controller=>'bookmarks'}}
106
-
107
- it "should build a link tag to catalog using session[:search] for query params" do
108
- helper.stub(:current_search_session).and_return double(:query_params => query_params)
109
- tag = helper.link_back_to_catalog
110
- expect(tag).to match /q=query/
111
- expect(tag).to match /f=facets/
112
- expect(tag).to match /per_page=10/
113
- expect(tag).to match /page=2/
114
- end
115
-
116
- it "should build a link tag to bookmarks using session[:search] for query params" do
117
- helper.stub(:current_search_session).and_return double(:query_params => bookmarks_query_params)
118
- tag = helper.link_back_to_catalog
119
- expect(tag).to match /Back to Bookmarks/
120
- expect(tag).to match /\/bookmarks/
121
- expect(tag).to match /page=2/
122
- end
123
-
124
- describe "when an alternate scope is passed in" do
125
- let(:my_engine) { double("Engine") }
126
-
127
- it "should call url_for on the engine scope" do
128
- helper.stub(:current_search_session).and_return double(:query_params => query_params)
129
- expect(my_engine).to receive(:url_for).and_return(url_for(query_params))
130
- tag = helper.link_back_to_catalog(route_set: my_engine)
131
- expect(tag).to match /Back to Search/
132
- expect(tag).to match /q=query/
133
- expect(tag).to match /f=facets/
134
- expect(tag).to match /per_page=10/
135
- expect(tag).to match /page=2/
136
- end
137
- end
138
- end
139
-
140
- describe "link_to_query" do
141
- it "should build a link tag to catalog using query string (no other params)" do
142
- query = "brilliant"
143
- self.should_receive(:params).and_return({})
144
- tag = link_to_query(query)
145
- expect(tag).to match /q=#{query}/
146
- expect(tag).to match />#{query}<\/a>/
147
- end
148
- it "should build a link tag to catalog using query string and other existing params" do
149
- query = "wonderful"
150
- self.should_receive(:params).and_return({:qt => "title_search", :per_page => "50"})
151
- tag = link_to_query(query)
152
- expect(tag).to match /qt=title_search/
153
- expect(tag).to match /per_page=50/
154
- end
155
- it "should ignore existing :page param" do
156
- query = "yes"
157
- self.should_receive(:params).and_return({:page => "2", :qt => "author_search"})
158
- tag = link_to_query(query)
159
- expect(tag).to match /qt=author_search/
160
- expect(tag).to_not match /page/
161
- end
162
- it "should be html_safe" do
163
- query = "brilliant"
164
- self.should_receive(:params).and_return({:page => "2", :qt => "author_search"})
165
- tag = link_to_query(query)
166
- expect(tag).to be_html_safe
167
- end
168
- end
169
-
170
- describe "params_for_search" do
171
- def params
172
- { 'default' => 'params'}
173
- end
174
-
175
- it "should default to using the controller's params" do
176
- result = params_for_search
177
- expect(result).to eq params
178
- expect(params.object_id).to_not eq result.object_id
179
- end
180
-
181
- it "should let you pass in params to use" do
182
- source_params = { :q => 'query'}
183
- result = params_for_search(:params => source_params )
184
- expect(source_params).to eq result
185
- expect(source_params.object_id).to_not eq result.object_id
186
- end
187
-
188
- it "should not return blacklisted elements" do
189
- source_params = { :action => 'action', :controller => 'controller', :id => "id", :commit => 'commit'}
190
- result = params_for_search(:params => source_params )
191
- expect(result.keys).to_not include(:action, :controller, :commit, :id)
192
- end
193
-
194
- it "should adjust the current page if the per_page changes" do
195
- source_params = { :per_page => 20, :page => 5}
196
- result = params_for_search(:params => source_params, :per_page => 100)
197
- expect(result[:page]).to eq 1
198
- end
199
-
200
- it "should not adjust the current page if the per_page is the same as it always was" do
201
- source_params = { :per_page => 20, :page => 5}
202
- result = params_for_search(:params => source_params, :per_page => 20)
203
- expect(result[:page]).to eq 5
204
- end
205
-
206
- it "should adjust the current page if the sort changes" do
207
- source_params = { :sort => 'field_a', :page => 5}
208
- result = params_for_search(:params => source_params, :sort => 'field_b')
209
- expect(result[:page]).to eq 1
210
- end
211
-
212
- it "should not adjust the current page if the sort is the same as it always was" do
213
- source_params = { :sort => 'field_a', :page => 5}
214
- result = params_for_search(:params => source_params, :sort => 'field_a')
215
- expect(result[:page]).to eq 5
216
- end
217
-
218
- describe "omit keys parameter" do
219
- it "should omit keys by key name" do
220
- source_params = { :a => 1, :b => 2, :c => 3}
221
- result = params_for_search(:params => source_params, :omit_keys => [:a, :b] )
222
-
223
- result.keys.should_not include(:a, :b)
224
- expect(result[:c]).to eq 3
225
- end
226
-
227
- it "should remove keys if a key/value pair was passed and no values are left for that key" do
228
- source_params = { :f => ['a']}
229
- result = params_for_search(:params => source_params, :omit_keys => [{:f => 'a' }])
230
- expect(result.keys).to_not include(:f)
231
- end
232
-
233
- it "should only remove keys when a key/value pair is based that are in that pair" do
234
-
235
- source_params = { :f => ['a', 'b']}
236
- result = params_for_search(:params => source_params, :omit_keys => [{:f => 'a' }])
237
- expect(result[:f]).to_not include('a')
238
- expect(result[:f]).to include('b')
239
- end
240
- end
241
-
242
- end
243
-
244
- describe "search_as_hidden_fields" do
245
- def params
246
- {:q => "query", :sort => "sort", :per_page => "20", :search_field => "search_field", :page => 100, :arbitrary_key => "arbitrary_value", :f => {"field" => ["value1", "value2"], "other_field" => ['asdf']}, :controller => "catalog", :action => "index", :commit => "search"}
247
- end
248
- describe "for default arguments" do
249
- it "should default to omitting :page" do
250
- expect(search_as_hidden_fields).to_not have_selector("input[name='page']")
251
- end
252
- end
253
- end
254
-
255
-
256
- describe "render body class" do
257
- it "should include a serialization of the current controller name" do
258
- @controller = double("controller")
259
- @controller.stub(:controller_name).and_return("123456")
260
- @controller.stub(:action_name).and_return("abcdef")
261
-
262
- expect(render_body_class.split(' ')).to include('blacklight-123456')
263
- end
264
-
265
- it "should include a serialization of the current action name" do
266
- @controller = double("controller")
267
- @controller.stub(:controller_name).and_return("123456")
268
- @controller.stub(:action_name).and_return("abcdef")
269
-
270
- expect(render_body_class.split(' ')).to include('blacklight-123456-abcdef')
271
- end
272
- end
273
-
274
- describe "document_heading" do
275
-
276
- it "should consist of the show heading field when available" do
277
- @document = SolrDocument.new('title_display' => "A Fake Document")
278
-
279
- expect(document_heading).to eq "A Fake Document"
280
- end
281
-
282
- it "should fallback on the document id if no title is available" do
283
- @document = SolrDocument.new(:id => '123456')
284
- expect(document_heading).to eq '123456'
285
- end
286
- end
287
-
288
- describe "render_document_heading" do
289
- it "should consist of #document_heading wrapped in a <h1>" do
290
- @document = SolrDocument.new('title_display' => "A Fake Document")
291
-
292
- expect(render_document_heading).to have_selector("h4", :text => "A Fake Document", :count => 1)
293
- expect(render_document_heading).to be_html_safe
294
- end
295
-
296
- it "should have a schema.org itemprop for name" do
297
- @document = SolrDocument.new('title_display' => "A Fake Document")
298
-
299
- expect(render_document_heading).to have_selector("h4[@itemprop='name']", :text => "A Fake Document")
300
- end
301
-
302
- it "should join the values if it is an array" do
303
- @document = SolrDocument.new('title_display' => ["A Fake Document", 'Something Else'])
304
-
305
- expect(render_document_heading).to have_selector("h4", :text => "A Fake Document, Something Else", :count => 1)
306
- expect(render_document_heading).to be_html_safe
307
- end
308
- end
309
-
310
- describe "document_show_html_title" do
311
- it "should join the values if it is an array" do
312
- @document = SolrDocument.new('title_display' => ["A Fake Document", 'Something Else'])
313
- expect(document_show_html_title).to eq "A Fake Document, Something Else"
314
- end
315
- end
316
-
317
- describe "document_index_view_type" do
318
- it "should default to 'list'" do
319
- expect(document_index_view_type).to eq 'list'
320
- end
321
-
322
- it "should pluck values out of params" do
323
- blacklight_config.stub(:document_index_view_types) { ['list', 'asdf'] }
324
- params[:view] = 'asdf'
325
- expect(document_index_view_type).to eq 'asdf'
326
-
327
- params[:view] = 'not_in_list'
328
- expect(document_index_view_type).to eq 'list'
329
- end
330
-
331
- it "should pluck values from supplied params" do
332
- blacklight_config.stub(:document_index_view_types) { ['list', 'asdf'] }
333
- params[:view] = 'asdf'
334
- expect(document_index_view_type(:view => 'list')).to eq 'list'
335
- end
336
- end
337
-
338
- describe "start_over_path" do
339
- it 'should be the catalog path with the current view type' do
340
- blacklight_config.stub(:document_index_view_types) { ['list', 'abc'] }
341
- helper.stub(:blacklight_config => blacklight_config)
342
- expect(helper.start_over_path(:view => 'abc')).to eq catalog_index_url(:view => 'abc')
343
- end
344
-
345
- it 'should not include the current view type if it is the default' do
346
- blacklight_config.stub(:document_index_view_types) { ['list', 'abc'] }
347
- helper.stub(:blacklight_config => blacklight_config)
348
- expect(helper.start_over_path(:view => 'list')).to eq catalog_index_url
349
- end
350
- end
351
-
352
- describe "render_document_index" do
353
- it "should render the document_list" do
354
- @document_list = ['a', 'b']
355
- self.should_receive(:render).with(hash_including(:partial => 'document_gallery'))
356
- render_document_index_with_view 'gallery', @document_list
357
- end
358
-
359
- it "should fall back on more specific templates" do
360
- ex = ActionView::MissingTemplate.new [], '', '', '',''
361
- self.should_receive(:render).with(hash_including(:partial => 'document_gallery')).and_raise(ex)
362
- self.should_receive(:render).with(hash_including(:partial => 'catalog/document_gallery')).and_raise(ex)
363
- self.should_receive(:render).with(hash_including(:partial => 'catalog/document_list'))
364
- render_document_index_with_view 'gallery', @document_list
365
- end
366
- end
367
-
368
- describe "document_partial_name" do
369
- it "should default to 'default' when a format blank" do
370
- expect(document_partial_name({})).to eq "default"
371
- end
372
- it "should handle normal formats correctly" do
373
- expect(document_partial_name({"format" => "myformat"})).to eq "myformat"
374
- end
375
- it "should handle spaces correctly" do
376
- expect(document_partial_name({"format" => "my format"})).to eq "my_format"
377
- end
378
- it "should handle capitalization correctly" do
379
- expect(document_partial_name({"format" => "MyFormat"})).to eq "myformat"
380
- end
381
- it "should handle puncuation correctly" do
382
- expect(document_partial_name({"format" => "My.Format"})).to eq "my_format"
383
- end
384
- it "should handle multi-valued fields correctly" do
385
- expect(document_partial_name({"format" => ["My Format", "My OtherFormat"]})).to eq "my_format_my_otherformat"
386
- end
387
- it "should remove - characters because they will throw errors" do
388
- expect(document_partial_name({"format" => "My-Format"})).to eq "my_format"
389
- expect(document_partial_name({"format" => ["My-Format",["My Other-Format"]]})).to eq "my_format_my_other_format"
390
- end
391
- end
392
-
393
- describe "link_to_document" do
394
- it "should consist of the document title wrapped in a <a>" do
395
- data = {'id'=>'123456','title_display'=>['654321'] }
396
- @document = SolrDocument.new(data)
397
- expect(link_to_document(@document, { :label => :title_display })).to have_selector("a", :text => '654321', :count => 1)
398
- end
399
-
400
- it "should accept and return a string label" do
401
- data = {'id'=>'123456','title_display'=>['654321'] }
402
- @document = SolrDocument.new(data)
403
- expect(link_to_document(@document, { :label => "title_display" })).to have_selector("a", :text => 'title_display', :count => 1)
404
- end
405
-
406
- it "should accept and return a Proc" do
407
- data = {'id'=>'123456','title_display'=>['654321'] }
408
- @document = SolrDocument.new(data)
409
- expect(link_to_document(@document, { :label => Proc.new { |doc, opts| doc.get(:id) + ": " + doc.get(:title_display) } })).to have_selector("a", :text => '123456: 654321', :count => 1)
410
- end
411
- it "should return id when label is missing" do
412
- data = {'id'=>'123456'}
413
- @document = SolrDocument.new(data)
414
- expect(link_to_document(@document, { :label => :title_display })).to have_selector("a", :text => '123456', :count => 1)
415
- end
416
-
417
- it "should be html safe" do
418
- data = {'id'=>'123456'}
419
- @document = SolrDocument.new(data)
420
- expect(link_to_document(@document, { :label => :title_display })).to be_html_safe
421
- end
422
-
423
- it "should convert the counter parameter into a data- attribute" do
424
- data = {'id'=>'123456','title_display'=>['654321']}
425
- @document = SolrDocument.new(data)
426
- expect(link_to_document(@document, { :label => :title_display, :counter => 5 })).to match /data-counter="5"/
427
- end
428
-
429
- it "passes on the title attribute to the link_to_with_data method" do
430
- @document = SolrDocument.new('id'=>'123456')
431
- expect(link_to_document(@document,:label=>"Some crazy long label...",:title=>"Some crazy longer label")).to match(/title=\"Some crazy longer label\"/)
432
- end
433
-
434
- it "doesn't add an erroneous title attribute if one isn't provided" do
435
- @document = SolrDocument.new('id'=>'123456')
436
- expect(link_to_document(@document,:label=>"Some crazy long label...")).to_not match(/title=/)
437
- end
438
- end
439
-
440
-
441
35
  describe "render_link_rel_alternates" do
442
36
  class MockDocumentAppHelper
443
37
  include Blacklight::Solr::Document
@@ -504,12 +98,8 @@ describe BlacklightHelper do
504
98
  describe "with a config" do
505
99
  before do
506
100
  @config = Blacklight::Configuration.new.configure do |config|
507
- config.show.html_title = "title_display"
508
- config.show.heading = "title_display"
509
- config.show.display_type = 'format'
510
-
511
- config.index.show_link = 'title_display'
512
- config.index.record_display_type = 'format'
101
+ config.index.title_field = 'title_display'
102
+ config.index.display_type_field = 'format'
513
103
  end
514
104
 
515
105
  @document = SolrDocument.new('title_display' => "A Fake Document", 'id'=>'8')
@@ -626,7 +216,6 @@ describe BlacklightHelper do
626
216
  end
627
217
  end
628
218
 
629
-
630
219
  describe "render_document_show_field_value" do
631
220
  before do
632
221
  @config = Blacklight::Configuration.new.configure do |config|
@@ -757,7 +346,6 @@ describe BlacklightHelper do
757
346
  end
758
347
  end
759
348
 
760
-
761
349
  describe "#should_render_show_field?" do
762
350
  it "should if the document has the field value" do
763
351
  doc = double()
@@ -783,7 +371,6 @@ describe BlacklightHelper do
783
371
  end
784
372
  end
785
373
 
786
-
787
374
  describe "render_grouped_response?" do
788
375
  it "should check if the response ivar contains grouped data" do
789
376
  assign(:response, double("SolrResponse", :grouped? => true))
@@ -819,4 +406,24 @@ describe BlacklightHelper do
819
406
  expect(helper.render_field_value('a', double(:separator => nil, :itemprop => 'some-prop'))).to have_selector("span[@itemprop='some-prop']", :text => "a")
820
407
  end
821
408
  end
409
+
410
+ describe "should_show_spellcheck_suggestions?" do
411
+ before :each do
412
+ helper.stub spell_check_max: 5
413
+ end
414
+ it "should not show suggestions if there are enough results" do
415
+ response = double(total: 10)
416
+ expect(helper.should_show_spellcheck_suggestions? response).to be_false
417
+ end
418
+
419
+ it "should only show suggestions if there are very few results" do
420
+ response = double(total: 4, spelling: double(words: [1]))
421
+ expect(helper.should_show_spellcheck_suggestions? response).to be_true
422
+ end
423
+
424
+ it "should show suggestions only if there are spelling suggestions available" do
425
+ response = double(total: 4, spelling: double(words: []))
426
+ expect(helper.should_show_spellcheck_suggestions? response).to be_false
427
+ end
428
+ end
822
429
  end