Обходной лист #12

Merged
gorbenko.pavel merged 11 commits from clearance-form into main 2026-08-17 05:43:52 +00:00
Showing only changes of commit 1db57ec60c - Show all commits
@@ -1,56 +0,0 @@
import { AadHttpClient } from '@microsoft/sp-http';
import { PortalDictionaryClient } from './portalDictionary';
// Мок-клиент вместо настоящего AadHttpClient — employees() дёргает только .get().
function clientReturning(body: unknown): AadHttpClient {
return {
get: () =>
Promise.resolve({
ok: true,
text: () => Promise.resolve(JSON.stringify(body))
})
} as unknown as AadHttpClient;
}
describe('PortalDictionaryClient.employees', () => {
// Регрессия: api.tnsu.kz отдаёт ОТДЕЛЬНУЮ строку на каждую компанию, где
// числится сотрудник (совместители/бухгалтерия на несколько юрлиц — не
// редкость). Раньше company у дедуплицированной записи оставалась только
// первой попавшейся, а остальные компании терялись — сотрудник ошибочно
// выглядел отсутствующим в них (см. forms/Clearance-подсказку в RouteStepFormModal).
it('строки одного email по разным компаниям схлопываются в одного сотрудника, но все компании сохраняются', async () => {
const client = clientReturning([
{ fio: 'Тәжіғалиев Биғали', email: 'b@ct-global.kz', position: 'Главный бухгалтер', company: 'ТОО ГеоТрек' },
{ fio: 'Тәжіғалиев Биғали', email: 'b@ct-global.kz', position: 'Главный бухгалтер', company: 'ТОО AFL Engineering' },
{ fio: 'Тәжіғалиев Биғали', email: 'b@ct-global.kz', position: 'Главный бухгалтер', company: 'ТОО СТ Global' }
]);
const employees = await new PortalDictionaryClient(client, 'https://api.tnsu.kz').employees();
expect(employees).toHaveLength(1);
expect(employees[0].company).toBe('ТОО ГеоТрек'); // первая — для пикера/отображения
expect(employees[0].companies).toEqual(['ТОО ГеоТрек', 'ТОО AFL Engineering', 'ТОО СТ Global']);
});
it('разные email — разные сотрудники, дедупликация их не задевает', async () => {
const client = clientReturning([
{ fio: 'A', email: 'a@tnsu.kz', position: 'Инженер', company: 'Компания А' },
{ fio: 'B', email: 'b@tnsu.kz', position: 'Инженер', company: 'Компания Б' }
]);
const employees = await new PortalDictionaryClient(client, 'https://api.tnsu.kz').employees();
expect(employees.map(e => e.email)).toEqual(['a@tnsu.kz', 'b@tnsu.kz']);
expect(employees.map(e => e.companies)).toEqual([['Компания А'], ['Компания Б']]);
});
it('сотрудник без email в строке — пропускается (по нему нельзя резолвить исполнителя)', async () => {
const client = clientReturning([
{ fio: 'Без Email', email: null, position: 'Инженер', company: 'Компания А' }
]);
const employees = await new PortalDictionaryClient(client, 'https://api.tnsu.kz').employees();
expect(employees).toEqual([]);
});
});