/
Starolat
/
DeepDive
Обзор
Документация
Войти
/
Starolat
/
DeepDive
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/code-picker.node-test.js
118 строк
3 KB
Starolat Sergei
feat: перенос поиска по значению справочника внутрь code-picker
15 июл 2026, 07:39
15 июл 2026, 07:39
2199f40
Код
Авторство
О чём код?
// @ts-check /** * @fileoverview Node tests for CodePicker search transfer behavior (v1.2.1) * * Verifies that when a code type is found via value search, the query is * transferred into the value search field on drill-down. */ import { JSDOM } from "jsdom"; const dom = new JSDOM("<!DOCTYPE html><html></html>", { url: "http://localhost", }); global.window = dom.window; global.document = dom.window.document; global.customElements = dom.window.customElements; global.HTMLElement = dom.window.HTMLElement; global.requestAnimationFrame = (cb) => setTimeout(cb, 0); global.CustomEvent = dom.window.CustomEvent; await import("../js/components/CodePicker.js"); const picker = document.createElement("code-picker"); picker.availableTypes = [ { typeId: 1, name: "Локация", values: [ { valueId: 10, typeId: 1, shortName: "Зона А", description: "Север" }, { valueId: 11, typeId: 1, shortName: "Зона Б", description: "Юг" }, ], }, { typeId: 2, name: "Отдел", values: [{ valueId: 20, typeId: 2, shortName: "ПТО", description: "Отдел" }], }, ]; let passed = 0; let failed = 0; /** * @param {string} name * @param {unknown} actual * @param {unknown} expected */ function check(name, actual, expected) { const ok = actual === expected; if (ok) { passed++; console.log(` ✅ ${name}`); } else { failed++; console.log( ` ❌ ${name} - actual: ${JSON.stringify(actual)} expected: ${JSON.stringify(expected)}`, ); } } console.log("🧪 CodePicker v1.2.1 search transfer tests\n"); // Test 1: drill-down from value search copies query into value search picker.typeSearchQuery = "Зона А"; picker.valueSearchQuery = ""; picker.selectedTypeId = null; picker.selectType(1); check( "value search query is copied when type was matched by value", picker.valueSearchQuery, "Зона А", ); check( "type search query is preserved for back navigation", picker.typeSearchQuery, "Зона А", ); check("selectedTypeId is set", picker.selectedTypeId, 1); // Test 2: drill-down from name search keeps value search empty picker.selectedTypeId = null; picker.valueSearchQuery = ""; picker.typeSearchQuery = "Лока"; picker.selectType(1); check( "value search query is cleared when type was matched by name", picker.valueSearchQuery, "", ); check( "type search query is preserved when matched by name", picker.typeSearchQuery, "Лока", ); // Test 3: drill-down without search keeps both fields empty picker.selectedTypeId = null; picker.valueSearchQuery = ""; picker.typeSearchQuery = ""; picker.selectType(2); check("value search query stays empty without search", picker.valueSearchQuery, ""); check("type search query stays empty without search", picker.typeSearchQuery, ""); // Test 4: back navigation preserves type search and clears value search picker.typeSearchQuery = "Зона А"; picker.valueSearchQuery = "Зона А"; picker.selectedTypeId = 1; picker.backToTypesList(); check("back navigation clears value search", picker.valueSearchQuery, ""); check("back navigation preserves type search", picker.typeSearchQuery, "Зона А"); check("back navigation resets selectedTypeId", picker.selectedTypeId, null); console.log("\n" + "=".repeat(50)); console.log(`Result: ${passed} passed, ${failed} failed`); console.log("=".repeat(50)); process.exit(failed > 0 ? 1 : 0);