From 1dda76caaeb494963507935ab08d68cd04d073aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Tue, 29 Sep 2026 12:55:40 +0500 Subject: [PATCH] =?UTF-8?q?test:=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B0=20=D0=B2=D1=8B=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=20=D0=B2=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=B1=D0=B5=D0=B7=20SharePoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Тест parseAuthorOwsUser падал: он импортировал myRequests.service, а тот тянет PnPjs (ESM), который Jest проекта не разбирает. Функция вынесена в parseAuthorOwsUser.ts без SharePoint-импортов, сервис берёт её оттуда. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../features/myRequests/myRequests.service.ts | 17 +---------------- .../myRequests/parseAuthorOwsUser.test.ts | 2 +- .../features/myRequests/parseAuthorOwsUser.ts | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.ts diff --git a/src/webparts/requestPortal/features/myRequests/myRequests.service.ts b/src/webparts/requestPortal/features/myRequests/myRequests.service.ts index 5f2e48e..edbb0bf 100644 --- a/src/webparts/requestPortal/features/myRequests/myRequests.service.ts +++ b/src/webparts/requestPortal/features/myRequests/myRequests.service.ts @@ -25,6 +25,7 @@ import { import { effectiveUserEmail } from '../../shared/impersonation'; import { DATA_SITE_URL } from '../../shared/config'; import { IAssignee, IMyRequest } from './models/IMyRequest'; +import { parseAuthorOwsUser } from './parseAuthorOwsUser'; import { IMyRequestsTypeDebug } from './models/IMyRequestsDebug'; import { traceLinkedTypes, traceResultRows, traceSearchHits } from './searchTrace'; import { perfScope, traced } from '../../shared/perfTrace'; @@ -106,22 +107,6 @@ const MP_CODE = 'RequestUniqueCodeOWSTEXT'; // создатель (см. toMyRequestFromSearch); основной — MP_AUTHOR/parseAuthorOwsUser. const OWN_SELECT_PROPERTIES = ['ListItemID', 'Path', 'Title', 'Created', 'Author', MP_AUTHOR, MP_REQUEST_STATUS, MP_CODE]; -/** - * Managed property Person-поля хранит несколько значений одной строкой через - * " | ": «<почта> | <ФИО> | <служебный id> » (первые два — - * проверено вручную, tools/sp props, 2026-08-20; хвост вылез в UI 2026-09-29, - * когда ФИО стали брать отсюда). Поэтому ФИО — ровно ВТОРОЙ кусок, а не «всё - * после первого разделителя». - * - * Разделитель — именно " | " С ПРОБЕЛАМИ: claims-логин - * `i:0#.f|membership|user@domain` содержит "|" без пробелов вокруг, и деление по - * голому "|" порезало бы его на части. - */ -export function parseAuthorOwsUser(value: unknown): { email: string; name: string } { - const parts = (typeof value === 'string' ? value : '').split(' | ').map((p) => p.trim()); - return { email: parts[0] ?? '', name: parts[1] ?? '' }; -} - // effectiveUserEmail, а не pageContext напрямую: при отладочной подмене личности // (см. shared/impersonation.ts) «мои заявки» и очереди согласования должны // отбираться по подменённому сотруднику — иначе подмена показывала бы чужой diff --git a/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts b/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts index 743d305..079aac9 100644 --- a/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts +++ b/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts @@ -1,4 +1,4 @@ -import { parseAuthorOwsUser } from './myRequests.service'; +import { parseAuthorOwsUser } from './parseAuthorOwsUser'; describe('parseAuthorOwsUser', () => { it('ФИО — ровно второй кусок, служебный хвост отбрасывается', () => { diff --git a/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.ts b/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.ts new file mode 100644 index 0000000..8f3b008 --- /dev/null +++ b/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.ts @@ -0,0 +1,18 @@ +/** + * Managed property Person-поля хранит несколько значений одной строкой через + * " | ": «<почта> | <ФИО> | <служебный id> » (первые два — + * проверено вручную, tools/sp props, 2026-08-20; хвост вылез в UI 2026-09-29, + * когда ФИО стали брать отсюда). Поэтому ФИО — ровно ВТОРОЙ кусок, а не «всё + * после первого разделителя». + * + * Разделитель — именно " | " С ПРОБЕЛАМИ: claims-логин + * `i:0#.f|membership|user@domain` содержит "|" без пробелов вокруг, и деление по + * голому "|" порезало бы его на части. + * + * Отдельным модулем, без SharePoint-импортов: myRequests.service тянет PnPjs, + * который Jest проекта не разбирает (ESM), — так функцию можно тестировать. + */ +export function parseAuthorOwsUser(value: unknown): { email: string; name: string } { + const parts = (typeof value === 'string' ? value : '').split(' | ').map((p) => p.trim()); + return { email: parts[0] ?? '', name: parts[1] ?? '' }; +}