blacklight 7.10.0 → 7.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +56 -7
  3. data/.rubocop_todo.yml +113 -98
  4. data/.travis.yml +0 -2
  5. data/Gemfile +0 -7
  6. data/README.md +1 -0
  7. data/VERSION +1 -1
  8. data/app/assets/javascripts/blacklight/blacklight.js +1 -2
  9. data/app/components/blacklight/document/bookmark_component.html.erb +16 -0
  10. data/app/components/blacklight/document/bookmark_component.rb +19 -0
  11. data/app/components/blacklight/document/citation_component.html.erb +9 -0
  12. data/app/components/blacklight/document/citation_component.rb +24 -0
  13. data/app/components/blacklight/document/more_like_this_component.html.erb +12 -0
  14. data/app/components/blacklight/document/more_like_this_component.rb +21 -0
  15. data/app/components/blacklight/document_component.html.erb +29 -0
  16. data/app/components/blacklight/document_component.rb +121 -0
  17. data/app/components/blacklight/document_metadata_component.html.erb +5 -0
  18. data/app/components/blacklight/document_metadata_component.rb +21 -0
  19. data/app/components/blacklight/facet_item_component.rb +6 -6
  20. data/app/components/blacklight/metadata_field_component.html.erb +8 -0
  21. data/app/components/blacklight/metadata_field_component.rb +31 -0
  22. data/app/components/blacklight/metadata_field_layout_component.html.erb +2 -0
  23. data/app/components/blacklight/metadata_field_layout_component.rb +16 -0
  24. data/app/components/blacklight/response/facet_group_component.html.erb +25 -0
  25. data/app/components/blacklight/response/facet_group_component.rb +19 -0
  26. data/app/components/blacklight/response/pagination_component.html.erb +3 -0
  27. data/app/components/blacklight/response/pagination_component.rb +17 -0
  28. data/app/components/blacklight/response/sort_component.html.erb +6 -0
  29. data/app/components/blacklight/response/sort_component.rb +16 -0
  30. data/app/components/blacklight/response/spellcheck_component.html.erb +7 -0
  31. data/app/components/blacklight/response/spellcheck_component.rb +20 -0
  32. data/app/components/blacklight/search_bar_component.html.erb +29 -0
  33. data/app/components/blacklight/search_bar_component.rb +45 -0
  34. data/app/components/blacklight/search_context_component.html.erb +10 -0
  35. data/app/components/blacklight/search_context_component.rb +30 -0
  36. data/app/components/blacklight/system/dropdown_component.html.erb +12 -0
  37. data/app/components/blacklight/system/dropdown_component.rb +42 -0
  38. data/app/components/blacklight/system/modal_component.html.erb +25 -0
  39. data/app/components/blacklight/system/modal_component.rb +9 -0
  40. data/app/controllers/concerns/blacklight/catalog.rb +5 -4
  41. data/app/controllers/concerns/blacklight/default_component_configuration.rb +2 -2
  42. data/app/controllers/concerns/blacklight/searchable.rb +11 -0
  43. data/app/helpers/blacklight/blacklight_helper_behavior.rb +14 -3
  44. data/app/helpers/blacklight/catalog_helper_behavior.rb +1 -0
  45. data/app/helpers/blacklight/component_helper_behavior.rb +2 -2
  46. data/app/helpers/blacklight/configuration_helper_behavior.rb +6 -0
  47. data/app/helpers/blacklight/facets_helper_behavior.rb +1 -1
  48. data/app/helpers/blacklight/icon_helper_behavior.rb +2 -2
  49. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +7 -10
  50. data/app/helpers/blacklight/url_helper_behavior.rb +3 -3
  51. data/app/javascript/blacklight/search_context.js +0 -1
  52. data/app/models/blacklight/icon.rb +1 -0
  53. data/app/models/concerns/blacklight/document.rb +1 -0
  54. data/app/models/record_mailer.rb +1 -1
  55. data/app/presenters/blacklight/document_presenter.rb +7 -1
  56. data/app/presenters/blacklight/field_presenter.rb +1 -0
  57. data/app/presenters/blacklight/rendering/microdata.rb +1 -1
  58. data/app/services/blacklight/field_retriever.rb +1 -0
  59. data/app/services/blacklight/search_service.rb +1 -0
  60. data/app/views/catalog/_bookmark_control.html.erb +1 -36
  61. data/app/views/catalog/_citation.html.erb +4 -25
  62. data/app/views/catalog/_did_you_mean.html.erb +1 -5
  63. data/app/views/catalog/_document.atom.builder +3 -3
  64. data/app/views/catalog/_document.html.erb +5 -5
  65. data/app/views/catalog/_facet_group.html.erb +5 -19
  66. data/app/views/catalog/_index.html.erb +1 -10
  67. data/app/views/catalog/_paginate_compact.html.erb +6 -6
  68. data/app/views/catalog/_per_page_widget.html.erb +9 -12
  69. data/app/views/catalog/_previous_next_doc.html.erb +1 -12
  70. data/app/views/catalog/_results_pagination.html.erb +1 -3
  71. data/app/views/catalog/_search_form.html.erb +6 -27
  72. data/app/views/catalog/_show.html.erb +6 -8
  73. data/app/views/catalog/_show_main_content.html.erb +19 -13
  74. data/app/views/catalog/_show_sidebar.html.erb +1 -11
  75. data/app/views/catalog/_sort_widget.html.erb +5 -12
  76. data/app/views/catalog/email.html.erb +7 -7
  77. data/app/views/catalog/email_success.html.erb +5 -12
  78. data/app/views/catalog/facet.html.erb +14 -17
  79. data/app/views/catalog/index.atom.builder +0 -1
  80. data/app/views/catalog/sms.html.erb +7 -7
  81. data/app/views/catalog/sms_success.html.erb +5 -12
  82. data/blacklight.gemspec +3 -2
  83. data/config/i18n-tasks.yml +3 -0
  84. data/config/locales/blacklight.ar.yml +2 -0
  85. data/config/locales/blacklight.de.yml +2 -0
  86. data/config/locales/blacklight.en.yml +2 -0
  87. data/config/locales/blacklight.es.yml +4 -2
  88. data/config/locales/blacklight.fr.yml +2 -0
  89. data/config/locales/blacklight.hu.yml +2 -0
  90. data/config/locales/blacklight.it.yml +2 -0
  91. data/config/locales/blacklight.nl.yml +2 -0
  92. data/config/locales/blacklight.pt-BR.yml +2 -0
  93. data/config/locales/blacklight.sq.yml +2 -0
  94. data/config/locales/blacklight.zh.yml +2 -0
  95. data/lib/blacklight.rb +10 -0
  96. data/lib/blacklight/configuration.rb +8 -3
  97. data/lib/blacklight/configuration/fields.rb +5 -7
  98. data/lib/blacklight/engine.rb +1 -1
  99. data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -0
  100. data/lib/blacklight/search_state.rb +21 -7
  101. data/lib/blacklight/solr/response.rb +1 -0
  102. data/lib/blacklight/solr/response/facets.rb +9 -8
  103. data/lib/generators/blacklight/models_generator.rb +2 -0
  104. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -0
  105. data/lib/railties/blacklight.rake +18 -13
  106. data/package.json +1 -1
  107. data/spec/components/blacklight/constraint_layout_component_spec.rb +1 -0
  108. data/spec/components/blacklight/document_component_spec.rb +129 -0
  109. data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
  110. data/spec/components/blacklight/metadata_field_component_spec.rb +41 -0
  111. data/spec/controllers/blacklight/search_fields_spec.rb +2 -2
  112. data/spec/controllers/catalog_controller_spec.rb +20 -0
  113. data/spec/features/search_context_spec.rb +12 -2
  114. data/spec/features/search_filters_spec.rb +4 -0
  115. data/spec/features/search_results_spec.rb +1 -0
  116. data/spec/features/sitelinks_search_box.rb +1 -0
  117. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +3 -0
  118. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +1 -0
  119. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +2 -0
  120. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +1 -1
  121. data/spec/helpers/blacklight_helper_spec.rb +14 -1
  122. data/spec/helpers/catalog_helper_spec.rb +1 -4
  123. data/spec/lib/blacklight/search_state_spec.rb +32 -0
  124. data/spec/models/blacklight/configuration_spec.rb +5 -0
  125. data/spec/models/blacklight/document/cache_key_spec.rb +1 -0
  126. data/spec/models/blacklight/document/email_spec.rb +2 -0
  127. data/spec/models/blacklight/document/sms_spec.rb +2 -0
  128. data/spec/models/blacklight/facet_paginator_spec.rb +3 -0
  129. data/spec/models/blacklight/icon_spec.rb +6 -0
  130. data/spec/models/blacklight/solr/document_spec.rb +10 -0
  131. data/spec/models/blacklight/solr/response/facets_spec.rb +1 -1
  132. data/spec/models/blacklight/solr/response/group_response_spec.rb +2 -0
  133. data/spec/models/blacklight/solr/search_builder_spec.rb +10 -0
  134. data/spec/models/record_mailer_spec.rb +9 -0
  135. data/spec/models/search_spec.rb +1 -0
  136. data/spec/presenters/blacklight/show_presenter_spec.rb +8 -0
  137. data/spec/routing/catalog_routing_spec.rb +4 -0
  138. data/spec/services/blacklight/search_service_spec.rb +7 -0
  139. data/spec/spec_helper.rb +1 -1
  140. data/spec/views/catalog/_document.html.erb_spec.rb +13 -11
  141. data/spec/views/catalog/_facet_group.html.erb_spec.rb +1 -0
  142. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -0
  143. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +4 -0
  144. data/spec/views/catalog/index.atom.builder_spec.rb +40 -3
  145. data/spec/views/catalog/show.html.erb_spec.rb +14 -0
  146. data/tasks/blacklight.rake +7 -7
  147. metadata +56 -6
@@ -16,24 +16,38 @@ module Blacklight
16
16
  # @param [Blacklight::Config] blacklight_config
17
17
  # @param [ApplicationController] controller used for the routing helpers
18
18
  def initialize(params, blacklight_config, controller = nil)
19
+ @params = self.class.normalize_params(params)
20
+ @blacklight_config = blacklight_config
21
+ @controller = controller
22
+ end
23
+
24
+ def self.normalize_params(untrusted_params = {})
25
+ params = untrusted_params
26
+
19
27
  if params.respond_to?(:to_unsafe_h)
20
28
  # This is the typical (not-ActionView::TestCase) code path.
21
- @params = params.to_unsafe_h
29
+ params = params.to_unsafe_h
22
30
  # In Rails 5 to_unsafe_h returns a HashWithIndifferentAccess, in Rails 4 it returns Hash
23
- @params = @params.with_indifferent_access if @params.instance_of? Hash
31
+ params = params.with_indifferent_access if params.instance_of? Hash
24
32
  elsif params.is_a? Hash
25
33
  # This is an ActionView::TestCase workaround for Rails 4.2.
26
- @params = params.dup.with_indifferent_access
34
+ params = params.dup.with_indifferent_access
27
35
  else
28
- @params = params.dup.to_h.with_indifferent_access
36
+ params = params.dup.to_h.with_indifferent_access
29
37
  end
30
38
 
31
- @blacklight_config = blacklight_config
32
- @controller = controller
39
+ # Normalize facet parameters mangled by facebook
40
+ if params[:f].is_a?(Hash) && params[:f].values.any? { |x| x.is_a?(Hash) }
41
+ params[:f] = params[:f].transform_values do |value|
42
+ value.is_a?(Hash) ? value.values : value
43
+ end
44
+ end
45
+
46
+ params
33
47
  end
34
48
 
35
49
  def to_hash
36
- @params
50
+ @params.deep_dup
37
51
  end
38
52
  alias to_h to_hash
39
53
 
@@ -19,6 +19,7 @@ class Blacklight::Solr::Response < ActiveSupport::HashWithIndifferentAccess
19
19
 
20
20
  attr_reader :request_params
21
21
  attr_accessor :blacklight_config, :options
22
+
22
23
  delegate :document_factory, to: :blacklight_config
23
24
 
24
25
  def initialize(data, request_params, options = {})
@@ -29,6 +29,7 @@ module Blacklight::Solr::Response::Facets
29
29
  # represents a facet; which is a field and its values
30
30
  class FacetField
31
31
  attr_reader :name, :items
32
+
32
33
  def initialize name, items, options = {}
33
34
  @name = name
34
35
  @items = items
@@ -138,14 +139,14 @@ module Blacklight::Solr::Response::Facets
138
139
  if solr_list.values.first.is_a? Hash
139
140
  solr_list
140
141
  else
141
- solr_list.each_with_object({}) do |(key, values), hash|
142
- hash[key] = if values.first.is_a? Array
143
- # arrarr
144
- Hash[values]
145
- else
146
- # flat
147
- Hash[values.each_slice(2).to_a]
148
- end
142
+ solr_list.transform_values do |values|
143
+ if values.first.is_a? Array
144
+ # arrarr
145
+ Hash[values]
146
+ else
147
+ # flat
148
+ Hash[values.each_slice(2).to_a]
149
+ end
149
150
  end
150
151
  end
151
152
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rails/generators'
3
3
  require 'rails/generators/migration'
4
+ require 'blacklight/version'
4
5
 
5
6
  module Blacklight
6
7
  class ModelsGenerator < Rails::Generators::Base
@@ -17,6 +18,7 @@ module Blacklight
17
18
  # Copy all files in templates/config directory to host config
18
19
  def create_configuration_files
19
20
  copy_file "config/blacklight.yml", "config/blacklight.yml"
21
+ gsub_file 'config/blacklight.yml', '__VERSION__', Blacklight::VERSION
20
22
  end
21
23
 
22
24
  # Setup the database migrations
@@ -1,3 +1,4 @@
1
+ load_defaults: __VERSION__
1
2
  development:
2
3
  adapter: solr
3
4
  url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:8983/solr/blacklight-core" %>
@@ -12,11 +12,18 @@ namespace :blacklight do
12
12
  end
13
13
 
14
14
  namespace :index do
15
- desc "Put sample data into solr"
16
- task seed: [:environment] do
15
+ desc <<-EODESC.gsub(/\n\s*/, ' ')
16
+ Index sample data (from FILE, ./spec/fixtures/sample_solr_documents.yml in this application,
17
+ or the test fixtures from blacklight) into solr.
18
+ EODESC
19
+ task seed: [:environment] do
17
20
  require 'yaml'
18
21
 
19
- docs = YAML.safe_load(File.open(File.join(Blacklight.root, 'spec', 'fixtures', 'sample_solr_documents.yml')))
22
+ app_file = Rails.root && Rails.root + 'spec/fixtures/sample_solr_documents.yml'
23
+ file = ENV['FILE'] ||
24
+ (app_file && File.exist?(app_file) && app_file) ||
25
+ File.join(Blacklight.root, 'spec', 'fixtures', 'sample_solr_documents.yml')
26
+ docs = YAML.safe_load(File.open(file))
20
27
  conn = Blacklight.default_index.connection
21
28
  conn.add docs
22
29
  conn.commit
@@ -26,18 +33,16 @@ namespace :blacklight do
26
33
  namespace :check do
27
34
  desc "Check the Solr connection and controller configuration"
28
35
  task :solr, [:controller_name] => [:environment] do
29
- begin
30
- conn = Blacklight.default_index
31
- if conn.ping
32
- puts "OK"
33
- else
34
- puts "Unable to reach: #{conn.uri}"
35
- exit 1
36
- end
37
- rescue => e
38
- puts e.to_s
36
+ conn = Blacklight.default_index
37
+ if conn.ping
38
+ puts "OK"
39
+ else
40
+ puts "Unable to reach: #{conn.uri}"
39
41
  exit 1
40
42
  end
43
+ rescue => e
44
+ puts e.to_s
45
+ exit 1
41
46
  end
42
47
 
43
48
  task :controller, [:controller_name] => [:environment] do |_, args|
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blacklight-frontend",
3
- "version": "7.7.0",
3
+ "version": "7.10.0",
4
4
  "description": "[![Build Status](https://travis-ci.org/projectblacklight/blacklight.png?branch=master)](https://travis-ci.org/projectblacklight/blacklight) [![Gem Version](https://badge.fury.io/rb/blacklight.png)](http://badge.fury.io/rb/blacklight) [![Coverage Status](https://coveralls.io/repos/github/projectblacklight/blacklight/badge.svg?branch=master)](https://coveralls.io/github/projectblacklight/blacklight?branch=master)",
5
5
  "main": "app/assets/javascripts/blacklight",
6
6
  "scripts": {
@@ -36,6 +36,7 @@ RSpec.describe Blacklight::ConstraintLayoutComponent, type: :component do
36
36
  expect(s).to have_selector(".remove[href='http://remove']")
37
37
  end
38
38
  end
39
+
39
40
  it "has an accessible remove label" do
40
41
  expect(rendered).to have_selector(".remove") do |s|
41
42
  expect(s).to have_selector('.sr-only', text: 'Remove constraint my label: my value')
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Blacklight::DocumentComponent, type: :component do
6
+ subject(:component) { described_class.new(document: document, **attr) }
7
+
8
+ let(:attr) { {} }
9
+ let(:view_context) { controller.view_context }
10
+ let(:render) do
11
+ component.render_in(view_context)
12
+ end
13
+
14
+ let(:rendered) do
15
+ Capybara::Node::Simple.new(render)
16
+ end
17
+
18
+ let(:document) do
19
+ SolrDocument.new(
20
+ id: 'x',
21
+ thumbnail_path_ss: 'http://example.com/image.jpg',
22
+ title_tsim: 'Title',
23
+ isbn_ssim: ['Value']
24
+ )
25
+ end
26
+
27
+ let(:blacklight_config) do
28
+ CatalogController.blacklight_config.deep_copy.tap do |config|
29
+ config.track_search_session = false
30
+ config.index.thumbnail_field = 'thumbnail_path_ss'
31
+ config.index.document_actions[:bookmark].partial = '/catalog/bookmark_control.html.erb'
32
+ end
33
+ end
34
+
35
+ before do
36
+ allow(controller).to receive(:current_or_guest_user).and_return(User.new)
37
+ allow(controller).to receive(:blacklight_config).and_return(blacklight_config)
38
+ allow(view_context).to receive(:search_session).and_return({})
39
+ allow(view_context).to receive(:current_search_session).and_return(nil)
40
+ allow(view_context).to receive(:current_bookmarks).and_return([])
41
+ end
42
+
43
+ it 'has some defined content areas' do
44
+ component.with(:title, 'Title')
45
+ component.with(:metadata, 'Metadata')
46
+ component.with(:thumbnail, 'Thumbnail')
47
+ component.with(:actions, 'Actions')
48
+
49
+ expect(rendered).to have_content 'Title'
50
+ expect(rendered).to have_content 'Metadata'
51
+ expect(rendered).to have_content 'Thumbnail'
52
+ expect(rendered).to have_content 'Actions'
53
+ end
54
+
55
+ it 'has schema.org properties' do
56
+ component.with(:body, '-')
57
+
58
+ expect(rendered).to have_selector 'article[@itemtype="http://schema.org/Thing"]'
59
+ expect(rendered).to have_selector 'article[@itemscope]'
60
+ end
61
+
62
+ context 'with a provided body' do
63
+ it 'opts-out of normal component content' do
64
+ component.with(:body, 'Body content')
65
+
66
+ expect(rendered).to have_content 'Body content'
67
+ expect(rendered).not_to have_selector 'header'
68
+ expect(rendered).not_to have_selector 'dl'
69
+ end
70
+ end
71
+
72
+ context 'index view' do
73
+ let(:attr) { { counter: 5 } }
74
+
75
+ it 'has data properties' do
76
+ component.with(:body, '-')
77
+
78
+ expect(rendered).to have_selector 'article[@data-document-id="x"]'
79
+ expect(rendered).to have_selector 'article[@data-document-counter="5"]'
80
+ end
81
+
82
+ it 'renders a linked title' do
83
+ expect(rendered).to have_link 'Title', href: '/catalog/x'
84
+ end
85
+
86
+ it 'renders a counter with the title' do
87
+ expect(rendered).to have_selector 'header', text: '5. Title'
88
+ end
89
+
90
+ it 'renders actions' do
91
+ expect(rendered).to have_selector '.index-document-functions'
92
+ end
93
+
94
+ it 'renders a thumbnail' do
95
+ expect(rendered).to have_selector 'a[href="/catalog/x"] img[src="http://example.com/image.jpg"]'
96
+ end
97
+ end
98
+
99
+ context 'show view' do
100
+ let(:attr) { { title_component: :h1, show: true } }
101
+
102
+ before do
103
+ allow(view_context).to receive(:action_name).and_return('show')
104
+ end
105
+
106
+ it 'renders with an id' do
107
+ component.with(:body, '-')
108
+
109
+ expect(rendered).to have_selector 'article#document'
110
+ end
111
+
112
+ it 'renders a title' do
113
+ expect(rendered).to have_selector 'h1', text: 'Title'
114
+ end
115
+
116
+ it 'renders with show-specific metadata' do
117
+ expect(rendered).to have_selector 'dl.document-metadata'
118
+ expect(rendered).to have_selector 'dt', text: 'ISBN:'
119
+ expect(rendered).to have_selector 'dd', text: 'Value'
120
+ end
121
+ end
122
+
123
+ it 'renders metadata' do
124
+ expect(rendered).to have_selector 'dl.document-metadata'
125
+ expect(rendered).to have_selector 'dt', text: 'Title:'
126
+ expect(rendered).to have_selector 'dd', text: 'Title'
127
+ expect(rendered).not_to have_selector 'dt', text: 'ISBN:'
128
+ end
129
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Blacklight::MetadataFieldComponent, type: :component do
6
+ subject(:render) do
7
+ render_inline(described_class.new(field: field))
8
+ end
9
+
10
+ let(:view_context) { controller.view_context }
11
+ let(:document) { SolrDocument.new('field' => ['Value']) }
12
+ let(:field_config) { Blacklight::Configuration::Field.new(key: 'field', field: 'field', label: 'Field label') }
13
+
14
+ let(:field) do
15
+ Blacklight::FieldPresenter.new(view_context, document, field_config)
16
+ end
17
+
18
+ let(:rendered) do
19
+ Capybara::Node::Simple.new(render)
20
+ end
21
+
22
+ it 'renders the field label' do
23
+ expect(rendered).to have_selector 'dt.blacklight-field', text: 'Field label'
24
+ end
25
+
26
+ it 'renders the field value' do
27
+ expect(rendered).to have_selector 'dd.blacklight-field', text: 'Value'
28
+ end
29
+
30
+ context 'from a show view' do
31
+ subject(:render) do
32
+ render_inline(described_class.new(field: field, show: true))
33
+ end
34
+
35
+ it 'renders the right field label' do
36
+ allow(field).to receive(:label).with('show').and_return('custom label')
37
+
38
+ expect(rendered).to have_selector 'dt.blacklight-field', text: 'custom label'
39
+ end
40
+ end
41
+ end
@@ -39,7 +39,7 @@ RSpec.describe Blacklight::SearchFields do
39
39
  config.add_search_field label: 'All Fields', qt: 'all_fields'
40
40
  config.add_search_field 'title', qt: 'title_search'
41
41
  end)
42
- end .to raise_error ArgumentError
42
+ end.to raise_error ArgumentError
43
43
  end
44
44
  end
45
45
 
@@ -54,7 +54,7 @@ RSpec.describe Blacklight::SearchFields do
54
54
  config.add_search_field 'my_key', label: 'All Fields'
55
55
  config.add_search_field 'my_key', label: 'title'
56
56
  end)
57
- end .to raise_error RuntimeError
57
+ end.to raise_error RuntimeError
58
58
  end
59
59
  end
60
60
  end
@@ -30,11 +30,13 @@ RSpec.describe CatalogController, api: true do
30
30
  expect(assigns(:response).docs).not_to be_empty
31
31
  assert_facets_have_values(assigns(:response).aggregations)
32
32
  end
33
+
33
34
  it "has docs and facets for existing facet value", integration: true do
34
35
  get :index, params: { f: { "format" => 'Book' } }
35
36
  expect(assigns(:response).docs).not_to be_empty
36
37
  assert_facets_have_values(assigns(:response).aggregations)
37
38
  end
39
+
38
40
  it "has docs and facets for non-default results per page", integration: true do
39
41
  num_per_page = 7
40
42
  get :index, params: { per_page: num_per_page }
@@ -98,6 +100,7 @@ RSpec.describe CatalogController, api: true do
98
100
  get :index
99
101
  expect(assigns(:response).docs).not_to be_empty
100
102
  end
103
+
101
104
  it "gets facets when no query", integration: true do
102
105
  get :index
103
106
  assert_facets_have_values(assigns(:response).aggregations)
@@ -237,6 +240,11 @@ RSpec.describe CatalogController, api: true do
237
240
  expect(session[:search]['per_page']).to eq "15"
238
241
  end
239
242
 
243
+ it "records the document id being viewed" do
244
+ put :track, params: { id: doc_id, counter: 3, document_id: 1234 }
245
+ expect(session[:search]['document_id']).to eq "1234"
246
+ end
247
+
240
248
  it "redirects to show action for doc id" do
241
249
  put :track, params: { id: doc_id, counter: 3 }
242
250
  assert_redirected_to(solr_document_path(doc_id))
@@ -456,6 +464,7 @@ RSpec.describe CatalogController, api: true do
456
464
  get :suggest, params: { format: 'json' }
457
465
  expect(response.body).to eq [].to_json
458
466
  end
467
+
459
468
  it 'returns suggestions' do
460
469
  get :suggest, params: { format: 'json', q: 'new' }
461
470
  json = JSON.parse(response.body)
@@ -485,14 +494,17 @@ RSpec.describe CatalogController, api: true do
485
494
  post :email, params: { id: doc_id }
486
495
  expect(request.flash[:error]).to eq "You must enter a recipient in order to send this message"
487
496
  end
497
+
488
498
  it "gives an error if the email address is not valid" do
489
499
  post :email, params: { id: doc_id, to: 'test_bad_email' }
490
500
  expect(request.flash[:error]).to eq "You must enter a valid email address"
491
501
  end
502
+
492
503
  it "does not give error if no Message parameter is set" do
493
504
  post :email, params: { id: doc_id, to: 'test_email@projectblacklight.org' }
494
505
  expect(request.flash[:error]).to be_nil
495
506
  end
507
+
496
508
  it "redirects back to the record upon success" do
497
509
  allow(RecordMailer).to receive(:email_record)
498
510
  .with(anything, { to: 'test_email@projectblacklight.org', message: 'xyz' }, hash_including(host: 'test.host'))
@@ -501,6 +513,7 @@ RSpec.describe CatalogController, api: true do
501
513
  expect(request.flash[:error]).to be_nil
502
514
  expect(request).to redirect_to(solr_document_path(doc_id))
503
515
  end
516
+
504
517
  it "renders email_success for XHR requests" do
505
518
  post :email, xhr: true, params: { id: doc_id, to: 'test_email@projectblacklight.org' }
506
519
  expect(request).to render_template 'email_success'
@@ -513,23 +526,28 @@ RSpec.describe CatalogController, api: true do
513
526
  post :sms, params: { id: doc_id, carrier: 'att' }
514
527
  expect(request.flash[:error]).to eq "You must enter a recipient's phone number in order to send this message"
515
528
  end
529
+
516
530
  it "gives an error when a carrier is not provided" do
517
531
  post :sms, params: { id: doc_id, to: '5555555555', carrier: '' }
518
532
  expect(request.flash[:error]).to eq "You must select a carrier"
519
533
  end
534
+
520
535
  it "gives an error when the phone number is not 10 digits" do
521
536
  post :sms, params: { id: doc_id, to: '555555555', carrier: 'txt.att.net' }
522
537
  expect(request.flash[:error]).to eq "You must enter a valid 10 digit phone number"
523
538
  end
539
+
524
540
  it "gives an error when the carrier is not in our list of carriers" do
525
541
  post :sms, params: { id: doc_id, to: '5555555555', carrier: 'no-such-carrier' }
526
542
  expect(request.flash[:error]).to eq "You must enter a valid carrier"
527
543
  end
544
+
528
545
  it "allows punctuation in phone number" do
529
546
  post :sms, params: { id: doc_id, to: '(555) 555-5555', carrier: 'txt.att.net' }
530
547
  expect(request.flash[:error]).to be_nil
531
548
  expect(request).to redirect_to(solr_document_path(doc_id))
532
549
  end
550
+
533
551
  it "sends to the appropriate carrier email address" do
534
552
  expect(RecordMailer)
535
553
  .to receive(:sms_record)
@@ -537,11 +555,13 @@ RSpec.describe CatalogController, api: true do
537
555
  .and_return double(deliver: nil)
538
556
  post :sms, params: { id: doc_id, to: '5555555555', carrier: 'txt.att.net' }
539
557
  end
558
+
540
559
  it "redirects back to the record upon success" do
541
560
  post :sms, params: { id: doc_id, to: '5555555555', carrier: 'txt.att.net' }
542
561
  expect(request.flash[:error]).to eq nil
543
562
  expect(request).to redirect_to(solr_document_path(doc_id))
544
563
  end
564
+
545
565
  it "renders sms_success template for XHR requests" do
546
566
  post :sms, xhr: true, params: { id: doc_id, to: '5555555555', carrier: 'txt.att.net' }
547
567
  expect(request).to render_template 'sms_success'