fix(web): тесты смены метки и сброса, hideDone без флажка (#112)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-25 20:27:58 +04:00
parent 3ba8f06637
commit e79b073180
3 changed files with 36 additions and 1 deletions

View File

@ -79,4 +79,38 @@ describe("AgileToolbar", () => {
render(<Harness page="sprint" />);
expect(assignee().value).toBe("");
});
it("смена метки и страницы без размонтирования: q сброшен, чужие значения не протекают, прежние данные целы", () => {
const r = render(<Harness />);
fireEvent.change(assignee(), { target: { value: "ivanov" } });
fireEvent.click(screen.getByLabelText("Скрыть выполненные"));
fireEvent.change(search(), { target: { value: "abc" } });
const before = localStorage.getItem(AGILE_KEY);
r.rerender(<Harness label="STOCKS" />);
expect(search().value).toBe("");
expect(assignee().value).toBe("");
expect((screen.getByLabelText("Скрыть выполненные") as HTMLInputElement).checked).toBe(false);
expect(localStorage.getItem(AGILE_KEY)).toBe(before);
r.rerender(<Harness label="STOCKS" page="kanban" />);
expect(assignee().value).toBe("");
expect(localStorage.getItem(AGILE_KEY)).toBe(before);
r.rerender(<Harness />);
expect(assignee().value).toBe("ivanov");
expect(search().value).toBe("");
});
it("сброс сохраняет collapsed, hiddenColumns и epicsPanel", () => {
localStorage.setItem(AGILE_KEY, JSON.stringify({ AWPCA: { backlog: {
assignee: "ivanov", epic: "E-1", hideDone: true, collapsed: ["E-1"], hiddenColumns: ["Done"], epicsPanel: false } } }));
render(<Harness />);
fireEvent.click(screen.getByText("Сбросить фильтры"));
expect(stored().AWPCA.backlog).toEqual({
assignee: "", epic: "", hideDone: false, collapsed: ["E-1"], hiddenColumns: ["Done"], epicsPanel: false });
});
it("showHideDone=false: сохранённый hideDone не показывает «Сбросить фильтры»", () => {
localStorage.setItem(AGILE_KEY, JSON.stringify({ AWPCA: { backlog: { hideDone: true } } }));
render(<Harness showHideDone={false} />);
expect(screen.queryByText("Сбросить фильтры")).toBeNull();
});
});

View File

@ -19,7 +19,7 @@ export function AgileToolbar({ filter, setQ, set, onReset, assignees, showHideDo
<Checkbox label="Скрыть выполненные" checked={filter.hideDone} onChange={(e) => set({ hideDone: e.target.checked })} />
)}
{children}
{hasFilters(filter) && <Button variant="ghost" onClick={onReset}>Сбросить фильтры</Button>}
{hasFilters({ ...filter, hideDone: filter.hideDone && showHideDone }) && <Button variant="ghost" onClick={onReset}>Сбросить фильтры</Button>}
</Panel>
);
}

View File

@ -13,6 +13,7 @@ export function useAgileView(label: string, page: AgilePage) {
setState(cur);
}
const ref = useRef(cur);
// ref обновляется при рендере: set/reset в одном событии должны видеть актуальный вид, а не замыкание прошлого рендера
ref.current = cur;
const commit = useCallback((next: typeof state) => {