Files
portal/app/tests/Frontend/projectName.spec.ts
T
Дмитрий 36ea9cde04 feat(deals): убрать префикс B1_/B2_/B3_ из отображения «Источник»
Поставщик crm.bp префиксует имена проектов признаком канала-провайдера
(B1_/B2_/B3_ — три базы лидов). В UI Лидерры префикс — шум: пользователю
интересен сам проект, не канал.

Трансформация display-only — данные в БД не трогаем, фильтрация идёт по
project_id (не name).

Утилита: app/resources/js/composables/projectName.ts → stripChannelPrefix.
Регэксп ^B[123]_ case-insensitive; null/undefined/'' → ''.

Применено в 4 точках:
- DealsTable «Источник» (item.project)
- DealsFilters «Проект» dropdown (через computed-маппинг в DealsView)
- KanbanCard карточка
- DealDetailBody параметры панели

Тесты: 8 unit-тестов на утилиту (B1/B2/B3 case-insensitive, не трогать
B0/B4/Bx, не трогать префикс в середине строки, null/undefined/''),
38/38 на затронутых компонентах, 868/3sk/0 full Vitest, build 2.62s.

Smoke /deals: 20 строк, ни одна не начинается с B1_/B2_/B3_ (был
«B1_73912557675 [35]», стал «73912557675 [35]»; «B3_krk-finance.ru/...»
→ «krk-finance.ru/...»). Скриншот deals-no-bprefix-2026-05-18.png.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 14:33:33 +03:00

47 lines
2.1 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { stripChannelPrefix } from '../../resources/js/composables/projectName';
/**
* Имена проектов crm.bp префиксуются B1_/B2_/B3_ (источник-провайдер).
* В UI Лидерры префикс убираем — он шум для пользователя; данные в БД не трогаем.
*/
describe('stripChannelPrefix', () => {
it('убирает B1_ префикс', () => {
expect(stripChannelPrefix('B1_73912557675 [35]')).toBe('73912557675 [35]');
});
it('убирает B2_ префикс', () => {
expect(stripChannelPrefix('B2_krk-finance.ru/cabinet/auth [24]')).toBe('krk-finance.ru/cabinet/auth [24]');
});
it('убирает B3_ префикс', () => {
expect(stripChannelPrefix('B3_kras.vashinvestor.ru [23]')).toBe('kras.vashinvestor.ru [23]');
});
it('case-insensitive: b1_/b2_/b3_ тоже убирает', () => {
expect(stripChannelPrefix('b1_test')).toBe('test');
expect(stripChannelPrefix('b3_demo')).toBe('demo');
});
it('не трогает имя без префикса', () => {
expect(stripChannelPrefix('quidem fugiat unde')).toBe('quidem fugiat unde');
expect(stripChannelPrefix('Натяжные потолки')).toBe('Натяжные потолки');
});
it('не трогает B4_/B0_/Bx_ — только B1/B2/B3', () => {
expect(stripChannelPrefix('B4_other')).toBe('B4_other');
expect(stripChannelPrefix('B0_zero')).toBe('B0_zero');
expect(stripChannelPrefix('BX_unknown')).toBe('BX_unknown');
});
it('не трогает префикс внутри строки — только в начале', () => {
expect(stripChannelPrefix('foo B1_bar')).toBe('foo B1_bar');
});
it('терпит null/undefined/пустую строку', () => {
expect(stripChannelPrefix(null)).toBe('');
expect(stripChannelPrefix(undefined)).toBe('');
expect(stripChannelPrefix('')).toBe('');
});
});