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:
@@ -106,6 +106,19 @@ class Notification::BundleMailerTest < ActionMailer::TestCase
|
||||
"Should not generate a real email when all notifications are stale"
|
||||
end
|
||||
|
||||
test "deliver_later works with account context" do
|
||||
# Give user a second account so the mailer includes the account name in the subject
|
||||
second_account = Account.create!(name: "Second account")
|
||||
second_account.users.create!(identity: @user.identity, role: :member, name: @user.name)
|
||||
|
||||
create_notification(@user)
|
||||
|
||||
Notification::BundleMailer.notification(@bundle).deliver_later
|
||||
perform_enqueued_jobs
|
||||
|
||||
assert_emails 1
|
||||
end
|
||||
|
||||
private
|
||||
def create_notification(user, source: events(:logo_published))
|
||||
Notification.create!(user: user, creator: user, source: source, created_at: 30.minutes.ago)
|
||||
|
||||
Reference in New Issue
Block a user