Files
bitrix24-my-time/test/test_mytime.mjs
T

52 lines
2.7 KiB
JavaScript

// Прогон mytime.js на поддельных DOM, BX и REST: node test/test_mytime.mjs
import fs from 'node:fs';
const els = {};
const el = id => (els[id] ??= { id, value: id === 'mytime-m' ? '2026-10' : '', textContent: '', innerHTML: '', style: {}, remove() {} });
globalThis.window = globalThis;
globalThis.alert = m => { throw new Error('alert: ' + m); };
globalThis.document = {
getElementById: id => (id === 'mytime' ? null : el(id)),
createElement: () => ({ style: {}, set innerHTML(v) {}, remove() {} }),
body: { append() {} },
};
globalThis.BX = { bitrix_sessid: () => 'S' };
globalThis.myTimeConfig = { norm: 20 };
// 120 записей: 60 по задаче 1 (по 10 мин), 59 по задаче 2 (по 5 мин), одна сентябрьская — должна отсеяться
const items = [];
for (let i = 0; i < 60; i++) items.push({ TASK_ID: '1', SECONDS: '600', CREATED_DATE: '2026-10-05T10:00:00+03:00' });
for (let i = 0; i < 59; i++) items.push({ TASK_ID: '2', SECONDS: '300', CREATED_DATE: '2026-10-06T10:00:00+03:00' });
items.push({ TASK_ID: '3', SECONDS: '9999', CREATED_DATE: '2026-09-30T23:00:00+03:00' });
const calls = [];
globalThis.fetch = async (url, opt) => {
const method = url.match(/rest\/(.+)\.json/)[1];
const p = JSON.parse(opt.body);
calls.push(method);
let result;
if (method === 'user.current') result = { ID: '7' };
else if (method === 'task.elapseditem.getlist') {
if (p.FILTER.USER_ID !== '7') throw new Error('USER_ID not passed');
const n = p.PARAMS.NAV_PARAMS;
result = items.slice((n.iNumPage - 1) * n.nPageSize, n.iNumPage * n.nPageSize);
} else if (method === 'tasks.task.list') result = { tasks: p.filter.ID.map(id => ({ id, title: 'T<' + id + '>' })) };
return { json: async () => ({ result }) };
};
eval(fs.readFileSync(new URL('../extension/mytime.js', import.meta.url), 'utf8'));
await new Promise(r => setTimeout(r, 50));
const html = els['mytime-out'].innerHTML;
const must = ['>10:00<', '>4:55<', '>14:55<', 'осталось <b>5:05</b>', 'T&lt;1&gt;', '/user/7/tasks/task/view/1/'];
for (const s of must) if (!html.includes(s)) throw new Error('missing ' + s + '\n' + html);
if (html.includes('#3')) throw new Error('September record counted');
if (calls.filter(c => c === 'task.elapseditem.getlist').length !== 3) throw new Error('pages: ' + calls);
// норма превышена: 14:55 при норме 10 ч
globalThis.myTimeConfig = { norm: 10 };
eval(fs.readFileSync(new URL('../extension/mytime.js', import.meta.url), 'utf8'));
await new Promise(r => setTimeout(r, 50));
if (!els['mytime-out'].innerHTML.includes('Норма 10 ч выполнена, сверх нормы 4:55')) throw new Error('over norm\n' + els['mytime-out'].innerHTML);
console.log('ok');