c1f015d17d
Фаза A плана 2026-07-16-external-services-online-monitoring: - BalanceReading::alive() — состояние «жив, денежного баланса нет». - ExternalBalanceRefresher: реестр 6 сервисов, refresh(keys, force, sendAlerts), окно свежести 60с, edge-trigger алерта по колонке light (фон/кнопка sendAlerts=false молчат). - RefreshExternalBalancesJob делегирует рефрешеру (поведение суточного сбора сохранено). Тесты: 35 External зелёные, Larastan 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
40 lines
1.6 KiB
PHP
40 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Jobs\External\RefreshExternalBalancesJob;
|
|
use App\Services\External\BalanceReading;
|
|
use App\Services\External\DadataBalanceProvider;
|
|
use App\Services\External\ExternalBalanceRefresher;
|
|
use App\Services\External\SupplierBalanceProvider;
|
|
use App\Services\External\Yandex360BalanceProvider;
|
|
use App\Services\External\YandexCloudBalanceProvider;
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Tests\Concerns\SharesSupplierPdo;
|
|
|
|
uses(DatabaseTransactions::class, SharesSupplierPdo::class); // запись идёт через pgsql_supplier
|
|
|
|
beforeEach(function () {
|
|
Mail::fake();
|
|
foreach ([
|
|
DadataBalanceProvider::class => 'dadata',
|
|
SupplierBalanceProvider::class => 'supplier',
|
|
YandexCloudBalanceProvider::class => 'yandex_cloud',
|
|
Yandex360BalanceProvider::class => 'email',
|
|
] as $cls => $key) {
|
|
app()->instance($cls, fakeProvider($key, BalanceReading::ok($key, 50000, 'RUB', null)));
|
|
}
|
|
ExternalBalanceRefresher::useLivenessProbes([]);
|
|
});
|
|
|
|
afterEach(fn () => ExternalBalanceRefresher::resetLivenessProbes());
|
|
|
|
it('джоба собирает балансы всех денежных сервисов (делегирует рефрешеру)', function () {
|
|
(new RefreshExternalBalancesJob)->handle(app(ExternalBalanceRefresher::class));
|
|
|
|
$keys = DB::connection('pgsql_supplier')->table('external_service_balances')->pluck('service_key');
|
|
expect($keys)->toContain('dadata')->toContain('supplier')->toContain('yandex_cloud')->toContain('email');
|
|
});
|