Use transactions in JS feature specs
Uses Rails transactional tests instead of DatabaseCleaner transaction strategy because that doesn't work with JS tests
This commit is contained in:
parent
ecffca5d92
commit
d4a919679a
|
@ -40,7 +40,7 @@ Rails.application.configure do
|
||||||
# Print deprecation notices to the stderr
|
# Print deprecation notices to the stderr
|
||||||
config.active_support.deprecation = :stderr
|
config.active_support.deprecation = :stderr
|
||||||
|
|
||||||
config.eager_load = false
|
config.eager_load = true
|
||||||
|
|
||||||
config.cache_store = :null_store
|
config.cache_store = :null_store
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
ActiveRecord::ConnectionAdapters::ConnectionPool.prepend Gitlab::Patch::ActiveRecordQueryCache
|
|
@ -284,17 +284,28 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
# inside_transaction? will return true if the caller is running within a transaction. Handles special cases
|
# inside_transaction? will return true if the caller is running within a transaction. Handles special cases
|
||||||
# when running inside a test environment, in which the entire test is running with a DatabaseCleaner transaction
|
# when running inside a test environment, where tests may be wrapped in transactions
|
||||||
def self.inside_transaction?
|
def self.inside_transaction?
|
||||||
ActiveRecord::Base.connection.open_transactions > open_transactions_baseline
|
if Rails.env.test?
|
||||||
|
ActiveRecord::Base.connection.open_transactions > open_transactions_baseline
|
||||||
|
else
|
||||||
|
ActiveRecord::Base.connection.open_transactions > 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# These methods that access @open_transactions_baseline are not thread-safe.
|
||||||
|
# These are fine though because we only call these in RSpec's main thread. If we decide to run
|
||||||
|
# specs multi-threaded, we would need to use something like ThreadGroup to keep track of this value
|
||||||
|
def self.set_open_transactions_baseline
|
||||||
|
@open_transactions_baseline = ActiveRecord::Base.connection.open_transactions
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.reset_open_transactions_baseline
|
||||||
|
@open_transactions_baseline = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.open_transactions_baseline
|
def self.open_transactions_baseline
|
||||||
if ::Rails.env.test?
|
@open_transactions_baseline ||= 0
|
||||||
return DatabaseCleaner.connections.count { |conn| conn.strategy.is_a?(DatabaseCleaner::ActiveRecord::Transaction) }
|
|
||||||
end
|
|
||||||
|
|
||||||
0
|
|
||||||
end
|
end
|
||||||
private_class_method :open_transactions_baseline
|
private_class_method :open_transactions_baseline
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Fixes a bug where the query cache isn't aware of the shared
|
||||||
|
# ActiveRecord connection used in tests
|
||||||
|
# https://github.com/rails/rails/issues/36587
|
||||||
|
|
||||||
|
# To be removed with https://gitlab.com/gitlab-org/gitlab-ce/issues/64413
|
||||||
|
|
||||||
|
module Gitlab
|
||||||
|
module Patch
|
||||||
|
module ActiveRecordQueryCache
|
||||||
|
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||||
|
def enable_query_cache!
|
||||||
|
@query_cache_enabled[connection_cache_key(current_thread)] = true
|
||||||
|
connection.enable_query_cache! if active_connection?
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_query_cache!
|
||||||
|
@query_cache_enabled.delete connection_cache_key(current_thread)
|
||||||
|
connection.disable_query_cache! if active_connection?
|
||||||
|
end
|
||||||
|
|
||||||
|
def query_cache_enabled
|
||||||
|
@query_cache_enabled[connection_cache_key(current_thread)]
|
||||||
|
end
|
||||||
|
|
||||||
|
def active_connection?
|
||||||
|
@thread_cached_conns[connection_cache_key(current_thread)]
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_thread
|
||||||
|
@lock_thread || Thread.current
|
||||||
|
end
|
||||||
|
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -47,7 +47,7 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
||||||
quality_level = Quality::TestLevel.new
|
quality_level = Quality::TestLevel.new
|
||||||
|
|
||||||
RSpec.configure do |config|
|
RSpec.configure do |config|
|
||||||
config.use_transactional_fixtures = false
|
config.use_transactional_fixtures = true
|
||||||
config.use_instantiated_fixtures = false
|
config.use_instantiated_fixtures = false
|
||||||
config.fixture_path = Rails.root
|
config.fixture_path = Rails.root
|
||||||
|
|
||||||
|
@ -289,6 +289,16 @@ RSpec.configure do |config|
|
||||||
config.before(:each, :https_pages_disabled) do |_|
|
config.before(:each, :https_pages_disabled) do |_|
|
||||||
allow(Gitlab.config.pages).to receive(:external_https).and_return(false)
|
allow(Gitlab.config.pages).to receive(:external_https).and_return(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# We can't use an `around` hook here because the wrapping transaction
|
||||||
|
# is not yet opened at the time that is triggered
|
||||||
|
config.prepend_before do
|
||||||
|
Gitlab::Database.set_open_transactions_baseline
|
||||||
|
end
|
||||||
|
|
||||||
|
config.append_after do
|
||||||
|
Gitlab::Database.reset_open_transactions_baseline
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# add simpler way to match asset paths containing digest strings
|
# add simpler way to match asset paths containing digest strings
|
||||||
|
|
|
@ -26,31 +26,22 @@ RSpec.configure do |config|
|
||||||
end
|
end
|
||||||
|
|
||||||
config.append_after(:context) do
|
config.append_after(:context) do
|
||||||
DatabaseCleaner.clean_with(:deletion, cache_tables: false)
|
delete_from_all_tables!
|
||||||
end
|
end
|
||||||
|
|
||||||
config.before do
|
config.around(:each, :delete) do |example|
|
||||||
setup_database_cleaner
|
self.class.use_transactional_tests = false
|
||||||
DatabaseCleaner.strategy = :transaction
|
|
||||||
|
example.run
|
||||||
|
|
||||||
|
delete_from_all_tables!(except: deletion_except_tables)
|
||||||
end
|
end
|
||||||
|
|
||||||
config.before(:each, :js) do
|
config.around(:each, :migration) do |example|
|
||||||
DatabaseCleaner.strategy = :deletion, { except: deletion_except_tables, cache_tables: false }
|
self.class.use_transactional_tests = false
|
||||||
end
|
|
||||||
|
|
||||||
config.before(:each, :delete) do
|
example.run
|
||||||
DatabaseCleaner.strategy = :deletion, { except: deletion_except_tables, cache_tables: false }
|
|
||||||
end
|
|
||||||
|
|
||||||
config.before(:each, :migration) do
|
delete_from_all_tables!
|
||||||
DatabaseCleaner.strategy = :deletion, { cache_tables: false }
|
|
||||||
end
|
|
||||||
|
|
||||||
config.before do
|
|
||||||
DatabaseCleaner.start
|
|
||||||
end
|
|
||||||
|
|
||||||
config.append_after do
|
|
||||||
DatabaseCleaner.clean
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
module DbCleaner
|
module DbCleaner
|
||||||
|
def delete_from_all_tables!(except: nil)
|
||||||
|
DatabaseCleaner.clean_with(:deletion, cache_tables: false, except: except)
|
||||||
|
end
|
||||||
|
|
||||||
def deletion_except_tables
|
def deletion_except_tables
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
require 'gitlab/email/receiver'
|
|
||||||
|
|
||||||
shared_context :email_shared_context do
|
shared_context :email_shared_context do
|
||||||
let(:mail_key) { "59d8df8370b7e95c5a49fbf86aeb2c93" }
|
let(:mail_key) { "59d8df8370b7e95c5a49fbf86aeb2c93" }
|
||||||
let(:receiver) { Gitlab::Email::Receiver.new(email_raw) }
|
let(:receiver) { Gitlab::Email::Receiver.new(email_raw) }
|
||||||
|
|
Loading…
Reference in New Issue