test: разбор автора вынесен в модуль без SharePoint
Тест parseAuthorOwsUser падал: он импортировал myRequests.service, а тот тянет PnPjs (ESM), который Jest проекта не разбирает. Функция вынесена в parseAuthorOwsUser.ts без SharePoint-импортов, сервис берёт её оттуда. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -25,6 +25,7 @@ import {
|
|||||||
import { effectiveUserEmail } from '../../shared/impersonation';
|
import { effectiveUserEmail } from '../../shared/impersonation';
|
||||||
import { DATA_SITE_URL } from '../../shared/config';
|
import { DATA_SITE_URL } from '../../shared/config';
|
||||||
import { IAssignee, IMyRequest } from './models/IMyRequest';
|
import { IAssignee, IMyRequest } from './models/IMyRequest';
|
||||||
|
import { parseAuthorOwsUser } from './parseAuthorOwsUser';
|
||||||
import { IMyRequestsTypeDebug } from './models/IMyRequestsDebug';
|
import { IMyRequestsTypeDebug } from './models/IMyRequestsDebug';
|
||||||
import { traceLinkedTypes, traceResultRows, traceSearchHits } from './searchTrace';
|
import { traceLinkedTypes, traceResultRows, traceSearchHits } from './searchTrace';
|
||||||
import { perfScope, traced } from '../../shared/perfTrace';
|
import { perfScope, traced } from '../../shared/perfTrace';
|
||||||
@@ -106,22 +107,6 @@ const MP_CODE = 'RequestUniqueCodeOWSTEXT';
|
|||||||
// создатель (см. toMyRequestFromSearch); основной — MP_AUTHOR/parseAuthorOwsUser.
|
// создатель (см. toMyRequestFromSearch); основной — MP_AUTHOR/parseAuthorOwsUser.
|
||||||
const OWN_SELECT_PROPERTIES = ['ListItemID', 'Path', 'Title', 'Created', 'Author', MP_AUTHOR, MP_REQUEST_STATUS, MP_CODE];
|
const OWN_SELECT_PROPERTIES = ['ListItemID', 'Path', 'Title', 'Created', 'Author', MP_AUTHOR, MP_REQUEST_STATUS, MP_CODE];
|
||||||
|
|
||||||
/**
|
|
||||||
* Managed property Person-поля хранит несколько значений одной строкой через
|
|
||||||
* " | ": «<почта> | <ФИО> | <служебный id> <claims-логин>» (первые два —
|
|
||||||
* проверено вручную, 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 напрямую: при отладочной подмене личности
|
// effectiveUserEmail, а не pageContext напрямую: при отладочной подмене личности
|
||||||
// (см. shared/impersonation.ts) «мои заявки» и очереди согласования должны
|
// (см. shared/impersonation.ts) «мои заявки» и очереди согласования должны
|
||||||
// отбираться по подменённому сотруднику — иначе подмена показывала бы чужой
|
// отбираться по подменённому сотруднику — иначе подмена показывала бы чужой
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { parseAuthorOwsUser } from './myRequests.service';
|
import { parseAuthorOwsUser } from './parseAuthorOwsUser';
|
||||||
|
|
||||||
describe('parseAuthorOwsUser', () => {
|
describe('parseAuthorOwsUser', () => {
|
||||||
it('ФИО — ровно второй кусок, служебный хвост отбрасывается', () => {
|
it('ФИО — ровно второй кусок, служебный хвост отбрасывается', () => {
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Managed property Person-поля хранит несколько значений одной строкой через
|
||||||
|
* " | ": «<почта> | <ФИО> | <служебный id> <claims-логин>» (первые два —
|
||||||
|
* проверено вручную, 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] ?? '' };
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user