blacklight 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/.solr_wrapper +5 -0
- data/.travis.yml +3 -5
- data/Gemfile +3 -3
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/core.js +19 -5
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +48 -20
- data/app/helpers/blacklight/configuration_helper_behavior.rb +1 -1
- data/app/helpers/blacklight/url_helper_behavior.rb +2 -1
- data/app/presenters/blacklight/document_presenter.rb +58 -150
- data/app/presenters/blacklight/field_presenter.rb +31 -0
- data/app/presenters/blacklight/index_presenter.rb +69 -0
- data/app/presenters/blacklight/link_alternate_presenter.rb +29 -0
- data/app/presenters/blacklight/rendering/abstract_step.rb +24 -0
- data/app/presenters/blacklight/rendering/helper_method.rb +23 -0
- data/app/presenters/blacklight/rendering/join.rb +16 -0
- data/app/presenters/blacklight/rendering/link_to_facet.rb +35 -0
- data/app/presenters/blacklight/rendering/microdata.rb +17 -0
- data/app/presenters/blacklight/rendering/pipeline.rb +32 -0
- data/app/presenters/blacklight/rendering/terminator.rb +9 -0
- data/app/presenters/blacklight/show_presenter.rb +93 -0
- data/app/services/blacklight/field_retriever.rb +58 -0
- data/app/views/catalog/_document_default.atom.builder +2 -3
- data/app/views/catalog/_document_default.rss.builder +2 -2
- data/app/views/kaminari/blacklight/_next_page.html.erb +9 -3
- data/app/views/kaminari/blacklight/_prev_page.html.erb +10 -3
- data/lib/blacklight/configuration.rb +15 -3
- data/lib/blacklight/configuration/null_field.rb +13 -0
- data/lib/blacklight/configuration/view_config.rb +6 -0
- data/lib/generators/blacklight/templates/catalog_controller.rb +1 -1
- data/lib/generators/blacklight/templates/config/blacklight.yml +1 -1
- data/lib/generators/blacklight/templates/config/jetty.yml +1 -1
- data/spec/controllers/alternate_controller_spec.rb +2 -2
- data/spec/controllers/application_controller_spec.rb +1 -1
- data/spec/controllers/blacklight/facet_spec.rb +3 -3
- data/spec/controllers/blacklight/search_fields_spec.rb +7 -7
- data/spec/controllers/blacklight/search_helper_spec.rb +44 -44
- data/spec/controllers/blacklight/suggest_search_spec.rb +1 -1
- data/spec/controllers/bookmarks_controller_spec.rb +6 -6
- data/spec/controllers/catalog_controller_spec.rb +125 -125
- data/spec/controllers/saved_searches_controller_spec.rb +4 -9
- data/spec/controllers/search_history_controller_spec.rb +3 -6
- data/spec/controllers/suggest_controller_spec.rb +2 -2
- data/spec/features/alternate_controller_spec.rb +3 -3
- data/spec/features/bookmarks_spec.rb +6 -6
- data/spec/features/did_you_mean_spec.rb +10 -10
- data/spec/features/facets_spec.rb +4 -4
- data/spec/features/record_view_spec.rb +4 -4
- data/spec/features/saved_searches_spec.rb +4 -4
- data/spec/features/search_context_spec.rb +4 -4
- data/spec/features/search_filters_spec.rb +10 -10
- data/spec/features/search_formats_spec.rb +2 -2
- data/spec/features/search_history_spec.rb +5 -5
- data/spec/features/search_pagination_spec.rb +4 -4
- data/spec/features/search_results_spec.rb +7 -7
- data/spec/features/search_sort_spec.rb +2 -2
- data/spec/features/search_spec.rb +6 -6
- data/spec/helpers/blacklight_helper_spec.rb +105 -65
- data/spec/helpers/catalog_helper_spec.rb +36 -36
- data/spec/helpers/configuration_helper_spec.rb +28 -28
- data/spec/helpers/facets_helper_spec.rb +39 -39
- data/spec/helpers/hash_as_hidden_fields_spec.rb +1 -1
- data/spec/helpers/render_constraints_helper_spec.rb +1 -1
- data/spec/helpers/search_history_constraints_helper_spec.rb +7 -7
- data/spec/helpers/url_helper_spec.rb +20 -17
- data/spec/lib/blacklight/search_state_spec.rb +2 -2
- data/spec/lib/blacklight/utils_spec.rb +15 -15
- data/spec/lib/blacklight_spec.rb +1 -1
- data/spec/lib/tasks/blacklight_task_spec.rb +1 -1
- data/spec/models/blacklight/configurable_spec.rb +3 -3
- data/spec/models/blacklight/configuration_spec.rb +52 -52
- data/spec/models/blacklight/document_spec.rb +10 -10
- data/spec/models/blacklight/facet_paginator_spec.rb +5 -5
- data/spec/models/blacklight/search_builder_spec.rb +34 -34
- data/spec/models/blacklight/user_spec.rb +4 -4
- data/spec/models/bookmark_spec.rb +5 -5
- data/spec/models/record_mailer_spec.rb +11 -11
- data/spec/models/search_spec.rb +1 -1
- data/spec/models/solr_document_spec.rb +4 -4
- data/spec/presenters/document_presenter_spec.rb +94 -50
- data/spec/presenters/index_presenter_spec.rb +147 -0
- data/spec/presenters/pipeline_spec.rb +28 -0
- data/spec/presenters/show_presenter_spec.rb +287 -0
- data/spec/routing/catalog_routing_spec.rb +11 -11
- data/spec/spec_helper.rb +10 -1
- data/spec/support/backport_test.rb +38 -0
- data/spec/test_app_templates/Gemfile.extra +2 -10
- data/spec/views/_user_util_links.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -3
- data/spec/views/catalog/_constraints_element.html.erb_spec.rb +5 -5
- data/spec/views/catalog/_document.html.erb_spec.rb +2 -2
- data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_facet_layout.html.erb_spec.rb +4 -4
- data/spec/views/catalog/_facets.html.erb_spec.rb +4 -4
- data/spec/views/catalog/_index_default.erb_spec.rb +5 -4
- data/spec/views/catalog/_index_header_default.html.erb_spec.rb +4 -3
- data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +3 -3
- data/spec/views/catalog/_search_header.erb_spec.rb +1 -1
- data/spec/views/catalog/_show_default.erb_spec.rb +6 -5
- data/spec/views/catalog/_show_sidebar.erb_spec.rb +2 -1
- data/spec/views/catalog/_show_tools.html.erb_spec.rb +8 -8
- data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +2 -2
- data/spec/views/catalog/_thumbnail_default.erb_spec.rb +3 -2
- data/spec/views/catalog/_view_type_group.html.erb_spec.rb +3 -3
- data/spec/views/catalog/facet.html.erb_spec.rb +3 -3
- data/spec/views/catalog/index.atom.builder_spec.rb +15 -14
- data/spec/views/catalog/index.html.erb_spec.rb +3 -3
- data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
- data/spec/views/catalog/show.html.erb_spec.rb +5 -4
- data/tasks/blacklight.rake +1 -1
- metadata +25 -4
- data/config/jetty.yml +0 -13
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe Blacklight::Rendering::Pipeline do
|
|
5
|
+
include Capybara::RSpecMatchers
|
|
6
|
+
let(:document) { double }
|
|
7
|
+
let(:context) { double }
|
|
8
|
+
let(:options) { double }
|
|
9
|
+
let(:presenter) { described_class.new(values, field_config, document, context, options) }
|
|
10
|
+
describe "render" do
|
|
11
|
+
subject { presenter.render }
|
|
12
|
+
let(:values) { ['a', 'b'] }
|
|
13
|
+
let(:field_config) { Blacklight::Configuration::NullField.new }
|
|
14
|
+
it { is_expected.to eq "a and b" }
|
|
15
|
+
|
|
16
|
+
context "when separator_options are in the config" do
|
|
17
|
+
let(:values) { ['c', 'd'] }
|
|
18
|
+
let(:field_config) { Blacklight::Configuration::NullField.new(separator: nil, itemprop: nil, separator_options: { two_words_connector: '; '}) }
|
|
19
|
+
it { is_expected.to eq "c; d" }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when itemprop is in the config" do
|
|
23
|
+
let(:values) { ['a'] }
|
|
24
|
+
let(:field_config) { Blacklight::Configuration::NullField.new(separator: nil, itemprop: 'some-prop', separator_options: nil) }
|
|
25
|
+
it { is_expected.to have_selector("span[@itemprop='some-prop']", :text => "a") }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe Blacklight::ShowPresenter do
|
|
5
|
+
include Capybara::RSpecMatchers
|
|
6
|
+
let(:request_context) { double }
|
|
7
|
+
let(:config) { Blacklight::Configuration.new }
|
|
8
|
+
|
|
9
|
+
subject { presenter }
|
|
10
|
+
let(:presenter) { described_class.new(document, request_context, config) }
|
|
11
|
+
let(:parameter_class) { ActionController::Parameters }
|
|
12
|
+
let(:params) { parameter_class.new }
|
|
13
|
+
let(:search_state) { Blacklight::SearchState.new(params, config) }
|
|
14
|
+
|
|
15
|
+
let(:document) do
|
|
16
|
+
SolrDocument.new(id: 1,
|
|
17
|
+
'link_to_search_true' => 'x',
|
|
18
|
+
'link_to_search_named' => 'x',
|
|
19
|
+
'qwer' => 'document qwer value',
|
|
20
|
+
'mnbv' => 'document mnbv value')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
before do
|
|
24
|
+
allow(request_context).to receive(:search_state).and_return(search_state)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "link_rel_alternates" do
|
|
28
|
+
before do
|
|
29
|
+
class MockDocument
|
|
30
|
+
include Blacklight::Solr::Document
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module MockExtension
|
|
34
|
+
def self.extended(document)
|
|
35
|
+
document.will_export_as(:weird, "application/weird")
|
|
36
|
+
document.will_export_as(:weirder, "application/weirder")
|
|
37
|
+
document.will_export_as(:weird_dup, "application/weird")
|
|
38
|
+
end
|
|
39
|
+
def export_as_weird ; "weird" ; end
|
|
40
|
+
def export_as_weirder ; "weirder" ; end
|
|
41
|
+
def export_as_weird_dup ; "weird_dup" ; end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
MockDocument.use_extension(MockExtension)
|
|
45
|
+
|
|
46
|
+
def mock_document_app_helper_url *args
|
|
47
|
+
solr_document_url(*args)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
allow(request_context).to receive(:polymorphic_url) do |_, opts|
|
|
51
|
+
"url.#{opts[:format]}"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
let(:document) { MockDocument.new(id: "MOCK_ID1") }
|
|
56
|
+
|
|
57
|
+
context "with no arguments" do
|
|
58
|
+
subject { presenter.link_rel_alternates }
|
|
59
|
+
|
|
60
|
+
it "generates <link rel=alternate> tags" do
|
|
61
|
+
tmp_value = Capybara.ignore_hidden_elements
|
|
62
|
+
Capybara.ignore_hidden_elements = false
|
|
63
|
+
document.export_formats.each_pair do |format, spec|
|
|
64
|
+
expect(subject).to have_selector("link[href$='.#{ format }']") do |matches|
|
|
65
|
+
expect(matches).to have(1).match
|
|
66
|
+
tag = matches[0]
|
|
67
|
+
expect(tag.attributes["rel"].value).to eq "alternate"
|
|
68
|
+
expect(tag.attributes["title"].value).to eq format.to_s
|
|
69
|
+
expect(tag.attributes["href"].value).to eq mock_document_app_helper_url(document, format: format)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
Capybara.ignore_hidden_elements = tmp_value
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it { is_expected.to be_html_safe }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
context "with unique: true" do
|
|
79
|
+
subject { presenter.link_rel_alternates(unique: true) }
|
|
80
|
+
|
|
81
|
+
it "respects unique: true" do
|
|
82
|
+
tmp_value = Capybara.ignore_hidden_elements
|
|
83
|
+
Capybara.ignore_hidden_elements = false
|
|
84
|
+
expect(subject).to have_selector("link[type='application/weird']", count: 1)
|
|
85
|
+
Capybara.ignore_hidden_elements = tmp_value
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context "with exclude" do
|
|
90
|
+
subject { presenter.link_rel_alternates(unique: true) }
|
|
91
|
+
it "excludes formats from :exclude" do
|
|
92
|
+
tmp_value = Capybara.ignore_hidden_elements
|
|
93
|
+
Capybara.ignore_hidden_elements = false
|
|
94
|
+
expect(subject).to_not have_selector("link[href$='.weird_dup']")
|
|
95
|
+
Capybara.ignore_hidden_elements = tmp_value
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
describe "field_value" do
|
|
101
|
+
let(:config) do
|
|
102
|
+
Blacklight::Configuration.new.configure do |config|
|
|
103
|
+
config.add_show_field 'qwer'
|
|
104
|
+
config.add_show_field 'asdf', :helper_method => :render_asdf_document_show_field
|
|
105
|
+
config.add_show_field 'link_to_search_true', :link_to_search => true
|
|
106
|
+
config.add_show_field 'link_to_search_named', :link_to_search => :some_field
|
|
107
|
+
config.add_show_field 'highlight', :highlight => true
|
|
108
|
+
config.add_show_field 'solr_doc_accessor', :accessor => true
|
|
109
|
+
config.add_show_field 'explicit_accessor', :accessor => :solr_doc_accessor
|
|
110
|
+
config.add_show_field 'explicit_array_accessor', :accessor => [:solr_doc_accessor, :some_method]
|
|
111
|
+
config.add_show_field 'explicit_accessor_with_arg', :accessor => :solr_doc_accessor_with_arg
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'html-escapes values' do
|
|
116
|
+
value = subject.field_value 'asdf', value: '<b>val1</b>'
|
|
117
|
+
expect(value).to eq '<b>val1</b>'
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'joins multivalued valued fields' do
|
|
121
|
+
value = subject.field_value 'asdf', value: ['<a', 'b']
|
|
122
|
+
expect(value).to eq '<a and b'
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it 'joins multivalued valued fields' do
|
|
126
|
+
value = subject.field_value 'asdf', value: ['a', 'b', 'c']
|
|
127
|
+
expect(value).to eq 'a, b, and c'
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "checks for an explicit value" do
|
|
131
|
+
expect(request_context).to_not receive(:render_asdf_document_show_field)
|
|
132
|
+
value = subject.field_value 'asdf', :value => 'val1'
|
|
133
|
+
expect(value).to eq 'val1'
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "checks for a helper method to call" do
|
|
137
|
+
allow(request_context).to receive(:render_asdf_document_show_field).and_return('custom asdf value')
|
|
138
|
+
value = subject.field_value 'asdf'
|
|
139
|
+
expect(value).to eq 'custom asdf value'
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "checks for a link_to_search" do
|
|
143
|
+
allow(request_context).to receive(:search_action_path).and_return('/foo')
|
|
144
|
+
allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
|
|
145
|
+
value = subject.field_value 'link_to_search_true'
|
|
146
|
+
expect(value).to eq 'bar'
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "checks for a link_to_search with a field name" do
|
|
150
|
+
allow(request_context).to receive(:search_action_path).and_return('/foo')
|
|
151
|
+
allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
|
|
152
|
+
value = subject.field_value 'link_to_search_named'
|
|
153
|
+
expect(value).to eq 'bar'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context "when no highlight field is available" do
|
|
157
|
+
before do
|
|
158
|
+
allow(document).to receive(:has_highlight_field?).and_return(false)
|
|
159
|
+
end
|
|
160
|
+
let(:value) { subject.field_value 'highlight' }
|
|
161
|
+
it "is blank" do
|
|
162
|
+
expect(value).to be_blank
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "checks for a highlighted field" do
|
|
167
|
+
allow(document).to receive(:has_highlight_field?).and_return(true)
|
|
168
|
+
allow(document).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
|
|
169
|
+
value = subject.field_value 'highlight'
|
|
170
|
+
expect(value).to eq '<em>highlight</em>'
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it 'respects the HTML-safeness of multivalued highlight fields' do
|
|
174
|
+
allow(document).to receive(:has_highlight_field?).and_return(true)
|
|
175
|
+
allow(document).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe, '<em>other highlight</em>'.html_safe])
|
|
176
|
+
value = subject.field_value 'highlight'
|
|
177
|
+
expect(value).to eq '<em>highlight</em> and <em>other highlight</em>'
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it "checks the document field value" do
|
|
181
|
+
value = subject.field_value 'qwer'
|
|
182
|
+
expect(value).to eq 'document qwer value'
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it "works with show fields that aren't explicitly defined" do
|
|
186
|
+
value = subject.field_value 'mnbv'
|
|
187
|
+
expect(value).to eq 'document mnbv value'
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it "calls an accessor on the solr document" do
|
|
191
|
+
allow(document).to receive_messages(solr_doc_accessor: "123")
|
|
192
|
+
value = subject.field_value 'solr_doc_accessor'
|
|
193
|
+
expect(value).to eq "123"
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it "calls an explicit accessor on the solr document" do
|
|
197
|
+
allow(document).to receive_messages(solr_doc_accessor: "123")
|
|
198
|
+
value = subject.field_value 'explicit_accessor'
|
|
199
|
+
expect(value).to eq "123"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "calls an explicit array-style accessor on the solr document" do
|
|
203
|
+
allow(document).to receive_message_chain(:solr_doc_accessor, some_method: "123")
|
|
204
|
+
value = subject.field_value 'explicit_array_accessor'
|
|
205
|
+
expect(value).to eq "123"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "calls an accessor on the solr document with the field as an argument" do
|
|
209
|
+
allow(document).to receive(:solr_doc_accessor_with_arg).with('explicit_accessor_with_arg').and_return("123")
|
|
210
|
+
value = subject.field_value 'explicit_accessor_with_arg'
|
|
211
|
+
expect(value).to eq "123"
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
describe "#heading" do
|
|
216
|
+
it "falls back to an id" do
|
|
217
|
+
allow(document).to receive(:[]).with('id').and_return "xyz"
|
|
218
|
+
expect(subject.heading).to eq document.id
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "returns the value of the field" do
|
|
222
|
+
config.show.title_field = :x
|
|
223
|
+
allow(document).to receive(:has?).with(:x).and_return(true)
|
|
224
|
+
allow(document).to receive(:[]).with(:x).and_return("value")
|
|
225
|
+
expect(subject.heading).to eq "value"
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "returns the first present value" do
|
|
229
|
+
config.show.title_field = [:x, :y]
|
|
230
|
+
allow(document).to receive(:has?).with(:x).and_return(false)
|
|
231
|
+
allow(document).to receive(:has?).with(:y).and_return(true)
|
|
232
|
+
allow(document).to receive(:[]).with(:y).and_return("value")
|
|
233
|
+
expect(subject.heading).to eq "value"
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
describe "#html_title" do
|
|
238
|
+
it "falls back to an id" do
|
|
239
|
+
allow(document).to receive(:[]).with('id').and_return "xyz"
|
|
240
|
+
expect(subject.html_title).to eq document.id
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "returns the value of the field" do
|
|
244
|
+
config.show.html_title_field = :x
|
|
245
|
+
allow(document).to receive(:has?).with(:x).and_return(true)
|
|
246
|
+
allow(document).to receive(:fetch).with(:x, nil).and_return("value")
|
|
247
|
+
expect(subject.html_title).to eq "value"
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "returns the first present value" do
|
|
251
|
+
config.show.html_title_field = [:x, :y]
|
|
252
|
+
allow(document).to receive(:has?).with(:x).and_return(false)
|
|
253
|
+
allow(document).to receive(:has?).with(:y).and_return(true)
|
|
254
|
+
allow(document).to receive(:fetch).with(:y, nil).and_return("value")
|
|
255
|
+
expect(subject.html_title).to eq "value"
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
describe '#field_values' do
|
|
260
|
+
context 'for a field with the helper_method option' do
|
|
261
|
+
let(:field_name) { 'field_with_helper' }
|
|
262
|
+
let(:field_config) { config.add_facet_field 'field_with_helper', helper_method: 'render_field_with_helper' }
|
|
263
|
+
|
|
264
|
+
before do
|
|
265
|
+
document['field_with_helper'] = 'value'
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it "checks call the helper method with arguments" do
|
|
269
|
+
allow(request_context).to receive(:render_field_with_helper) do |*args|
|
|
270
|
+
args.first
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
render_options = { a: 1 }
|
|
274
|
+
|
|
275
|
+
options = subject.send(:field_values, field_config, a: 1)
|
|
276
|
+
|
|
277
|
+
expect(options).to include :document, :field, :value, :config, :a
|
|
278
|
+
expect(options[:document]).to eq document
|
|
279
|
+
expect(options[:field]).to eq 'field_with_helper'
|
|
280
|
+
expect(options[:value]).to eq ['value']
|
|
281
|
+
expect(options[:config]).to eq field_config
|
|
282
|
+
expect(options[:a]).to eq 1
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
@@ -4,49 +4,49 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
|
4
4
|
describe "Routing" do
|
|
5
5
|
describe "Paths Generated by Custom Routes:" do
|
|
6
6
|
# paths generated by custom routes
|
|
7
|
-
it "
|
|
7
|
+
it "has a path for showing the email form" do
|
|
8
8
|
expect(:get => "/catalog/email").to route_to(:controller => 'catalog', :action => 'email')
|
|
9
9
|
end
|
|
10
|
-
it "
|
|
10
|
+
it "has a path for sending the email" do
|
|
11
11
|
expect(:post => "/catalog/email").to route_to(:controller => 'catalog', :action => 'email')
|
|
12
12
|
end
|
|
13
|
-
it "
|
|
13
|
+
it "maps GET {:controller => 'catalog', :action => 'sms'} to /catalog/sms" do
|
|
14
14
|
expect(:get => "/catalog/sms").to route_to(:controller => 'catalog', :action => 'sms')
|
|
15
15
|
end
|
|
16
|
-
it "
|
|
16
|
+
it "maps POST {:controller => 'catalog', :action => 'sms'} to /catalog/sms" do
|
|
17
17
|
expect(:post => "/catalog/sms").to route_to(:controller => 'catalog', :action => 'sms')
|
|
18
18
|
end
|
|
19
|
-
it "
|
|
19
|
+
it "maps { :controller => 'catalog', :action => 'show', :id => 666 } to /catalog/666" do
|
|
20
20
|
expect(:get => "/catalog/666").to route_to(:controller => 'catalog', :action => 'show', :id => "666")
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
describe "solr_document_path for SolrDocument", :test => true do
|
|
26
|
-
it "
|
|
26
|
+
it "routes correctly" do
|
|
27
27
|
expect(:get => solr_document_path(SolrDocument.new(:id => 'asdf'))).to route_to(:controller => 'catalog', :action => 'show', :id => 'asdf')
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
context "should escape solr document ids" do
|
|
31
31
|
|
|
32
|
-
it "
|
|
32
|
+
it "pass-throughs url-valid ids" do
|
|
33
33
|
expect(:get => solr_document_path(SolrDocument.new(:id => 'qwerty'))).to route_to(:controller => 'catalog', :action => 'show', :id => 'qwerty')
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
it "
|
|
36
|
+
it "routes url-like ids" do
|
|
37
37
|
skip "This works if you configure your routing to have very liberal constraints on :id.. not sure how to go about testing it though"
|
|
38
38
|
expect(:get => solr_document_path(SolrDocument.new(:id => 'http://example.com'))).to route_to(:controller => 'catalog', :action => 'show', :id => 'http://example.com')
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
it "
|
|
41
|
+
it "routes ids with whitespace" do
|
|
42
42
|
expect(:get => solr_document_path(SolrDocument.new(:id => 'mm 123'))).to route_to(:controller => 'catalog', :action => 'show', :id => 'mm 123')
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
it "
|
|
45
|
+
it "routes ids with a literal '+'" do
|
|
46
46
|
expect(:get => solr_document_path(SolrDocument.new(:id => 'this+that'))).to route_to(:controller => 'catalog', :action => 'show', :id => 'this+that')
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
it "
|
|
49
|
+
it "routes ids with a literal '/" do
|
|
50
50
|
skip "This works if you configure your routing to have very liberal constraints on :id.. not sure how to go about testing it though"
|
|
51
51
|
expect(:get => solr_document_path(SolrDocument.new(:id => 'and/or'))).to route_to(:controller => 'catalog', :action => 'show', :id => 'and/or')
|
|
52
52
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -53,7 +53,12 @@ RSpec.configure do |config|
|
|
|
53
53
|
# instead of true.
|
|
54
54
|
config.use_transactional_fixtures = true
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
if Rails.version > '5'
|
|
57
|
+
# This is for an unreleased version of Devise (will either be 4.2 or 5.0)
|
|
58
|
+
config.include Devise::Test::ControllerHelpers, type: :controller
|
|
59
|
+
else
|
|
60
|
+
config.include Devise::TestHelpers, type: :controller
|
|
61
|
+
end
|
|
57
62
|
config.infer_spec_type_from_file_location!
|
|
58
63
|
|
|
59
64
|
config.include(ControllerLevelHelpers, type: :helper)
|
|
@@ -61,4 +66,8 @@ RSpec.configure do |config|
|
|
|
61
66
|
|
|
62
67
|
config.include(ControllerLevelHelpers, type: :view)
|
|
63
68
|
config.before(:each, type: :view) { initialize_controller_helpers(view) }
|
|
69
|
+
|
|
70
|
+
unless Rails.version > '5'
|
|
71
|
+
config.include BackportTest, type: :controller
|
|
72
|
+
end
|
|
64
73
|
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Backport the Rails 5 controller test methods to Rails 4
|
|
2
|
+
module BackportTest
|
|
3
|
+
def delete(*args)
|
|
4
|
+
(action, rest) = *args
|
|
5
|
+
rest ||= {}
|
|
6
|
+
if rest[:xhr]
|
|
7
|
+
@request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
|
8
|
+
end
|
|
9
|
+
super(action, rest[:params])
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def get(*args)
|
|
13
|
+
(action, rest) = *args
|
|
14
|
+
rest ||= {}
|
|
15
|
+
if rest[:xhr]
|
|
16
|
+
@request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
|
17
|
+
end
|
|
18
|
+
super(action, rest[:params])
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def post(*args)
|
|
22
|
+
(action, rest) = *args
|
|
23
|
+
rest ||= {}
|
|
24
|
+
if rest[:xhr]
|
|
25
|
+
@request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
|
26
|
+
end
|
|
27
|
+
super(action, rest[:params])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def put(*args)
|
|
31
|
+
(action, rest) = *args
|
|
32
|
+
rest ||= {}
|
|
33
|
+
if rest[:xhr]
|
|
34
|
+
@request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
|
35
|
+
end
|
|
36
|
+
super(action, rest[:params])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
gem 'rails-controller-testing', github: 'rails/rails-controller-testing'
|
|
4
|
-
gem 'rspec-mocks', github: 'rspec/rspec-mocks' # we need 3.5.0 to be released
|
|
5
|
-
gem 'rspec-expectations', github: 'rspec/rspec-expectations' # we need 3.5.0 to be released
|
|
6
|
-
gem 'rspec-support', github: 'rspec/rspec-support' # we need 3.5.0 to be released
|
|
7
|
-
gem 'rspec', github: 'rspec/rspec' # we need 3.5.0 to be released
|
|
8
|
-
gem 'rspec-core', github: 'rspec/rspec-core' # we need 3.5.0 to be released
|
|
9
|
-
gem 'rspec-rails', github: 'rspec/rspec-rails' # we need 3.5.0 to be released
|
|
10
|
-
gem 'kaminari', github: 'amatsuda/kaminari' # need > 0.16.3
|
|
1
|
+
if ENV['RAILS_VERSION'].nil? || ENV['RAILS_VERSION'] =~ /^5\.0/ || ENV['RAILS_VERSION'] == 'edge'
|
|
2
|
+
gem 'rails-controller-testing'
|
|
11
3
|
gem 'deprecation', github: 'jcoyne/deprecation', branch: 'no_alias_method_chain'
|
|
12
4
|
end
|