Clean with transaction not working for 2 databases
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- postgresql, ruby
- Área
- databases, testing-qa
Línea de trabajo
Comienza con lib/database_cleaner/active_record/transaction.rb, especialmente con las rutas de start y clean de la estrategia de transacción, y reproduce la configuración de RSpec con dos ejemplos descrita en el issue. Compara los recuentos de transacciones registrados y el estado de la base de datos del tenant antes y después de cada ejemplo. Se considera terminado cuando, después de la limpieza, la base de datos del tenant ya no contiene ningún paciente del ejemplo anterior.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I've used DatabaseCleaner for several years (thanks!) without issues. But my current setup seems to not work properly.
Basic setup:
- Grape 0.19.2
- ActiveRecord 5.1.3 (+ otr-activerecord 1.2.4)
- RSpec 3.6.0
- DatabaseCleaner 1.6.1
- Posgres 9.5
On noteworthy thing about the app here is that it's using multiple databases: One main database and several tenant databases. In the test environment, this currently means two databases in total (main + test tenant).
Here's the test setup:
TEST_TENANT = 'the_tenant'
TEST_TENANT_API_KEY = SecureRandom.uuid.gsub('-', '')
RSpec.configure do |config|
config.mock_with :rspec
config.expect_with :rspec
config.raise_errors_for_deprecations!
# config.order = 'random'
config.before(:suite) do
ApiApp.establish_connection # ApiApp is connected to the main DB
primary_cleaner.clean_with(:truncation)
tenant = ApiApp.where(identifier: TEST_TENANT).first_or_create!(
name: 'The tenant',
api_key: TEST_TENANT_API_KEY
)
# force full recreate of tenant DB
config = ActiveRecord::Base.configurations[tenant.identifier]
ActiveRecord::Tasks::DatabaseTasks.drop(config) rescue nil
ActiveRecord::Tasks::DatabaseTasks.create(config)
ActiveRecord::Tasks::DatabaseTasks.load_schema(config, :sql, 'db/structure.sql')
# seed it
AppSetter.with(TEST_TENANT) do
Dir["#{Dir.pwd}/spec/seeds/*.rb"].sort.each { |f| load f }
end
end
config.before(:each) do |example|
AppSetter.set(TEST_TENANT)
puts ['[RSpec] start before', "number of patients: #{Patient.count}", Patient.connection.instance_variable_get(:@config)[:database]].inspect
# primary_cleaner.start
tenant_cleaner.start
puts ['[RSpec] end before', "number of patients: #{Patient.count}", Patient.connection.instance_variable_get(:@config)[:database]].inspect
end
config.append_after(:each) do
puts ['[RSpec] start append_after', "number of patients: #{Patient.count}", Patient.connection.instance_variable_get(:@config)[:database]].inspect
# primary_cleaner.clean
tenant_cleaner.clean
puts ['[RSpec] end append_after', "number of patients: #{Patient.count}", Patient.connection.instance_variable_get(:@config)[:database]].inspect
puts '-' * 100
end
private
def primary_cleaner
@primary_cleaner ||= cleaner_for(connection: ENV['RACK_ENV'].to_sym)
end
def tenant_cleaner
@tenant_cleaner ||= cleaner_for(connection: TEST_TENANT.to_sym)
end
def cleaner_for(options)
DatabaseCleaner[:active_record, options].tap { |cleaner| cleaner.strategy = :transaction }
end
end
Now when I have 2 examples in RSpec which both use the same basic setup with a test patient (Patient.create!(email: '[email protected]', ...)), the uniqueness constraint on email fails because apparently the record exists already. The debugging code in the output (from the puts statements above) confirms this:
(1) ["[RSpec] start before", "number of patients: 0", "api_test_the_tenant"]
["[DatabaseCleaner] before start", "open transactions: 0", "api_test_the_tenant"]
(2) ["[DatabaseCleaner] after start", "open transactions: 1", "api_test_the_tenant"]
["[RSpec] end before", "number of patients: 0", "api_test_the_tenant"]
(3) ["[RSpec] start append_after", "number of patients: 1", "api_test_the_tenant"]
["[DatabaseCleaner] before clean", "open transactions: 1", "api_test_the_tenant"]
(4) ["[DatabaseCleaner] after clean", "open transactions: 0", "api_test_the_tenant"]
(5) ["[RSpec] end append_after", "number of patients: 1", "api_test_the_tenant"]
----------------------------------------------------------------------------------------------------
(6) ["[RSpec] start before", "number of patients: 1", "api_test_the_tenant"]
["[DatabaseCleaner] before start", "open transactions: 0", "api_test_the_tenant"]
["[DatabaseCleaner] after start", "open transactions: 1", "api_test_the_tenant"]
["[RSpec] end before", "number of patients: 1", "api_test_the_tenant"]
["[RSpec] start append_after", "number of patients: 1", "api_test_the_tenant"]
["[DatabaseCleaner] before clean", "open transactions: 1", "api_test_the_tenant"]
["[DatabaseCleaner] after clean", "open transactions: 0", "api_test_the_tenant"]
["[RSpec] end append_after", "number of patients: 1", "api_test_the_tenant"]
----------------------------------------------------------------------------------------------------
(I've numbered some lines to make it easier to follow. The [DatabaseCleaner] output comes from some puts statements I've put in the corresponding strategy in https://github.com/DatabaseCleaner/database_cleaner/blob/master/lib/database_cleaner/active_record/transaction.rb.)
(1) Before the first example (in the first before block), there are 0 patients in the tenant database => expected.
(2) tenant_cleaner.start has caused an open transaction in the tenant database => expected.
(3) Running the example has created a patient in the tenant database => expected.
(4) tenant_cleaner.clean rolls back the transaction => expected.
(5) There is still 1 patient in the tenant database => this is NOT expected.
(6) The before block of the next example confirms that 1 patient has remained in the tenant database => this is NOT expected.
Commenting in/out the cleaning of the primary database doesn't change anything (I wouldn't have expected it to either, but I tried it nonetheless).
Does anyone have any insights as to what's going wrong here?
Thanks a lot in advance.
- Lenguaje dominante
- Ruby
- Estrellas
- 76
- Forks
- 76
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de DatabaseCleaner/database_cleaner-active_record
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 30/100
DatabaseCleaner/database_cleaner-active_record#128 · 1 comentario ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
DatabaseCleaner/database_cleaner-active_record#127 · 3 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
-
Parallelized truncatesAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Todos los issues de DatabaseCleaner/database_cleaner-active_record
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
security
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
IBM/ai-security-baseline#25 ·
-
security
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Mend: dependency security vulnerability
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Mend: dependency security vulnerability
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100