86 lines
3.5 KiB
PHP
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);
|
|
});
|