Files
portal/app/tests/Feature/Sales/SalesBackfillProspectRubricsCommandTest.php
T

86 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\SalesAdAudienceFirm;
use App\Models\SalesProspect;
use App\Models\SalesUser;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use Tests\Concerns\SharesSupplierPdo;
// SharesSupplierPdo: без него записи в pgsql_supplier (фирмы прогрева) НЕ откатываются
// и остаются в общей тестовой базе — соседние тесты потом считают чужие строки.
uses(DatabaseTransactions::class, SharesSupplierPdo::class);
function bpr_user(): SalesUser
{
return SalesUser::create([
'name' => '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);
});