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); }); 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); });