У меня есть gem devise
и gem apartment
, которые я использую для создания отдельных схем для каждой учетной записи пользователя устройства.
документ и рекомендации по этому вопросу предлагают использовать промежуточное ПО Rack для переключения между арендаторами. В этом случае это невозможно (насколько мне известно), поскольку у меня это зависит от пользователя, а не от запроса.
Все работает просто отлично, кроме моих тестов RSpec. Проблема в том, что после каждого теста база данных не очищается должным образом (не удаляет схему для нового созданного пользователя). Все тесты проходят, если я запускаю небольшой набор из них, но если я запускаю их больше, чем Faker::Internet.first_name
, генерируются имена пользователей, которые уже были заняты (что недопустимо).
Итак, вот как я это сделал:
приложение/контроллеры/application_controller.rb
def scope_tenant
Apartment::Database.switch(current_user.username)
end
app/controllers/albums_controller.rb (модель альбома belong_to :user
)
class AlbumsController < ApplicationController
before_action :authenticate_user! # devise magic
before_action :scope_tenant
приложение/модель/user.rb
after_create :create_schema
private
def create_schema
Apartment::Database.create(self.username)
end
Вот что я добавил в свои характеристики:
spec/factories/user.rb
FactoryGirl.define do
factory :user do
username { Faker::Name.first_name }
email { Faker::Internet.email("#{username}") }
password "login_as will not use it anyway"
end
end
spec/support/auth_helpers.rb
Warden.test_mode!
def login_and_switch_schema(user)
login_as(user)
Apartment::Database.switch(user.username) # for some reason `login_as()` didn't do that by itself
end
spec/features/albums_spec.rb
feature "Album Pages" do
given(:user) { create(:user) }
given(:album) { create(:album) }
around :each do
login_and_switch_schema user
end
scenario...
Поскольку у меня есть несколько тестов с js: true
, чем у меня есть:
spec/support/database_cleaner.rb
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Текущая фиксация для всех источников доступна на моем github здесь.
Итак... главный вопрос: как очистить созданные базы данных схемы для каждого пользователя после теста? Я также буду признателен за любые другие комментарии. Заранее спасибо за помощь.