import assert from 'node:assert/strict'; import test from 'node:test'; import { emitNumberVectors, emitScreenVectors, equals, matchesSearch, screenFacets, screenFound, screenRows, } from './svod2_search_oracle.mjs'; const mk = (id, type, dir, org) => ({ data: { line_id: id, header: { smeta_type: type, smeta_direction: dir, org_name: org } } }); const rows2 = [mk(1, 'КВ', 'Развитие', 'А'), mk(2, 'АХР', 'Поддержка', 'Б')]; const rows3 = [mk(1, 'КВ', 'Р', 'Филиал Ёлки'), mk(2, 'КВ', 'Р', 'Филиал Ёлки'), mk(3, 'КВ', 'Р', null)]; test('перекрытое поле contract_summary не ищется', () => { const row = { data: { header: { name: 'x' }, contract_summary: { counterparty: 'ООО Ромашка' }, contract_detail: { counterparty: null } } }; assert.equal(matchesSearch(row, 'ромаш'), false); }); test('число ищется в записи JS', () => { const row = { data: { header: {}, contract_summary: {}, contract_detail: JSON.parse('{"ceiling_amount": 1234.50}') } }; assert.equal(matchesSearch(row, '1234.5'), true); assert.equal(matchesSearch(row, '1234.50'), false); }); test('screenRows: trim + lower, NBSP по краям', () => { const rows = [{ data: { line_id: 1, header: { name: 'Аренда помещения' } } }]; assert.deepEqual(screenRows(rows, { search: ' АРЕНДА ' }).map((r) => r.data.line_id), [1]); assert.deepEqual(screenRows(rows, { search: ' аренда ' }).map((r) => r.data.line_id), [1]); }); test('equals: регистр и пробелы по краям, null не проходит', () => { const r = (v) => ({ getValue: () => v }); assert.equal(equals(r('КВ'), 'smeta_type', 'кв '), true); assert.equal(equals(r(null), 'smeta_type', 'кв'), false); }); test('screenFacets: свой фильтр не применяется, чужие — да', () => { const f = screenFacets(rows2, { filters: { smeta_type: 'КВ' } }); assert.deepEqual(f.smeta_type, [['АХР', 1], ['КВ', 1]]); assert.deepEqual(f.smeta_direction, [['Развитие', 1]]); }); test('screenFacets: одинаковые названия — один вариант, null не выдаётся', () => { assert.deepEqual(screenFacets(rows3).org_name, [['Филиал Ёлки', 2]]); }); test('screenFound считает только поиск', () => { assert.deepEqual(screenFound(rows2, ''), { found: 2, total: 2 }); }); test('векторы чисел', () => { const v = Object.fromEntries(emitNumberVectors().map(({ input, js }) => [input, js])); assert.equal(v['1e21'], '1e+21'); assert.equal(v['-0'], '0'); assert.equal(v['1e-7'], '1e-7'); assert.equal(v['0.000001'], '0.000001'); assert.equal(v['100.00'], '100'); assert.equal(v['9007199254740993'], '9007199254740992'); }); test('векторы экрана: не меньше 12 случаев', () => { const s = emitScreenVectors(); assert.ok(s.cases.length >= 12); assert.ok(s.rows.length >= 10 && s.rows.length <= 15); });