RefreshExternalBalancesJob::resetLivenessProbes()); function stubBalanceProvidersOk(): void { app()->instance(DadataBalanceProvider::class, fakeProvider('dadata', BalanceReading::ok('dadata', 9000, 'RUB', 100))); app()->instance(SupplierBalanceProvider::class, fakeProvider('supplier', BalanceReading::ok('supplier', 90000, 'RUB', null))); app()->instance(YandexCloudBalanceProvider::class, fakeProvider('yandex_cloud', BalanceReading::ok('yandex_cloud', 90000, 'RUB', 100))); } it('шлёт одно письмо, когда сервис впервые покраснел', function () { Mail::fake(); stubBalanceProvidersOk(); RefreshExternalBalancesJob::useLivenessProbes([ fakeProbe('jivosite', LivenessReading::down('jivosite', 'HTTP 500')), ]); (new RefreshExternalBalancesJob)->handle(); Mail::assertSent(ExternalServiceDownMail::class, 1); }); it('не шлёт письмо, если сервис уже был красным (без спама)', function () { Mail::fake(); stubBalanceProvidersOk(); // Предзаливаем строку: jivosite уже красный. DB::connection('pgsql_supplier')->table('external_service_balances')->updateOrInsert( ['service_key' => 'jivosite'], ['light' => 'red', 'ok' => true, 'currency' => 'RUB', 'checked_at' => now(), 'updated_at' => now()], ); RefreshExternalBalancesJob::useLivenessProbes([ fakeProbe('jivosite', LivenessReading::down('jivosite', 'HTTP 500')), ]); (new RefreshExternalBalancesJob)->handle(); Mail::assertNothingSent(); }); it('не шлёт письмо, когда всё зелёное', function () { Mail::fake(); stubBalanceProvidersOk(); RefreshExternalBalancesJob::useLivenessProbes([ fakeProbe('jivosite', LivenessReading::alive('jivosite', 'ок')), ]); (new RefreshExternalBalancesJob)->handle(); Mail::assertNothingSent(); });