Skip to content

Commit 0de2db4

Browse files
authored
Merge pull request #3606 from projectblacklight/modernize-view-component-testing
Modernized view component testing
2 parents bb8b429 + 08a3de0 commit 0de2db4

25 files changed

+323
-316
lines changed

spec/components/blacklight/advanced_search_form_component_spec.rb

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,42 @@
33
require 'spec_helper'
44

55
RSpec.describe Blacklight::AdvancedSearchFormComponent, type: :component do
6-
subject(:render) do
7-
component.render_in(view_context)
8-
end
9-
106
let(:component) { described_class.new(url: '/whatever', response: response, params: params) }
117
let(:response) { Blacklight::Solr::Response.new({ facet_counts: { facet_fields: { format: { 'Book' => 10, 'CD' => 5 } } } }.with_indifferent_access, {}) }
128
let(:params) { {} }
139

14-
let(:rendered) do
15-
Capybara::Node::Simple.new(render)
16-
end
17-
18-
let(:view_context) { controller.view_context }
10+
let(:view_context) { vc_test_controller.view_context }
1911

2012
before do
2113
allow(view_context).to receive(:facet_limit_for).and_return(nil)
14+
render_inline component
2215
end
2316

2417
context 'with additional parameters' do
2518
let(:params) { { some: :parameter, an_array: [1, 2] } }
2619

2720
it 'adds additional parameters as hidden fields' do
28-
expect(rendered).to have_field 'some', with: 'parameter', type: :hidden
29-
expect(rendered).to have_field 'an_array[]', with: '1', type: :hidden
30-
expect(rendered).to have_field 'an_array[]', with: '2', type: :hidden
21+
expect(page).to have_field 'some', with: 'parameter', type: :hidden
22+
expect(page).to have_field 'an_array[]', with: '1', type: :hidden
23+
expect(page).to have_field 'an_array[]', with: '2', type: :hidden
3124
end
3225
end
3326

3427
it 'has text fields for each search field' do
35-
expect(rendered).to have_css '.advanced-search-field', count: 4
36-
expect(rendered).to have_field 'clause_0_field', with: 'all_fields', type: :hidden
37-
expect(rendered).to have_field 'clause_1_field', with: 'title', type: :hidden
38-
expect(rendered).to have_field 'clause_2_field', with: 'author', type: :hidden
39-
expect(rendered).to have_field 'clause_3_field', with: 'subject', type: :hidden
28+
expect(page).to have_css '.advanced-search-field', count: 4
29+
expect(page).to have_field 'clause_0_field', with: 'all_fields', type: :hidden
30+
expect(page).to have_field 'clause_1_field', with: 'title', type: :hidden
31+
expect(page).to have_field 'clause_2_field', with: 'author', type: :hidden
32+
expect(page).to have_field 'clause_3_field', with: 'subject', type: :hidden
4033
end
4134

4235
it 'has filters' do
43-
expect(rendered).to have_css '.blacklight-format'
44-
expect(rendered).to have_field 'f_inclusive[format][]', with: 'Book'
45-
expect(rendered).to have_field 'f_inclusive[format][]', with: 'CD'
36+
expect(page).to have_css '.blacklight-format'
37+
expect(page).to have_field 'f_inclusive[format][]', with: 'Book'
38+
expect(page).to have_field 'f_inclusive[format][]', with: 'CD'
4639
end
4740

4841
it 'has a sort field' do
49-
expect(rendered).to have_select 'sort', options: %w[relevance year author title]
42+
expect(page).to have_select 'sort', options: %w[relevance year author title]
5043
end
5144
end

spec/components/blacklight/constraint_layout_component_spec.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
require 'spec_helper'
44

55
RSpec.describe Blacklight::ConstraintLayoutComponent, type: :component do
6-
subject(:rendered) do
7-
render_inline_to_capybara_node(described_class.new(**params))
6+
before do
7+
render_inline described_class.new(**params)
88
end
99

1010
describe "for simple display" do
@@ -13,7 +13,7 @@
1313
end
1414

1515
it "renders label and value" do
16-
expect(rendered).to have_css("span.applied-filter.constraint") do |s|
16+
expect(page).to have_css("span.applied-filter.constraint") do |s|
1717
expect(s).to have_css("span.constraint-value")
1818
expect(s).to have_no_css("a.constraint-value")
1919
expect(s).to have_css "span.filter-name", text: "my label"
@@ -28,13 +28,13 @@
2828
end
2929

3030
it "includes remove link" do
31-
expect(rendered).to have_css("span.applied-filter") do |s|
31+
expect(page).to have_css("span.applied-filter") do |s|
3232
expect(s).to have_css(".remove[href='http://remove']")
3333
end
3434
end
3535

3636
it "has an accessible remove label" do
37-
expect(rendered).to have_css(".remove") do |s|
37+
expect(page).to have_css(".remove") do |s|
3838
expect(s).to have_css('.visually-hidden', text: 'Remove constraint my label: my value')
3939
end
4040
end
@@ -46,7 +46,7 @@
4646
end
4747

4848
it "includes them" do
49-
expect(rendered).to have_css("span.applied-filter.constraint.class1.class2")
49+
expect(page).to have_css("span.applied-filter.constraint.class1.class2")
5050
end
5151
end
5252

@@ -56,8 +56,8 @@
5656
end
5757

5858
it "does not escape key and value" do
59-
expect(rendered).to have_css("span.applied-filter.constraint span.filter-name span.custom_label")
60-
expect(rendered).to have_css("span.applied-filter.constraint span.filter-value span.custom_value")
59+
expect(page).to have_css("span.applied-filter.constraint span.filter-name span.custom_label")
60+
expect(page).to have_css("span.applied-filter.constraint span.filter-value span.custom_value")
6161
end
6262
end
6363
end

spec/components/blacklight/constraints_component_spec.rb

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
RSpec.describe Blacklight::ConstraintsComponent, type: :component do
66
subject(:component) { described_class.new(**params) }
77

8-
let(:rendered) { render_inline_to_capybara_node(component) }
8+
before { render_inline(component) }
99

1010
let(:params) do
1111
{ search_state: search_state }
@@ -32,35 +32,35 @@
3232
let(:query_params) { { q: 'some query' } }
3333

3434
it 'renders a start-over link' do
35-
expect(rendered).to have_link 'Start Over', href: '/catalog'
35+
expect(page).to have_link 'Start Over', href: '/catalog'
3636
end
3737

3838
it 'has a header' do
39-
expect(rendered).to have_css('h2', text: 'Search Constraints')
39+
expect(page).to have_css('h2', text: 'Search Constraints')
4040
end
4141

4242
it 'wraps the output in a div' do
43-
expect(rendered).to have_css('div#appliedParams')
43+
expect(page).to have_css('div#appliedParams')
4444
end
4545

4646
it 'renders the query' do
47-
expect(rendered).to have_css('.applied-filter.constraint', text: 'some query')
47+
expect(page).to have_css('.applied-filter.constraint', text: 'some query')
4848
end
4949
end
5050

5151
context 'with a facet' do
5252
let(:query_params) { { f: { some_facet: ['some value'] } } }
5353

5454
it 'renders the query' do
55-
expect(rendered).to have_css('.constraint-value > .filter-name', text: 'Some Facet').and(have_css('.constraint-value > .filter-value', text: 'some value'))
55+
expect(page).to have_css('.constraint-value > .filter-name', text: 'Some Facet').and(have_css('.constraint-value > .filter-value', text: 'some value'))
5656
end
5757

5858
context 'that is not configured' do
5959
let(:query_params) { { f: { some_facet: ['some value'], missing: ['another value'] } } }
6060

6161
it 'renders only the configured constraints' do
62-
expect(rendered).to have_css('.constraint-value > .filter-name', text: 'Some Facet').and(have_css('.constraint-value > .filter-value', text: 'some value'))
63-
expect(rendered).to have_no_css('.constraint-value > .filter-name', text: 'Missing')
62+
expect(page).to have_css('.constraint-value > .filter-name', text: 'Some Facet').and(have_css('.constraint-value > .filter-value', text: 'some value'))
63+
expect(page).to have_no_css('.constraint-value > .filter-name', text: 'Missing')
6464
end
6565
end
6666
end
@@ -71,15 +71,15 @@
7171
let(:query_params) { { q: 'some query', f: { some_facet: ['some value'] } } }
7272

7373
it 'wraps the output in a span' do
74-
expect(rendered).to have_css('span .constraint')
74+
expect(page).to have_css('span .constraint')
7575
end
7676

7777
it 'renders the search state as lightly-decorated text' do
78-
expect(rendered).to have_css('.constraint > .filter-values', text: 'some query').and(have_css('.constraint', text: 'Some Facet:some value'))
78+
expect(page).to have_css('.constraint > .filter-values', text: 'some query').and(have_css('.constraint', text: 'Some Facet:some value'))
7979
end
8080

8181
it 'omits the headers' do
82-
expect(rendered).to have_no_css('h2', text: 'Search Constraints')
82+
expect(page).to have_no_css('h2', text: 'Search Constraints')
8383
end
8484
end
8585
end

spec/components/blacklight/document/action_component_spec.rb

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,43 @@
66
subject(:component) { described_class.new(document: document, action: action, **attr) }
77

88
let(:action) { Blacklight::Configuration::ToolConfig.new(key: 'some_tool', name: 'some_tool', component: true) }
9-
let(:attr) { {} }
10-
let(:view_context) { controller.view_context }
11-
let(:render) do
12-
component.render_in(view_context)
13-
end
14-
15-
let(:rendered) do
16-
Capybara::Node::Simple.new(render)
17-
end
18-
199
let(:document) do
2010
SolrDocument.new(
2111
id: 'x'
2212
)
2313
end
14+
let(:attr) { {} }
15+
let(:view_context) { vc_test_controller.view_context }
16+
17+
before do
18+
# Every call to view_context returns a different object. This ensures it stays stable.
19+
allow(vc_test_controller).to receive_messages(view_context: view_context)
20+
end
2421

25-
it 'renders an action link' do
26-
allow(view_context).to receive(:some_tool_solr_document_path).with(document, { only_path: true }).and_return('/asdf')
22+
context 'with a configured path' do
23+
before do
24+
allow(view_context).to receive(:some_tool_solr_document_path).with(document, { only_path: true }).and_return('/asdf')
2725

28-
expect(rendered).to have_link 'Some tool', href: '/asdf'
26+
render_inline component
27+
end
28+
29+
it 'renders an action link' do
30+
expect(page).to have_link 'Some tool', href: '/asdf'
31+
end
2932
end
3033

3134
context 'with a partial configured' do
3235
let(:action) { Blacklight::Configuration::ToolConfig.new(name: '', partial: '/some/tool') }
3336

34-
it 'render the partial' do
37+
before do
38+
allow(view_context).to receive(:render).and_call_original
3539
allow(view_context).to receive(:render).with(hash_including(partial: '/some/tool'), {}).and_return('tool')
3640

37-
expect(rendered).to have_content 'tool'
41+
render_inline component
42+
end
43+
44+
it 'render the partial' do
45+
expect(page).to have_content 'tool'
3846
end
3947
end
4048
end

spec/components/blacklight/document/group_component_spec.rb

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,35 @@
66
subject(:component) { described_class.new(group: group, **attr) }
77

88
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(:docs) { 10.times.map { double } }
9+
let(:view_context) { vc_test_controller.view_context }
10+
let(:docs) { 10.times.map { SolrDocument.new } }
1911

2012
let(:group) do
2113
instance_double(Blacklight::Solr::Response::Group, key: 'group1', field: 'group_field', total: 15, docs: docs)
2214
end
2315

2416
before do
17+
# Every call to view_context returns a different object. This ensures it stays stable.
18+
allow(vc_test_controller).to receive_messages(view_context: view_context)
2519
allow(view_context).to receive(:render_document_index).with(docs).and_return('results')
20+
render_inline component
2621
end
2722

2823
it 'renders the group with a header' do
29-
expect(rendered).to have_css 'div.group'
30-
expect(rendered).to have_css 'h2', text: 'group1'
31-
expect(rendered).to have_no_link 'more'
24+
expect(page).to have_css 'div.group'
25+
expect(page).to have_css 'h2', text: 'group1'
26+
expect(page).to have_no_link 'more'
3227
end
3328

3429
it 'renders the group documents' do
35-
expect(rendered).to have_content 'results'
30+
expect(page).to have_content 'results'
3631
end
3732

3833
context 'with a limit applied' do
3934
let(:attr) { { group_limit: 5 } }
4035

4136
it 'renders a control to see more results' do
42-
expect(rendered).to have_link 'more'
37+
expect(page).to have_link 'more'
4338
end
4439
end
4540
end

0 commit comments

Comments
 (0)