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

114 lines
4.6 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\SalesProspect;
use App\Models\SalesUser;
use Illuminate\Foundation\Testing\DatabaseTransactions;
uses(DatabaseTransactions::class);
function pre_user(string $role = 'manager'): SalesUser
{
return SalesUser::create([
'name' => 'U '.uniqid(), 'email' => 'pre'.uniqid().'@s.local',
'password' => bcrypt('secret'), 'role' => $role, 'is_active' => true,
]);
}
// ── список ниш для подсказок ──────────────────────────────────────────────────
test('список ниш для подсказок отдаётся целиком, по убыванию числа', function () {
$m = pre_user();
SalesProspect::factory()->for($m, 'salesUser')->count(2)->create(['rubric' => 'Окна']);
SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => 'Кровля']);
$res = $this->actingAs($m, 'sales')->getJson('/api/sales/prospects/rubrics');
$res->assertOk();
expect($res->json('rubrics'))->toBe([
['value' => 'Окна', 'count' => 2],
['value' => 'Кровля', 'count' => 1],
]);
});
test('список ниш НЕ сужается владельцем карточек', function () {
$m1 = pre_user();
$m2 = pre_user();
SalesProspect::factory()->for($m1, 'salesUser')->create(['rubric' => 'Окна']);
SalesProspect::factory()->for($m2, 'salesUser')->create(['rubric' => 'Кровля']);
$res = $this->actingAs($m1, 'sales')->getJson('/api/sales/prospects/rubrics');
$values = collect($res->json('rubrics') ?? [])->pluck('value')->all();
expect($values)->toContain('Окна');
expect($values)->toContain('Кровля');
});
// ── правка ниши в карточке ────────────────────────────────────────────────────
test('своя карточка: ниша сохраняется', function () {
$m = pre_user();
$p = SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => null]);
$this->actingAs($m, 'sales')
->patchJson("/api/sales/prospects/{$p->id}/rubric", ['rubric' => 'Кровля'])
->assertOk()
->assertJsonPath('prospect.rubric', 'Кровля');
expect($p->fresh()->rubric)->toBe('Кровля');
});
test('другой регистр приклеивается к существующему написанию', function () {
$m = pre_user();
SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => 'Окна']);
$p = SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => null]);
$this->actingAs($m, 'sales')
->patchJson("/api/sales/prospects/{$p->id}/rubric", ['rubric' => 'окна'])
->assertOk()
->assertJsonPath('prospect.rubric', 'Окна');
});
test('похожая, но другая ниша сохраняется своей', function () {
$m = pre_user();
SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => 'Окна']);
$p = SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => null]);
$this->actingAs($m, 'sales')
->patchJson("/api/sales/prospects/{$p->id}/rubric", ['rubric' => 'Пластиковые окна'])
->assertOk()
->assertJsonPath('prospect.rubric', 'Пластиковые окна');
});
test('пустая строка стирает нишу', function () {
$m = pre_user();
$p = SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => 'Окна']);
$this->actingAs($m, 'sales')
->patchJson("/api/sales/prospects/{$p->id}/rubric", ['rubric' => ''])
->assertOk();
expect($p->fresh()->rubric)->toBeNull();
});
test('чужую карточку менеджеру править нельзя', function () {
$m = pre_user();
$other = pre_user();
$p = SalesProspect::factory()->for($other, 'salesUser')->create(['rubric' => null]);
$this->actingAs($m, 'sales')
->patchJson("/api/sales/prospects/{$p->id}/rubric", ['rubric' => 'Кровля'])
->assertStatus(403);
});
test('начальник правит любую карточку', function () {
$head = pre_user('head');
$m = pre_user();
$p = SalesProspect::factory()->for($m, 'salesUser')->create(['rubric' => null]);
$this->actingAs($head, 'sales')
->patchJson("/api/sales/prospects/{$p->id}/rubric", ['rubric' => 'Кровля'])
->assertOk();
});