From ce12bc4dbc96bf105a6b03164cfaf6d6ca2df4be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 23:11:45 +0000 Subject: [PATCH 1/6] Bump cuprite from 0.15 to 0.17 Bumps [cuprite](https://github.com/rubycdp/cuprite) from 0.15 to 0.17. - [Release notes](https://github.com/rubycdp/cuprite/releases) - [Changelog](https://github.com/rubycdp/cuprite/blob/main/CHANGELOG.md) - [Commits](https://github.com/rubycdp/cuprite/compare/v0.15...v0.17) --- updated-dependencies: - dependency-name: cuprite dependency-version: '0.17' dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 96ee7f8da6..ce12da36db 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -267,9 +267,9 @@ GEM css_parser (1.21.1) addressable csv (3.3.5) - cuprite (0.15) + cuprite (0.17) capybara (~> 3.0) - ferrum (~> 0.14.0) + ferrum (~> 0.17.0) database_cleaner (2.1.0) database_cleaner-active_record (>= 2, < 3) database_cleaner-active_record (2.2.2) @@ -334,11 +334,12 @@ GEM faraday (>= 1, < 3) faraday-net_http (3.4.2) net-http (~> 0.5) - ferrum (0.14) + ferrum (0.17.1) addressable (~> 2.5) + base64 (~> 0.2) concurrent-ruby (~> 1.1) webrick (~> 1.7) - websocket-driver (>= 0.6, < 0.8) + websocket-driver (~> 0.7) ffaker (2.25.0) ffi (1.17.3) flipper (1.3.6) @@ -529,7 +530,7 @@ GEM net-protocol newrelic_rpm (9.24.0) nio4r (2.7.5) - nokogiri (1.19.0) + nokogiri (1.19.1) mini_portile2 (~> 2.8.2) racc (~> 1.4) nokogiri-html5-inference (0.3.0) @@ -602,7 +603,7 @@ GEM psych (5.3.1) date stringio - public_suffix (7.0.0) + public_suffix (7.0.2) puffing-billy (4.0.2) addressable (~> 2.5) em-http-request (~> 1.1, >= 1.1.0) @@ -959,7 +960,7 @@ GEM crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) webrick (1.9.2) - websocket-driver (0.7.7) + websocket-driver (0.8.0) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) From 424e25f83e817a49e51fcc48913a08730bee6047 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 19 Feb 2026 12:50:59 +1100 Subject: [PATCH 2/6] Merge mostly duplicate Tom Select helpers --- spec/support/request/tomselect_helper.rb | 45 ------------------------ spec/support/request/web_helper.rb | 2 -- spec/support/tom_select_helper.rb | 22 ++++++++++-- 3 files changed, 19 insertions(+), 50 deletions(-) delete mode 100644 spec/support/request/tomselect_helper.rb diff --git a/spec/support/request/tomselect_helper.rb b/spec/support/request/tomselect_helper.rb deleted file mode 100644 index 93b0717d8e..0000000000 --- a/spec/support/request/tomselect_helper.rb +++ /dev/null @@ -1,45 +0,0 @@ -# frozen_string_literal: true - -module TomselectHelper - def tomselect_open(field_name) - page.find("##{field_name}-ts-control").click - end - - def tomselect_multiselect(value, options) - tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click - tomselect_wrapper.find(:css, '.ts-dropdown.multi .ts-dropdown-content .option', - text: value).click - # Close the dropdown - page.find("body").click - end - - def tomselect_search_and_select(value, options) - tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click - # Use send_keys as setting the value directly doesn't trigger the search - tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value) - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click - end - - def tomselect_select(value, options) - tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click - - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click - end - - def open_tomselect_to_validate!(page, field_name) - tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click # open the dropdown - - raise 'Please pass the block for expectations' unless block_given? - - # execute block containing expectations - yield - - tomselect_wrapper.find( - '.ts-dropdown .ts-dropdown-content .option.active', - ).click # close the dropdown by selecting the already selected value - end -end diff --git a/spec/support/request/web_helper.rb b/spec/support/request/web_helper.rb index de10dc79c6..3e4bb3a632 100644 --- a/spec/support/request/web_helper.rb +++ b/spec/support/request/web_helper.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true module WebHelper - include TomselectHelper - def have_input(name, opts = {}) selector = "[name='#{name}']" selector += "[placeholder='#{opts[:placeholder]}']" if opts.key? :placeholder diff --git a/spec/support/tom_select_helper.rb b/spec/support/tom_select_helper.rb index d066bbe6ea..d6faed8eb5 100644 --- a/spec/support/tom_select_helper.rb +++ b/spec/support/tom_select_helper.rb @@ -6,14 +6,16 @@ module TomSelectHelper end def tomselect_multiselect(value, options) - tomselect_wrapper = page.find("[name='#{options[:from]}']").sibling(".ts-wrapper") + tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click tomselect_wrapper.find(:css, '.ts-dropdown.multi .ts-dropdown-content .option', text: value).click + # Close the dropdown + page.find("body").click end def tomselect_search_and_select(value, options) - tomselect_wrapper = page.find("[name='#{options[:from]}']").sibling(".ts-wrapper") + tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click # Use send_keys as setting the value directly doesn't trigger the search tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value) @@ -21,7 +23,7 @@ module TomSelectHelper end def tomselect_select(value, options) - tomselect_wrapper = page.find("[name='#{options[:from]}']").sibling(".ts-wrapper") + tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click @@ -36,4 +38,18 @@ module TomSelectHelper find('.ts-dropdown .ts-dropdown-content .option', text: /#{Regexp.quote(value)}/i).click end + + def open_tomselect_to_validate!(page, field_name) + tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper") + tomselect_wrapper.find(".ts-control").click # open the dropdown + + raise 'Please pass the block for expectations' unless block_given? + + # execute block containing expectations + yield + + tomselect_wrapper.find( + '.ts-dropdown .ts-dropdown-content .option.active', + ).click # close the dropdown by selecting the already selected value + end end From d770049d2d0ac4f8b01028537933d451d45ebf31 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 19 Feb 2026 12:56:12 +1100 Subject: [PATCH 3/6] Replace redundant spec helper method --- spec/support/tom_select_helper.rb | 4 ---- spec/system/admin/orders_spec.rb | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/spec/support/tom_select_helper.rb b/spec/support/tom_select_helper.rb index d6faed8eb5..64fd870426 100644 --- a/spec/support/tom_select_helper.rb +++ b/spec/support/tom_select_helper.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true module TomSelectHelper - def tomselect_open(field_name) - page.find("##{field_name}-ts-control").click - end - def tomselect_multiselect(value, options) tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click diff --git a/spec/system/admin/orders_spec.rb b/spec/system/admin/orders_spec.rb index e5bcbcc776..68e5c1c489 100644 --- a/spec/system/admin/orders_spec.rb +++ b/spec/system/admin/orders_spec.rb @@ -100,10 +100,10 @@ RSpec.describe ' end it "order cycles appear in descending order by close date on orders page" do - tomselect_open('q_order_cycle_id_in').click - - expect(find('#q_order_cycle_id_in', - visible: :all)[:innerHTML]).to have_content(/.*Four.*Three.*Two.*Five/m) + open_tomselect_to_validate!(page, 'q_order_cycle_id_in') do + oc_html = find('#q_order_cycle_id_in', visible: :all)[:innerHTML] + expect(oc_html).to have_content(/.*Four.*Three.*Two.*Five/m) + end end it "filter by multiple order cycles" do From 702db32595c77a44a70b5b23abb98c8fbc094079 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 19 Feb 2026 13:10:41 +1100 Subject: [PATCH 4/6] Connect unit label to input And replace redundant spec helper method. --- app/views/spree/admin/products/new.html.haml | 2 +- spec/support/tom_select_helper.rb | 10 ---------- spec/system/admin/products_v3/create_spec.rb | 2 +- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/app/views/spree/admin/products/new.html.haml b/app/views/spree/admin/products/new.html.haml index b7444422d6..ee6c972d59 100644 --- a/app/views/spree/admin/products/new.html.haml +++ b/app/views/spree/admin/products/new.html.haml @@ -29,7 +29,7 @@ .sixteen.columns.alpha .eight.columns.alpha = f.field_container :variant_unit do - = f.label :variant_unit, t(".units") + = f.label :variant_unit_with_scale, t(".units") %span.required * = f.select 'variant_unit', [], { include_blank: true }, diff --git a/spec/support/tom_select_helper.rb b/spec/support/tom_select_helper.rb index 64fd870426..ab653a4555 100644 --- a/spec/support/tom_select_helper.rb +++ b/spec/support/tom_select_helper.rb @@ -25,16 +25,6 @@ module TomSelectHelper tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click end - def select_tom_select(value, from:) - container = find(:id, from) - - within(container) do - find('.ts-control').send_keys(value) - end - - find('.ts-dropdown .ts-dropdown-content .option', text: /#{Regexp.quote(value)}/i).click - end - def open_tomselect_to_validate!(page, field_name) tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click # open the dropdown diff --git a/spec/system/admin/products_v3/create_spec.rb b/spec/system/admin/products_v3/create_spec.rb index e36ba0c9fa..965d9f9e99 100644 --- a/spec/system/admin/products_v3/create_spec.rb +++ b/spec/system/admin/products_v3/create_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'As an enterprise user, I can manage my products' do expect(page).to have_content "New Product" fill_in 'product_name', with: 'Big Bag Of Apples' tomselect_select supplier.name, from: 'product[supplier_id]' - select_tom_select 'Weight (g)', from: 'product_variant_unit_field' + tomselect_search_and_select 'Weight (g)', from: "product_variant_unit_with_scale" fill_in 'product_unit_value', with: '100' fill_in 'product_price', with: '10.00' # TODO dropdowns below are still using select2: From 1dbcddf799d55d49d074fd0cf65d2c8f22b0c8d3 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 19 Feb 2026 13:39:26 +1100 Subject: [PATCH 5/6] Select found option after search to fix spec Selecting the tom select option in the dropdown often happened quicker than the search finished. In that case we selected the option from the list of all options and then the search would present the found option again and leave the dropdown open. This didn't cause any trouble in the past because any other action would close the dropdown again. But the new cuprite version didn't trigger the next click on the target element. It would just close the dropdown on the next click without further action. That would then break the next assertion looking for the next open dropdown, which didn't open with the click. Selecting the "active" option means that we wait for the search to finish and present an option as active. Clicking that option closes the dropdown without opening it again. --- spec/support/tom_select_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/tom_select_helper.rb b/spec/support/tom_select_helper.rb index ab653a4555..86b1e1fd9d 100644 --- a/spec/support/tom_select_helper.rb +++ b/spec/support/tom_select_helper.rb @@ -15,7 +15,7 @@ module TomSelectHelper tomselect_wrapper.find(".ts-control").click # Use send_keys as setting the value directly doesn't trigger the search tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value) - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click + tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option.active', text: value).click end def tomselect_select(value, options) From 2cff5bc4df0ba23b9e0bc4b71e2cdb97c028bf29 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 19 Feb 2026 14:01:59 +1100 Subject: [PATCH 6/6] Style helper code --- spec/support/tom_select_helper.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/support/tom_select_helper.rb b/spec/support/tom_select_helper.rb index 86b1e1fd9d..a5216c10da 100644 --- a/spec/support/tom_select_helper.rb +++ b/spec/support/tom_select_helper.rb @@ -4,7 +4,7 @@ module TomSelectHelper def tomselect_multiselect(value, options) tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click - tomselect_wrapper.find(:css, '.ts-dropdown.multi .ts-dropdown-content .option', + tomselect_wrapper.find(:css, ".ts-dropdown.multi .ts-dropdown-content .option", text: value).click # Close the dropdown page.find("body").click @@ -14,28 +14,28 @@ module TomSelectHelper tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click # Use send_keys as setting the value directly doesn't trigger the search - tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value) - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option.active', text: value).click + tomselect_wrapper.find(".ts-dropdown input.dropdown-input").send_keys(value) + tomselect_wrapper.find(".ts-dropdown .ts-dropdown-content .option.active", text: value).click end def tomselect_select(value, options) tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click + tomselect_wrapper.find(".ts-dropdown .ts-dropdown-content .option", text: value).click end def open_tomselect_to_validate!(page, field_name) tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper") tomselect_wrapper.find(".ts-control").click # open the dropdown - raise 'Please pass the block for expectations' unless block_given? + raise "Please pass the block for expectations" unless block_given? # execute block containing expectations yield tomselect_wrapper.find( - '.ts-dropdown .ts-dropdown-content .option.active', + ".ts-dropdown .ts-dropdown-content .option.active", ).click # close the dropdown by selecting the already selected value end end