Fix account destroy cascade gaps
Account incineration could leave orphaned records due to missing cascade declarations and async jobs failing when the account was already gone. Cascade fixes: - Add Account::Searchable concern to clean up Search::Query (delete_all) and Search::Record (destroy_all, respects SQLite FTS dependent: :destroy) - Add before_destroy in Account::Storage to delete storage entries - Suppress storage entry recording during incineration so attachment purge callbacks don't create entries or enqueue materialize jobs - Guard Access#clean_inaccessible_data_later with unless user.destroyed? to avoid enqueuing pointless jobs during user cascade Job tenancy: - Extract AccountTenanted concern from the global ActiveJob initializer into ApplicationJob (include) with targeted prepends for ActionMailer::MailDeliveryJob and Turbo broadcast jobs - Defer account resolution from deserialize to perform so that missing accounts raise DeserializationError inside the execution path where discard_on can handle it Tests: - Comprehensive incineration test covering 35 model types with before/after assertions and full enqueued job processing - Mailer deliver_later test verifying account context survives job serialization for multi-account users - Turbo broadcast test verifying account-scoped URLs in rendered partials
This commit is contained in:
@@ -48,6 +48,16 @@ module ActiveSupport
|
||||
include ActionTextTestHelper, CachingTestHelper, CardTestHelper, ChangeTestHelper, SessionTestHelper
|
||||
include Turbo::Broadcastable::TestHelper
|
||||
|
||||
# Jobs must carry their own account context via AccountTenanted,
|
||||
# not rely on Current.account leaking from the test setup.
|
||||
def perform_enqueued_jobs(...)
|
||||
saved_account = Current.account
|
||||
Current.account = nil
|
||||
super
|
||||
ensure
|
||||
Current.account = saved_account
|
||||
end
|
||||
|
||||
setup do
|
||||
Current.account = accounts("37s")
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user