From 58490c26c168698cdc31ade6e174b57a807fb2cc Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 29 Feb 2024 13:17:16 +1100 Subject: [PATCH 1/2] Add rspec-sql gem --- Gemfile | 1 + Gemfile.lock | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index 23e8f60e4b..d4eea771b0 100644 --- a/Gemfile +++ b/Gemfile @@ -161,6 +161,7 @@ group :test, :development do gem 'letter_opener', '>= 1.4.1' gem 'rspec-rails', ">= 3.5.2" gem 'rspec-retry', require: false + gem 'rspec-sql' gem 'rswag' gem 'shoulda-matchers' gem 'stimulus_reflex_testing' diff --git a/Gemfile.lock b/Gemfile.lock index 72b7ce5679..d6767d203c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -626,6 +626,9 @@ GEM rspec-support (~> 3.12) rspec-retry (0.6.2) rspec-core (> 3.3) + rspec-sql (0.0.1) + activesupport + rspec rspec-support (3.12.1) rswag (2.13.0) rswag-api (= 2.13.0) @@ -921,6 +924,7 @@ DEPENDENCIES roo rspec-rails (>= 3.5.2) rspec-retry + rspec-sql rswag rswag-api rswag-ui From 60b86e1d645603b20e369f848552d00a24965a79 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Fri, 1 Mar 2024 11:40:39 +1100 Subject: [PATCH 2/2] Replace custom query counter with new gem rspec-sql --- .rubocop_todo.yml | 1 - .../admin/order_cycles_controller_spec.rb | 7 ++- spec/support/query_counter.rb | 48 ------------------- 3 files changed, 3 insertions(+), 53 deletions(-) delete mode 100644 spec/support/query_counter.rb diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 80d792d884..250bf7c60f 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -889,7 +889,6 @@ Style/PreferredHashMethods: Style/RedundantArgument: Exclude: - 'engines/dfc_provider/app/services/authorization_control.rb' - - 'spec/support/query_counter.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). diff --git a/spec/controllers/admin/order_cycles_controller_spec.rb b/spec/controllers/admin/order_cycles_controller_spec.rb index 085992f2d8..6cabb1f332 100644 --- a/spec/controllers/admin/order_cycles_controller_spec.rb +++ b/spec/controllers/admin/order_cycles_controller_spec.rb @@ -132,9 +132,9 @@ module Admin end it do - query_counter = QueryCounter.new - get :show, params: { id: order_cycle.id }, as: :json - expect(query_counter.queries).to eq( + expect { + get :show, params: { id: order_cycle.id }, as: :json + }.to query_database( { select: { enterprise_fees: 3, @@ -151,7 +151,6 @@ module Admin update: { spree_users: 1 } } ) - query_counter.stop end end end diff --git a/spec/support/query_counter.rb b/spec/support/query_counter.rb deleted file mode 100644 index 009c648d03..0000000000 --- a/spec/support/query_counter.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -class QueryCounter - QUERY_TYPES = [:delete, :insert, :select, :update].freeze - - attr_reader :queries - - def initialize - @queries = {} - @subscriber = ActiveSupport::Notifications. - subscribe("sql.active_record") do |_name, _started, _finished, _unique_id, payload| - type = get_type(payload[:sql]) - next if QUERY_TYPES.exclude?(type) || pg_query?(payload[:sql]) - - table = get_table(payload[:sql]) - @queries[type] ||= {} - @queries[type][table] ||= 0 - @queries[type][table] += 1 - end - end - - def stop - ActiveSupport::Notifications.unsubscribe("sql.active_record") - end - - private - - def get_table(sql) - sql_parts = sql.split(" ") - case get_type(sql) - when :insert - sql_parts[3] - when :update - sql_parts[1] - else - table_index = sql_parts.index("FROM") - sql_parts[table_index + 1] - end.gsub(/(\\|")/, "").to_sym - end - - def get_type(sql) - sql.split(" ")[0].downcase.to_sym - end - - def pg_query?(sql) - sql.include?("SELECT a.attname") || sql.include?("pg_attribute") - end -end