2026-07-16 14:27:25 +03:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
|
|
use App\Services\External\BalanceReading;
|
|
|
|
|
|
use App\Services\External\DadataBalanceProvider;
|
|
|
|
|
|
use App\Services\External\ExternalBalanceRefresher;
|
|
|
|
|
|
use App\Services\External\SupplierBalanceProvider;
|
|
|
|
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
|
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
|
|
use Illuminate\Support\Facades\DB;
|
2026-07-16 17:05:38 +03:00
|
|
|
|
use Illuminate\Support\Facades\Http;
|
2026-07-16 14:27:25 +03:00
|
|
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
|
|
use Tests\Concerns\SharesSupplierPdo;
|
|
|
|
|
|
|
|
|
|
|
|
uses(DatabaseTransactions::class, SharesSupplierPdo::class); // рефрешер пишет через pgsql_supplier
|
|
|
|
|
|
|
|
|
|
|
|
beforeEach(function () {
|
|
|
|
|
|
Mail::fake();
|
|
|
|
|
|
DB::connection('pgsql_supplier')->table('external_service_balances')->delete();
|
|
|
|
|
|
ExternalBalanceRefresher::useLivenessProbes([]); // без сетевых проб
|
|
|
|
|
|
app()->instance(DadataBalanceProvider::class, fakeProvider('dadata', BalanceReading::ok('dadata', 4500, 'RUB', null)));
|
|
|
|
|
|
app()->instance(SupplierBalanceProvider::class, fakeProvider('supplier', BalanceReading::ok('supplier', 99000, 'RUB', null)));
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
afterEach(fn () => ExternalBalanceRefresher::resetLivenessProbes());
|
|
|
|
|
|
|
|
|
|
|
|
it('POST без service обновляет лёгкие, но НЕ тяжёлый supplier', function () {
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', [])->assertOk();
|
|
|
|
|
|
|
|
|
|
|
|
$keys = DB::connection('pgsql_supplier')->table('external_service_balances')->pluck('service_key');
|
|
|
|
|
|
expect($keys)->toContain('dadata');
|
|
|
|
|
|
expect($keys)->not->toContain('supplier');
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('POST с service=dadata обновляет один сервис и возвращает список', function () {
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', ['service' => 'dadata'])
|
|
|
|
|
|
->assertOk()
|
|
|
|
|
|
->assertJsonStructure(['light', 'services' => [['service_key', 'light', 'ok', 'checked_at']]]);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('неизвестный service → 422', function () {
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', ['service' => 'jivosite'])
|
|
|
|
|
|
->assertStatus(422);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('supplier занят замком → 409, второй робот не стартует', function () {
|
|
|
|
|
|
Cache::lock('external-refresh:supplier', 60)->get(); // занять замок
|
|
|
|
|
|
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', ['service' => 'supplier'])
|
|
|
|
|
|
->assertStatus(409);
|
|
|
|
|
|
});
|
2026-07-16 17:05:38 +03:00
|
|
|
|
|
|
|
|
|
|
it('POST с services[] обновляет группу «Поиск клиентов» разом', function () {
|
|
|
|
|
|
Http::fake(['*' => Http::response('ok', 200)]); // живость проб — без сети
|
|
|
|
|
|
ExternalBalanceRefresher::resetLivenessProbes(); // реальные пробы, но HTTP фейкнут
|
|
|
|
|
|
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', [
|
|
|
|
|
|
'services' => ['sales_finder', 'xfetch', 'keyso'],
|
|
|
|
|
|
])
|
|
|
|
|
|
->assertOk()
|
|
|
|
|
|
->assertJsonStructure(['light', 'services' => [['service_key', 'light', 'ok', 'checked_at']]]);
|
|
|
|
|
|
|
|
|
|
|
|
$keys = DB::connection('pgsql_supplier')->table('external_service_balances')->pluck('service_key');
|
|
|
|
|
|
foreach (['sales_finder', 'xfetch', 'keyso'] as $k) {
|
|
|
|
|
|
expect($keys)->toContain($k);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('неизвестный ключ в services[] → 422', function () {
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', ['services' => ['xfetch', 'нет-такого']])
|
|
|
|
|
|
->assertStatus(422);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('тяжёлый supplier в services[] → 422 (обновляется отдельной кнопкой)', function () {
|
|
|
|
|
|
$this->postJson('/api/admin/dashboard/balances/refresh', ['services' => ['xfetch', 'supplier']])
|
|
|
|
|
|
->assertStatus(422);
|
|
|
|
|
|
});
|