57 lines
2.2 KiB
PHP
57 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\SalesAdAudienceFirm;
|
|
use App\Models\SalesProspect;
|
|
use App\Models\SalesUser;
|
|
use App\Services\Sales\RubricCanonicalizer;
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
use Tests\Concerns\SharesSupplierPdo;
|
|
|
|
// SharesSupplierPdo: без него записи в pgsql_supplier (фирмы прогрева) НЕ откатываются
|
|
// и остаются в общей тестовой базе — соседние тесты потом считают чужие строки.
|
|
uses(DatabaseTransactions::class, SharesSupplierPdo::class);
|
|
|
|
function rc_user(): SalesUser
|
|
{
|
|
return SalesUser::create([
|
|
'name' => 'U '.uniqid(), 'email' => 'rc'.uniqid().'@s.local',
|
|
'password' => bcrypt('secret'), 'role' => 'manager', 'is_active' => true,
|
|
]);
|
|
}
|
|
|
|
test('совпал ключ — берём уже существующее написание', function () {
|
|
SalesProspect::factory()->for(rc_user(), 'salesUser')->create(['rubric' => 'Окна']);
|
|
|
|
$c = app(RubricCanonicalizer::class);
|
|
|
|
expect($c->canonical('окна'))->toBe('Окна')
|
|
->and($c->canonical(' ОКНА '))->toBe('Окна');
|
|
});
|
|
|
|
test('ключ не совпал — сохраняем как есть, только подчистив пробелы', function () {
|
|
SalesProspect::factory()->for(rc_user(), 'salesUser')->create(['rubric' => 'Окна']);
|
|
|
|
$c = app(RubricCanonicalizer::class);
|
|
|
|
expect($c->canonical(' Пластиковые окна '))->toBe('Пластиковые окна');
|
|
});
|
|
|
|
test('ниша из прогрева тоже считается существующей', function () {
|
|
SalesAdAudienceFirm::create([
|
|
'firm_name' => 'Ф', 'firm_inn' => '7700'.random_int(100000, 999999),
|
|
'rubric' => 'Частные стоматологии',
|
|
]);
|
|
|
|
expect(app(RubricCanonicalizer::class)->canonical('частные стоматологии'))
|
|
->toBe('Частные стоматологии');
|
|
});
|
|
|
|
test('пустая ниша даёт null', function () {
|
|
$c = app(RubricCanonicalizer::class);
|
|
|
|
expect($c->canonical(null))->toBeNull()
|
|
->and($c->canonical(' '))->toBeNull();
|
|
});
|