diff --git a/app/app/Services/External/YooKassaLivenessProbe.php b/app/app/Services/External/YooKassaLivenessProbe.php new file mode 100644 index 00000000..1e1c1ba5 --- /dev/null +++ b/app/app/Services/External/YooKassaLivenessProbe.php @@ -0,0 +1,41 @@ +timeout(5)->acceptJson()->get($url); + if ($resp->ok()) { + return LivenessReading::alive('yookassa', 'шлюз отвечает'); + } + + return LivenessReading::down('yookassa', 'HTTP '.$resp->status()); + } catch (\Throwable $e) { + return LivenessReading::down('yookassa', $e->getMessage()); + } + } +} diff --git a/app/config/services.php b/app/config/services.php index d68401af..6a12d5b6 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -116,6 +116,9 @@ return [ // опубликованными ЮKassa подсетями: 185.71.76.0/27,185.71.77.0/27,77.75.153.0/25, // 77.75.154.128/25,77.75.156.11,77.75.156.35,2a02:5180::/32. 'yookassa' => [ + 'shop_id' => env('YOOKASSA_SHOP_ID'), + 'secret_key' => env('YOOKASSA_SECRET_KEY'), + 'api_url' => env('YOOKASSA_API_URL', 'https://api.yookassa.ru/v3'), 'webhook_ip_allowlist' => array_values(array_filter(array_map( 'trim', explode(',', (string) env('YOOKASSA_WEBHOOK_IPS', '')), diff --git a/app/tests/Unit/External/YooKassaLivenessProbeTest.php b/app/tests/Unit/External/YooKassaLivenessProbeTest.php new file mode 100644 index 00000000..9a3b1d2e --- /dev/null +++ b/app/tests/Unit/External/YooKassaLivenessProbeTest.php @@ -0,0 +1,38 @@ +set('services.yookassa.shop_id', '1392092'); + config()->set('services.yookassa.secret_key', 'test_secret'); + config()->set('services.yookassa.api_url', 'https://api.yookassa.ru/v3'); +}); + +it('зелёный при 200 от /me', function () { + Http::fake(['api.yookassa.ru/v3/me' => Http::response(['account_id' => '1392092'], 200)]); + $r = (new YooKassaLivenessProbe)->check(); + expect($r->serviceKey)->toBe('yookassa'); + expect($r->light)->toBe('green'); +}); + +it('красный при 401', function () { + Http::fake(['api.yookassa.ru/v3/me' => Http::response(['type' => 'error'], 401)]); + expect((new YooKassaLivenessProbe)->check()->light)->toBe('red'); +}); + +it('серый, когда ключи не заданы', function () { + config()->set('services.yookassa.shop_id', ''); + config()->set('services.yookassa.secret_key', ''); + expect((new YooKassaLivenessProbe)->check()->light)->toBe('grey'); +}); + +it('красный при сетевой ошибке (проба не бросает)', function () { + Http::fake(fn () => throw new RuntimeException('network down')); + expect((new YooKassaLivenessProbe)->check()->light)->toBe('red'); +});