From 43ba6ce16cd4b104f06f33e56894f668dd88c8c7 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 12 May 2026 18:01:00 +0300 Subject: [PATCH] =?UTF-8?q?feat(web-test):=20M5-pre=20#4b=20=E2=80=94=2009?= =?UTF-8?q?-filter/unfilter-specific=20(multi-badge)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше шаг был deferred с комментарием «требует список с видимой filter-панелью». На самом деле существующая абстракция работает: два advanced filterList на разных колонках Контрагентов создают два badge'а в state.filters[], а unfilterList({field}) снимает конкретный — оставляя остальные. Новый шаг 09-filter/unfilter-specific (~14s): - filterList('ООО', {field:'Наименование'}) + filterList('123', {field:'ИНН'}) → state.filters = [{field:'Наименование',value:'ООО'}, {field:'ИНН',value:'123'}] - unfilterList({field:'ИНН'}) → остался только Наименование badge - unfilterList() → пусто Старый комментарий «defer to filter-panel synthetic» удалён — оказался устаревшим (видимо unfilterList({field}) уже умел работать с advanced-filter badge'ами на синтетических списках). timeout 09-filter поднят с 60000 → 120000ms (8 шагов теперь, +14s для unfilter-specific). Регресс: 16/18 зелёных. Два multi-context-теста (14/15) упали на лицензионном пределе 1С — known environmental issue, не связано с этим коммитом. Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/web-test/09-filter.test.mjs | 34 ++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/tests/web-test/09-filter.test.mjs b/tests/web-test/09-filter.test.mjs index dea42686..6df7b5b6 100644 --- a/tests/web-test/09-filter.test.mjs +++ b/tests/web-test/09-filter.test.mjs @@ -1,8 +1,8 @@ export const name = 'Фильтры списка: simple-search, advanced-column'; export const tags = ['filter', 'smoke']; -export const timeout = 60000; +export const timeout = 120000; -export default async function({ navigateSection, openCommand, filterList, unfilterList, readTable, closeForm, assert, step, log }) { +export default async function({ navigateSection, openCommand, filterList, unfilterList, readTable, getFormState, closeForm, assert, step, log }) { await step('simple-search: filterList по тексту по всем колонкам', async () => { await navigateSection('Склад'); @@ -119,11 +119,31 @@ export default async function({ navigateSection, openCommand, filterList, unfilt await closeForm(); }); - // unfilter-specific (P1 в матрице) требует список с видимой filter-панелью - // (.trainItem badge). На синтетических списках Контрагенты/Номенклатура - // advanced filterList применяет фильтр без создания badge, поэтому - // unfilterList({field}) не может его найти. Откладываем до синтетики - // с настроенной filter-панелью (P2/P3). + await step('unfilter-specific: два фильтра → unfilterList({field}) снимает один badge', async () => { + // На синтетике advanced-filter ставит badge на filter-панель, + // и unfilterList({field}) снимает конкретный, оставив остальные. + // Покрывает 09-filter/unfilter-specific (раньше был deferred). + await navigateSection('Склад'); + await openCommand('Контрагенты'); + + await filterList('ООО', { field: 'Наименование' }); + const both = await filterList('123', { field: 'ИНН' }); + log(`with 2 filters: ${JSON.stringify(both.filters)}`); + assert.equal(both.filters?.length, 2, 'оба badge присутствуют'); + const names = both.filters.map(f => f.field).sort(); + assert.deepEqual(names, ['ИНН', 'Наименование'], 'badges: Наименование + ИНН'); + + const s1 = await unfilterList({ field: 'ИНН' }); + log(`after unfilter ИНН: ${JSON.stringify(s1.filters)}`); + assert.equal(s1.filters?.length, 1, 'остался один badge'); + assert.equal(s1.filters?.[0]?.field, 'Наименование', 'остался Наименование'); + + const s2 = await unfilterList(); + log(`after unfilter-all: ${JSON.stringify(s2.filters || [])}`); + assert.ok(!s2.filters || s2.filters.length === 0, 'все badge сняты'); + + await closeForm(); + }); await step('unfilter-all: unfilterList() убирает все фильтры', async () => { await navigateSection('Склад');