blacklight 6.2.0 → 6.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|