set('client_tg.sandbox', true); }); /** Кампания-список заданного статуса с двумя фейковыми номерами. */ function externalIdCampaign(int $tenantId): Campaign { $campaign = Campaign::query()->create([ 'tenant_id' => $tenantId, 'status' => Campaign::STATUS_QUEUED, 'ad_text' => 'Приходите к нам за услугой', 'ad_link' => 'https://example.test/promo', 'ord_category' => 'Размещение рекламы', 'budget_cap_rub' => '1500.00', 'audience_kind' => Campaign::AUDIENCE_LIST, 'planned_count' => 2, 'estimated_cost_rub' => '0.00', 'created_by' => 1, ]); foreach (['79990000001', '79990000002'] as $phone) { CampaignPhone::query()->create([ 'tenant_id' => $tenantId, 'campaign_id' => $campaign->id, 'phone' => $phone, ]); } return $campaign; } /** Подменяет раннер моком, возвращающим $result. */ function externalIdMockRobot(RobotResult $result): void { $mock = Mockery::mock(TelegramRobotRunner::class); $mock->shouldReceive('run')->andReturn($result); app()->instance(TelegramRobotRunner::class, $mock); } it('успех: mts_campaign_id сохранён, статус draft_ready', function () { $tenant = Tenant::factory()->create(); $campaign = externalIdCampaign($tenant->id); externalIdMockRobot(new RobotResult(ok: true, matched: 437, launched: false, campaignId: '2231134')); RunTelegramCampaignJob::dispatchSync($campaign->id, $tenant->id); $fresh = Campaign::find($campaign->id); expect($fresh->mts_campaign_id)->toBe('2231134') ->and($fresh->status)->toBe(Campaign::STATUS_DRAFT_READY); }); it('отказ с id: mts_campaign_id сохранён, статус failed', function () { $tenant = Tenant::factory()->create(); $campaign = externalIdCampaign($tenant->id); externalIdMockRobot(RobotResult::failed('regulated-тема', 'ad', '2231134')); RunTelegramCampaignJob::dispatchSync($campaign->id, $tenant->id); $fresh = Campaign::find($campaign->id); expect($fresh->mts_campaign_id)->toBe('2231134') ->and($fresh->status)->toBe(Campaign::STATUS_FAILED); });