From 458d46e9fdd86bb7bce5d862c7e2e5aabd1a7d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 25 May 2026 03:28:00 +0300 Subject: [PATCH] =?UTF-8?q?fix(billing-v2-c):=20per-tenant=20Mail-=D1=84?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D0=B2=20idempotent-=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B5=20sweep-job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit liderra_testing persistent (RefreshDatabase off) — DemoSeeder тенанты могут попасть в sweep и тоже получить BalanceFrozenMail. Без per-tenant фильтра Mail::assertNotQueued() ловил 154 фоновых письма и валил тест. Логика BalancePreflightSweepJob корректна — фикс только в test isolation. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/tests/Feature/Billing/BalancePreflightSweepJobTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/tests/Feature/Billing/BalancePreflightSweepJobTest.php b/app/tests/Feature/Billing/BalancePreflightSweepJobTest.php index c992921f..0d94bf4a 100644 --- a/app/tests/Feature/Billing/BalancePreflightSweepJobTest.php +++ b/app/tests/Feature/Billing/BalancePreflightSweepJobTest.php @@ -56,7 +56,9 @@ it('is idempotent — does not re-freeze already frozen tenant', function () { (new BalancePreflightSweepJob)->handle(); - // Дата заморозки не перезаписана, повторного письма нет. + // Дата заморозки не перезаписана; для ЭТОГО tenant повторного письма нет. + // NB: per-tenant фильтр, т.к. liderra_testing persistent (DemoSeeder тенанты + // могут попасть в sweep и тоже получить BalanceFrozenMail — не наш ответ). expect($tenant->fresh()->frozen_by_balance_at->timestamp)->toBe($frozenAt->timestamp); - Mail::assertNotQueued(BalanceFrozenMail::class); + Mail::assertNotQueued(BalanceFrozenMail::class, fn ($mail) => $mail->tenant->id === $tenant->id); });