blacklight_range_limit 8.4.0 → 9.0.0.beta1

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +117 -23
  3. data/.gitignore +2 -0
  4. data/.solr_wrapper.yml +8 -0
  5. data/Gemfile +7 -1
  6. data/README.md +77 -86
  7. data/Rakefile +31 -0
  8. data/VERSION +1 -1
  9. data/app/assets/javascripts/blacklight-range-limit/index.js +345 -0
  10. data/app/components/blacklight_range_limit/range_facet_component.html.erb +29 -27
  11. data/app/components/blacklight_range_limit/range_facet_component.rb +15 -9
  12. data/app/components/blacklight_range_limit/range_form_component.html.erb +13 -5
  13. data/app/components/blacklight_range_limit/range_form_component.rb +8 -20
  14. data/app/presenters/blacklight_range_limit/facet_field_presenter.rb +13 -2
  15. data/app/presenters/blacklight_range_limit/facet_item_presenter.rb +6 -11
  16. data/app/presenters/blacklight_range_limit/filter_field.rb +2 -2
  17. data/blacklight_range_limit.gemspec +1 -1
  18. data/config/importmap.rb +9 -0
  19. data/config/locales/blacklight_range_limit.ar.yml +13 -8
  20. data/config/locales/blacklight_range_limit.de.yml +13 -8
  21. data/config/locales/blacklight_range_limit.en.yml +5 -1
  22. data/config/locales/blacklight_range_limit.es.yml +18 -0
  23. data/config/locales/blacklight_range_limit.it.yml +13 -8
  24. data/lib/blacklight_range_limit/controller_override.rb +1 -25
  25. data/lib/blacklight_range_limit/engine.rb +48 -0
  26. data/lib/blacklight_range_limit/range_limit_builder.rb +40 -3
  27. data/lib/blacklight_range_limit.rb +8 -31
  28. data/lib/generators/blacklight_range_limit/assets_generator.rb +82 -18
  29. data/lib/generators/blacklight_range_limit/install_generator.rb +1 -1
  30. data/lib/generators/blacklight_range_limit/jsbundling_bl7_fixup_generator.rb +98 -0
  31. data/package-lock.json +51 -0
  32. data/package.json +10 -11
  33. data/spec/components/range_facet_component_spec.rb +41 -32
  34. data/spec/components/range_form_component_spec.rb +2 -2
  35. data/spec/components/range_segments_component_spec.rb +64 -0
  36. data/spec/features/blacklight_range_limit_spec.rb +21 -13
  37. data/spec/features/run_through_spec.rb +157 -0
  38. data/spec/presenters/facet_field_presenter_spec.rb +72 -0
  39. data/spec/presenters/filter_field_spec.rb +36 -1
  40. data/spec/spec_helper.rb +10 -0
  41. data/spec/test_app_templates/Gemfile.extra +11 -1
  42. data/spec/test_app_templates/lib/generators/test_app_generator.rb +37 -6
  43. metadata +26 -44
  44. data/app/assets/javascripts/blacklight_range_limit/range_limit_distro_facets.js +0 -77
  45. data/app/assets/javascripts/blacklight_range_limit/range_limit_plotting.js +0 -185
  46. data/app/assets/javascripts/blacklight_range_limit/range_limit_shared.js +0 -73
  47. data/app/assets/javascripts/blacklight_range_limit/range_limit_slider.js +0 -161
  48. data/app/assets/javascripts/blacklight_range_limit.js +0 -25
  49. data/app/assets/stylesheets/blacklight_range_limit/blacklight_range_limit.css +0 -60
  50. data/app/assets/stylesheets/blacklight_range_limit.css +0 -7
  51. data/app/helpers/range_limit_helper.rb +0 -130
  52. data/app/views/blacklight_range_limit/_range_segments.html.erb +0 -8
  53. data/app/views/blacklight_range_limit/range_segments.html.erb +0 -1
  54. data/app/views/catalog/range_limit_panel.html.erb +0 -1
  55. data/spec/features/a_javascript_spec.rb +0 -70
  56. data/spec/helpers/blacklight_range_limit_helper_spec.rb +0 -37
  57. data/vendor/assets/javascripts/bootstrap-slider.js +0 -388
  58. data/vendor/assets/javascripts/flot/jquery.canvaswrapper.js +0 -549
  59. data/vendor/assets/javascripts/flot/jquery.colorhelpers.js +0 -199
  60. data/vendor/assets/javascripts/flot/jquery.event.drag.js +0 -145
  61. data/vendor/assets/javascripts/flot/jquery.flot.browser.js +0 -98
  62. data/vendor/assets/javascripts/flot/jquery.flot.drawSeries.js +0 -662
  63. data/vendor/assets/javascripts/flot/jquery.flot.hover.js +0 -359
  64. data/vendor/assets/javascripts/flot/jquery.flot.js +0 -2818
  65. data/vendor/assets/javascripts/flot/jquery.flot.saturated.js +0 -43
  66. data/vendor/assets/javascripts/flot/jquery.flot.selection.js +0 -527
  67. data/vendor/assets/javascripts/flot/jquery.flot.uiConstants.js +0 -10
  68. data/vendor/assets/stylesheets/slider.css +0 -138
@@ -1,161 +0,0 @@
1
- // for Blacklight.onLoad:
2
-
3
- Blacklight.onLoad(function() {
4
-
5
- $(".range_limit .profile .range.slider_js").each(function() {
6
- BlacklightRangeLimit.buildSlider(this);
7
- });
8
-
9
- // Support for Blacklight 7 and 8:
10
- const modalSelector = Blacklight.modal?.modalSelector || Blacklight.Modal.modalSelector
11
-
12
- $(modalSelector).on('shown.bs.modal', function() {
13
- $(this).find(".range_limit .profile .range.slider_js").each(function() {
14
- BlacklightRangeLimit.buildSlider(this);
15
- });
16
- });
17
-
18
- // catch event for redrawing chart, to redraw slider to match width
19
- $("body").on("plotDrawn.blacklight.rangeLimit", function(event) {
20
- var area = $(event.target).closest(".limit_content.range_limit");
21
- var plot = area.find(".chart_js").data("plot");
22
- var slider_el = area.find(".slider");
23
-
24
- if (plot && slider_el) {
25
- slider_el.width(plot.width());
26
- slider_el.css("display", "block")
27
- }
28
- });
29
- });
30
-
31
- // returns two element array min/max as numbers. If there is a limit applied,
32
- // it's boundaries are are limits. Otherwise, min/max in current result
33
- // set as sniffed from HTML. Pass in a DOM element for a div.range
34
- // Will return NaN as min or max in case of error or other weirdness.
35
- BlacklightRangeLimit.min_max = function min_max(range_element) {
36
- var current_limit = $(range_element).closest(".limit_content.range_limit").find(".current")
37
- let min, max
38
- min = max = BlacklightRangeLimit.parseNum(current_limit.find(".single").data('blrlSingle'))
39
- if ( isNaN(min)) {
40
- min = BlacklightRangeLimit.parseNum(current_limit.find(".from").first().data('blrlBegin'));
41
- max = BlacklightRangeLimit.parseNum(current_limit.find(".to").first().data('blrlEnd'));
42
- }
43
-
44
- if (isNaN(min) || isNaN(max)) {
45
- //no current limit, take from results min max included in spans
46
- min = BlacklightRangeLimit.parseNum($(range_element).find(".min").first().text());
47
- max = BlacklightRangeLimit.parseNum($(range_element).find(".max").first().text());
48
- }
49
- return [min, max]
50
- }
51
-
52
-
53
- // Check to see if a value is an Integer
54
- // see: http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer
55
- BlacklightRangeLimit.isInt = function isInt(n) {
56
- return n % 1 === 0;
57
- }
58
-
59
- BlacklightRangeLimit.buildSlider = function buildSlider(thisContext) {
60
- var range_element = $(thisContext);
61
-
62
- var boundaries = BlacklightRangeLimit.min_max(thisContext);
63
- var min = boundaries[0];
64
- var max = boundaries[1];
65
-
66
- if (BlacklightRangeLimit.isInt(min) && BlacklightRangeLimit.isInt(max)) {
67
- $(thisContext).contents().wrapAll('<div class="sr-only visually-hidden" />');
68
-
69
- var range_element = $(thisContext);
70
- var form = $(range_element).closest(".range_limit").find("form.range_limit");
71
- var begin_el = form.find("input.range_begin");
72
- var end_el = form.find("input.range_end");
73
-
74
- var placeholder_input = $('<input type="hidden" data-slider-placeholder="true" />').appendTo(range_element);
75
-
76
- // make sure slider is loaded
77
- if (placeholder_input.slider !== undefined) {
78
- placeholder_input.slider({
79
- min: min,
80
- max: max,
81
- value: [min, max],
82
- tooltip: "hide"
83
- });
84
-
85
- // try to make slider width/orientation match chart's
86
- var container = range_element.closest(".range_limit");
87
- var plot_el = container.find(".chart_js");
88
- var plot = plot_el.data("plot");
89
- var slider_el = container.find(".slider");
90
-
91
- if (plot_el) {
92
- plot_el.attr('aria-hidden', 'true');
93
- }
94
-
95
- if (slider_el) {
96
- slider_el.attr('aria-hidden', 'true');
97
- }
98
-
99
- if (plot && slider_el) {
100
- slider_el.width(plot.width());
101
- slider_el.css("display", "block")
102
- } else if (slider_el) {
103
- slider_el.css("width", "100%");
104
- }
105
- }
106
-
107
- // Slider change should update text input values.
108
- var parent = $(thisContext).parent();
109
- var form = $(parent).closest(".limit_content").find("form.range_limit");
110
- $(parent).closest(".limit_content").find(".profile .range").on("slide", function(event, ui) {
111
- var values = $(event.target).data("slider").getValue();
112
- form.find("input.range_begin").val(values[0]);
113
- form.find("input.range_end").val(values[1]);
114
- });
115
- }
116
-
117
- begin_el.val(min);
118
- end_el.val(max);
119
-
120
- begin_el.on('input', function() {
121
- var val = BlacklightRangeLimit.parseNum(this.value);
122
- if (isNaN(val) || val < min) {
123
- //for weird data, set slider at min
124
- val = min;
125
- }
126
- var values = placeholder_input.data("slider").getValue();
127
- values[0] = val;
128
- placeholder_input.slider("setValue", values);
129
- });
130
-
131
- end_el.on('input', function() {
132
- var val = BlacklightRangeLimit.parseNum(this.value);
133
- if (isNaN(val) || val > max) {
134
- //weird entry, set slider to max
135
- val = max;
136
- }
137
- var values = placeholder_input.data("slider").getValue();
138
- values[1] = val;
139
- placeholder_input.slider("setValue", values);
140
- });
141
-
142
- begin_el.change(function() {
143
- var val1 = BlacklightRangeLimit.parseNum(begin_el.val());
144
- var val2 = BlacklightRangeLimit.parseNum(end_el.val());
145
-
146
- if (val2 < val1) {
147
- begin_el.val(val2);
148
- end_el.val(val1);
149
- }
150
- });
151
-
152
- end_el.change(function() {
153
- var val1 = BlacklightRangeLimit.parseNum(begin_el.val());
154
- var val2 = BlacklightRangeLimit.parseNum(end_el.val());
155
-
156
- if (val2 < val1) {
157
- begin_el.val(val2);
158
- end_el.val(val1);
159
- }
160
- });
161
- }
@@ -1,25 +0,0 @@
1
- // Master manifest file for engine, so local app can require
2
- // this one file, but get all our files -- and local app
3
- // require does not need to change if we change file list.
4
- //
5
- // Note JQuery is required to be loaded for flot and blacklight_range_limit
6
- // JS to work, expect host app to load it.
7
-
8
-
9
- //= require 'flot/jquery.canvaswrapper.js'
10
- //= require 'flot/jquery.colorhelpers.js'
11
- //= require 'flot/jquery.flot.js'
12
- //= require 'flot/jquery.flot.browser.js'
13
- //= require 'flot/jquery.flot.saturated.js'
14
- //= require 'flot/jquery.flot.drawSeries.js'
15
- //= require 'flot/jquery.event.drag.js'
16
- //= require 'flot/jquery.flot.hover.js'
17
- //= require 'flot/jquery.flot.uiConstants.js'
18
- //= require 'flot/jquery.flot.selection.js'
19
- //= require 'bootstrap-slider'
20
-
21
- // Ensure that range_limit_shared is loaded first
22
- //= require 'blacklight_range_limit/range_limit_shared'
23
- //= require 'blacklight_range_limit/range_limit_plotting'
24
- //= require 'blacklight_range_limit/range_limit_slider'
25
- //= require 'blacklight_range_limit/range_limit_distro_facets'
@@ -1,60 +0,0 @@
1
- form.range_limit {
2
- /* leave room for buttons not to collide on line wrap */
3
- line-height: 3;
4
- }
5
-
6
- .range_limit .range-limit-input-group {
7
- max-width: 350px;
8
- width: 100% !important;
9
- }
10
-
11
- .range_limit input.range_begin, .range_limit input.range_end {
12
- display: inline-block;
13
- width: 4.5em;
14
- }
15
-
16
- .limit_content .subsection {
17
- margin-top: 0.5em;
18
- }
19
-
20
- .hover_legend {
21
- padding: 0.25em;
22
- }
23
-
24
- .slider_js .slider-selection {
25
- /* color from flot selection */
26
- background: #e8cfac;
27
- }
28
-
29
- .slider_js .slider-horizontal {
30
- margin-left: 5px;
31
- margin-right: 5px;
32
- }
33
-
34
- .chart_js .flot-x-axis {
35
- font-size: 14px;
36
- }
37
-
38
- .modal-body .view_larger {
39
- display: none;
40
- }
41
-
42
- /* Prevent an unstyled flash of content for values we'll replace with a chart */
43
- .js .distribution .facet-values {
44
- display: none;
45
- }
46
-
47
- .modal-body .range_limit {
48
- justify-content: center;
49
- }
50
-
51
- .view_larger {
52
- display: block;
53
- text-align: center;
54
- }
55
-
56
- .range_limit .chart_js {
57
- min-height: 80px;
58
- margin-left: -12px;
59
- margin-right: -14px;
60
- }
@@ -1,7 +0,0 @@
1
- /* Master manifest file for engine, so local app can require
2
- * this one file, but get all our files -- and local app
3
- * require does not need to change if we change file list.
4
- *
5
- *= require 'slider'
6
- *= require_tree './blacklight_range_limit'
7
- */
@@ -1,130 +0,0 @@
1
- module RangeLimitHelper
2
- extend Deprecation
3
-
4
- def range_limit_url(options = {})
5
- main_app.url_for(search_state.to_h.merge(action: 'range_limit').merge(options))
6
- end
7
- deprecation_deprecate :range_limit_url
8
-
9
- def range_limit_panel_url(options = {})
10
- search_facet_path(id: options[:id])
11
- end
12
- deprecation_deprecate :range_limit_panel_url
13
-
14
- # type is 'begin' or 'end'
15
- def render_range_input(solr_field, type, input_label = nil, maxlength=4)
16
- range_form_component(solr_field).render_range_input(type, input_label, maxlength)
17
- end
18
- deprecation_deprecate :render_range_input
19
-
20
- # type is 'min' or 'max'
21
- # Returns smallest and largest value in current result set, if available
22
- # from stats component response.
23
- def range_results_endpoint(solr_field, type)
24
- presenter = range_facet_field_presenter(solr_field)
25
-
26
- case type.to_s
27
- when 'min'
28
- presenter.min
29
- when 'max'
30
- presenter.max
31
- end
32
- end
33
- deprecation_deprecate :range_results_endpoint
34
-
35
- def range_display(solr_field, my_params = params)
36
- facet_config = blacklight_config.facet_fields[solr_field]
37
- presenter = range_facet_field_presenter(solr_field)
38
- return unless presenter.selected_range
39
-
40
- facet_item = Blacklight::Solr::Response::Facets::FacetItem.new(value: presenter.selected_range, hits: presenter.response.total)
41
-
42
- facet_config.item_presenter.new(facet_item, facet_config, self, solr_field).label
43
- end
44
- deprecation_deprecate :range_display
45
-
46
- ##
47
- # A method that is meant to be overridden downstream to format how a range
48
- # label might be displayed to a user. By default it just returns the value
49
- # as rendered by the presenter
50
- def format_range_display_value(value, solr_field)
51
- Deprecation.warn(RangeLimitHelper, 'Helper #format_range_display_value is deprecated without replacement')
52
- facet_item_presenter(facet_configuration_for_field(solr_field), value, solr_field).label
53
- end
54
-
55
- # Show the limit area if:
56
- # 1) we have a limit already set
57
- # OR
58
- # 2) stats show max > min, OR
59
- # 3) count > 0 if no stats available.
60
- def should_show_limit(solr_field)
61
- presenter = range_facet_field_presenter(solr_field)
62
-
63
- presenter.selected_range ||
64
- (presenter.max && presenter.min && presenter.max > presenter.min) ||
65
- @response.total.positive?
66
- end
67
-
68
- def stats_for_field(solr_field)
69
- range_facet_field_presenter(solr_field).send(:stats_for_field)
70
- end
71
- deprecation_deprecate :stats_for_field
72
-
73
- def stats_for_field?(solr_field)
74
- stats_for_field(solr_field).present?
75
- end
76
- deprecation_deprecate :stats_for_field?
77
-
78
- def add_range_missing(solr_field, my_params = params)
79
- Blacklight::SearchState.new(my_params.except(:page), blacklight_config).filter(solr_field).add(Blacklight::SearchState::FilterField::MISSING)
80
- end
81
- deprecation_deprecate :add_range_missing
82
-
83
- def add_range(solr_field, from, to, my_params = params)
84
- Blacklight::SearchState.new(my_params.except(:page), blacklight_config).filter(solr_field).add(from..to)
85
- end
86
- deprecation_deprecate :add_range
87
-
88
- def has_selected_range_limit?(solr_field)
89
- range_facet_field_presenter(solr_field).selected_range.present?
90
- end
91
- deprecation_deprecate :has_selected_range_limit?
92
-
93
- def selected_missing_for_range_limit?(solr_field)
94
- search_state.filter(solr_field).values.first == Blacklight::SearchState::FilterField::MISSING
95
- end
96
- deprecation_deprecate :selected_missing_for_range_limit?
97
-
98
- def remove_range_param(solr_field, my_params = params)
99
- Blacklight::SearchState.new(my_params.except(:page), blacklight_config).filter(solr_field).remove(0..0)
100
- end
101
-
102
- # Looks in the solr @response for ["facet_counts"]["facet_queries"][solr_field], for elements
103
- # expressed as "solr_field:[X to Y]", turns them into
104
- # a list of hashes with [:from, :to, :count], sorted by
105
- # :from. Assumes integers for sorting purposes.
106
- def solr_range_queries_to_a(solr_field)
107
- range_facet_field_presenter(solr_field).range_queries.map do |item|
108
- { from: item.value.first, to: item.value.last, count: item.hits }
109
- end
110
- end
111
- deprecation_deprecate :solr_range_queries_to_a
112
-
113
- def range_config(solr_field)
114
- BlacklightRangeLimit.range_config(blacklight_config, solr_field)
115
- end
116
- deprecation_deprecate :range_config
117
-
118
- private
119
-
120
- def range_facet_field_presenter(key)
121
- facet_config = blacklight_config.facet_fields[key] || Blacklight::Configuration::FacetField.new(key: key, **BlacklightRangeLimit.default_range_config)
122
- facet_field_presenter(facet_config, Blacklight::Solr::Response::Facets::FacetField.new(key, [], response: @response))
123
- end
124
-
125
- def range_form_component(key)
126
- presenter = range_facet_field_presenter(key)
127
-
128
- BlacklightRangeLimit::RangeFormComponent.new(facet_field: presenter)
129
- end
130
- end
@@ -1,8 +0,0 @@
1
- <% Deprecation.warn(BlacklightRangeLimit, 'The blacklight_range_limit/range_segments partial is deprecated. Render the RangeSegmentsComponent directly.') %>
2
-
3
- <%
4
- facet = blacklight_config.facet_fields[solr_field]
5
- display_facet = @response.aggregations[facet.field] || Blacklight::Solr::Response::Facets::FacetField.new(facet.key, [], response: @response)
6
- presenter = (facet.presenter || BlacklightRangeLimit::FacetFieldPresenter).new(facet, display_facet, self)
7
- %>
8
- <%= render BlacklightRangeLimit::RangeSegmentsComponent.new(facet_field: presenter) %>
@@ -1 +0,0 @@
1
- <%= render BlacklightRangeLimit::RangeSegmentsComponent.new(facet_field: facet_field) %>
@@ -1 +0,0 @@
1
- <%= render template: 'catalog/facet' %>
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'JavaScript', js: true do
6
- it 'initializes canvas chart' do
7
- visit search_catalog_path
8
-
9
- click_button 'Publication Date Sort'
10
- expect(page).to have_css '.flot-base'
11
- end
12
- it 'has a View larger modal' do
13
- visit search_catalog_path
14
-
15
- click_button 'Publication Date Sort'
16
- sleep(1) # resize is debounced
17
- click_link 'View larger »'
18
-
19
- within '.modal-body' do
20
- expect(page).to have_css '.flot-base'
21
- end
22
- end
23
-
24
- context 'when assumed boundaries configured' do
25
- before do
26
- CatalogController.blacklight_config.facet_fields['pub_date_si'].range_config = {
27
- assumed_boundaries: 1990...2000
28
- }
29
- end
30
-
31
- after do
32
- CatalogController.blacklight_config.facet_fields['pub_date_si'].range_config = {}
33
- end
34
-
35
- it 'should show the range limit with set boundaries' do
36
- visit '/catalog'
37
- click_button 'Publication Date Sort'
38
- expect(page).to have_field :range_pub_date_si_begin, with: '1990'
39
- expect(page).to have_field :range_pub_date_si_end, with: '2000'
40
- end
41
- end
42
-
43
- describe '"Unknown" link' do
44
- context 'when in the facet (e.g. non-xhr)' do
45
- it 'is displayed' do
46
- visit search_catalog_path
47
-
48
- click_button 'Publication Date Sort'
49
-
50
- within 'ul.subsection.missing' do
51
- expect(page).to have_link '[Missing]'
52
- end
53
- end
54
- end
55
-
56
- context 'when in the modal (e.g. via xhr)' do
57
- it 'is not displayed' do
58
- visit search_catalog_path
59
-
60
- click_button 'Publication Date Sort'
61
- sleep(1) # resize is debounced
62
- click_link 'View larger »'
63
-
64
- within '.modal-body' do
65
- expect(page).not_to have_css 'ul.subsection.missing'
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,37 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Blacklight Range Limit Helper" do
4
- let(:config) { Blacklight::Configuration.new }
5
- before do
6
- allow(helper).to receive(:blacklight_config).and_return(config)
7
- allow(helper).to receive(:search_state).and_return(Blacklight::SearchState.new({}, config))
8
- end
9
-
10
- it "should render range text fields with/without labels" do
11
- begin_html = Capybara.string(helper.render_range_input('pub_date', 'begin'))
12
- begin_from_pub_html = Capybara.string(helper.render_range_input('pub_date', 'begin', 'from pub date'))
13
- expect(begin_html).to have_css 'input.form-control.range_begin#range_pub_date_begin'
14
- expect(begin_from_pub_html).to have_css 'label.sr-only[for="range_pub_date_begin"]'
15
- end
16
-
17
- it "should render range text fields with specified maxlength, defaulting to 4 if not specified" do
18
- html_maxlength_default = Capybara.string(helper.render_range_input('pub_date', 'begin'))
19
- html_maxlength_6 = Capybara.string(helper.render_range_input('pub_date', 'begin', nil, 6))
20
- expect(html_maxlength_default).to have_css 'input.form-control.range_begin#range_pub_date_begin[maxlength="4"]'
21
- expect(html_maxlength_6).to have_css 'input.form-control.range_begin#range_pub_date_begin[maxlength="6"]'
22
- end
23
-
24
- context "when building requests" do
25
- it "should exclude page when adding a range" do
26
- params = { q: '', page: '2' }
27
- updated_params = helper.add_range('test', '1900', '1995', params)
28
- expect(updated_params.to_h).not_to include(:page)
29
- end
30
-
31
- it "should exclude page when adding a missing range" do
32
- params = { q: '', page: '2' }
33
- updated_params = helper.add_range_missing('test', params)
34
- expect(updated_params.to_h).not_to include(:page)
35
- end
36
- end
37
- end