114 lines
4.6 KiB
PHP
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();
|
|
});
|