Queue::fake()); function studyBatchApiCompetitor(int $tenantId, string $name): AutopodborCompetitor { return AutopodborCompetitor::create([ 'tenant_id' => $tenantId, 'name' => $name, 'origin' => 'manual', 'dedup_key' => Str::slug($name).'-'.Str::random(6), 'box' => 'field', ]); } it('POST /api/autopodbor/study/batch — достаточный баланс → 202 с batch_id и queued', function () { $tenant = Tenant::factory()->create(['balance_rub' => '100000.00']); $user = User::factory()->create(['tenant_id' => $tenant->id]); DB::statement('SET app.current_tenant_id = '.$tenant->id); SystemSetting::updateOrCreate(['key' => 'autopodbor_price_study_rub'], ['value' => '300', 'type' => 'decimal']); $c1 = studyBatchApiCompetitor($tenant->id, 'Окна А'); $c2 = studyBatchApiCompetitor($tenant->id, 'Окна Б'); $response = $this->actingAs($user)->postJson('/api/autopodbor/study/batch', [ 'competitor_ids' => [$c1->id, $c2->id], ])->assertStatus(202) ->assertJsonStructure(['batch_id', 'queued']) ->assertJsonPath('queued', 2); expect(AutopodborRun::where('batch_id', $response->json('batch_id'))->count())->toBe(2); }); it('POST /api/autopodbor/study/batch — маленький баланс + committed проекты → 422 с topup_rub и max_affordable', function () { $tenant = Tenant::factory()->create(['balance_rub' => '100.00', 'delivered_in_month' => 0]); $user = User::factory()->create(['tenant_id' => $tenant->id]); DB::statement('SET app.current_tenant_id = '.$tenant->id); SystemSetting::updateOrCreate(['key' => 'autopodbor_price_study_rub'], ['value' => '300', 'type' => 'decimal']); // Активный проект-обязательство + сетка тарифов — гейт учитывает резерв проектов (паритет со StudyBatchEnqueueTest). Project::factory()->create(['tenant_id' => $tenant->id, 'is_active' => true, 'daily_limit_target' => 10]); PricingTier::factory()->create([ 'tier_no' => 1, 'leads_in_tier' => null, 'price_per_lead_kopecks' => 3000, 'is_active' => true, 'effective_from' => now()->toDateString(), ]); $c1 = studyBatchApiCompetitor($tenant->id, 'Окна А'); $c2 = studyBatchApiCompetitor($tenant->id, 'Окна Б'); $this->actingAs($user)->postJson('/api/autopodbor/study/batch', [ 'competitor_ids' => [$c1->id, $c2->id], ])->assertStatus(422) ->assertJsonStructure(['message', 'topup_rub', 'max_affordable']); });