'U '.uniqid(), 'email' => 'bpr'.uniqid().'@s.local', 'password' => bcrypt('secret'), 'role' => 'manager', 'is_active' => true, ]); } test('берёт нишу по связи прогрев → карточка', function () { $p = SalesProspect::factory()->for(bpr_user(), 'salesUser')->create(['rubric' => null]); SalesAdAudienceFirm::create([ 'firm_name' => 'Ф', 'firm_inn' => '7707'.random_int(100000, 999999), 'rubric' => 'Окна', 'prospect_id' => $p->id, ]); $this->artisan('sales:backfill-prospect-rubrics')->assertExitCode(0); expect($p->fresh()->rubric)->toBe('Окна'); }); test('берёт нишу по ИНН, когда связи нет', function () { $inn = '7708'.random_int(100000, 999999); $p = SalesProspect::factory()->for(bpr_user(), 'salesUser')->create(['inn' => $inn, 'rubric' => null]); SalesAdAudienceFirm::create(['firm_name' => 'Ф', 'firm_inn' => $inn, 'rubric' => 'Кровля']); $this->artisan('sales:backfill-prospect-rubrics')->assertExitCode(0); expect($p->fresh()->rubric)->toBe('Кровля'); }); test('--dry-run ничего не пишет', function () { $p = SalesProspect::factory()->for(bpr_user(), 'salesUser')->create(['rubric' => null]); SalesAdAudienceFirm::create([ 'firm_name' => 'Ф', 'firm_inn' => '7709'.random_int(100000, 999999), 'rubric' => 'Окна', 'prospect_id' => $p->id, ]); $this->artisan('sales:backfill-prospect-rubrics --dry-run')->assertExitCode(0); expect($p->fresh()->rubric)->toBeNull(); }); test('уже проставленную нишу не трогает', function () { $p = SalesProspect::factory()->for(bpr_user(), 'salesUser')->create(['rubric' => 'Своя']); SalesAdAudienceFirm::create([ 'firm_name' => 'Ф', 'firm_inn' => '7710'.random_int(100000, 999999), 'rubric' => 'Окна', 'prospect_id' => $p->id, ]); $this->artisan('sales:backfill-prospect-rubrics')->assertExitCode(0); expect($p->fresh()->rubric)->toBe('Своя'); }); test('ключ --connection переключает соединение и возвращает его на место', function () { $before = DB::getDefaultConnection(); $p = SalesProspect::factory()->for(bpr_user(), 'salesUser')->create(['rubric' => null]); SalesAdAudienceFirm::create([ 'firm_name' => 'Ф', 'firm_inn' => '7711'.random_int(100000, 999999), 'rubric' => 'Окна', 'prospect_id' => $p->id, ]); $this->artisan('sales:backfill-prospect-rubrics --connection=pgsql_supplier')->assertExitCode(0); expect($p->fresh()->rubric)->toBe('Окна'); // Соединение обязано вернуться: иначе следующая команда в том же процессе // пойдёт чужой ролью и упрётся в права. expect(DB::getDefaultConnection())->toBe($before); });