tenant = Tenant::factory()->create(); // ДаДата включена (ключ задан) — иначе обогащение не стартует. config()->set('services.dadata.api_key', 'test-key'); config()->set('services.dadata.secret', 'test-secret'); Cache::flush(); // чистый дневной бюджет }); it('проставляет оператора контактам без оператора', function () { Http::fake(['cleaner.dadata.ru/*' => Http::response([['qc' => 0, 'provider' => 'МТС']], 200)]); $c = ClientSmsContact::create(['tenant_id' => $this->tenant->id, 'phone' => '79990000001']); (new EnrichClientSmsContactsOperatorJob($this->tenant->id))->handle( app(DaDataPhoneClient::class), app(DaDataBudgetGuard::class), ); expect($c->fresh()->operator)->toBe('МТС'); }); it('не трогает контакты, у которых оператор уже известен (экономим ДаДату)', function () { Http::fake(['cleaner.dadata.ru/*' => Http::response([['qc' => 0, 'provider' => 'Билайн']], 200)]); $c = ClientSmsContact::create(['tenant_id' => $this->tenant->id, 'phone' => '79990000002', 'operator' => 'mts']); (new EnrichClientSmsContactsOperatorJob($this->tenant->id))->handle( app(DaDataPhoneClient::class), app(DaDataBudgetGuard::class), ); expect($c->fresh()->operator)->toBe('mts'); // не перезаписан Http::assertNothingSent(); // ДаДату не дёргали }); it('сбой ДаДаты не роняет обогащение — оператор остаётся пустым', function () { Http::fake(['cleaner.dadata.ru/*' => Http::response('boom', 500)]); $c = ClientSmsContact::create(['tenant_id' => $this->tenant->id, 'phone' => '79990000003']); (new EnrichClientSmsContactsOperatorJob($this->tenant->id))->handle( app(DaDataPhoneClient::class), app(DaDataBudgetGuard::class), ); expect($c->fresh()->operator)->toBeNull(); }); it('при исчерпанном дневном бюджете ДаДату не дёргает', function () { Http::fake(['cleaner.dadata.ru/*' => Http::response([['qc' => 0, 'provider' => 'МТС']], 200)]); // выбираем весь дневной лимит config()->set('services.dadata.daily_cap_rub', 1); app(DaDataBudgetGuard::class)->recordSpend(200); // 2 ₽ > 1 ₽ $c = ClientSmsContact::create(['tenant_id' => $this->tenant->id, 'phone' => '79990000004']); (new EnrichClientSmsContactsOperatorJob($this->tenant->id))->handle( app(DaDataPhoneClient::class), app(DaDataBudgetGuard::class), ); expect($c->fresh()->operator)->toBeNull(); Http::assertNothingSent(); });