feat(web-test): M5-pre #4b — 09-filter/unfilter-specific (multi-badge)

Раньше шаг был 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) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-12 18:01:00 +03:00
parent 51e37f9874
commit 43ba6ce16c
+27 -7
View File
@@ -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('Склад');