diff --git a/internal/server/files/94896017563975680 b/internal/server/files/94896017563975680 new file mode 100644 index 0000000..c717552 --- /dev/null +++ b/internal/server/files/94896017563975680 @@ -0,0 +1 @@ +вложение: проверка загрузки \ No newline at end of file diff --git a/internal/server/files/94896017584947200 b/internal/server/files/94896017584947200 new file mode 100644 index 0000000..c717552 --- /dev/null +++ b/internal/server/files/94896017584947200 @@ -0,0 +1 @@ +вложение: проверка загрузки \ No newline at end of file diff --git a/web/tests/motion.test.ts b/web/tests/motion.test.ts new file mode 100644 index 0000000..88fcf35 --- /dev/null +++ b/web/tests/motion.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { motionDelay, prefersReducedMotion } from '@/lib/motion'; + +/** + * Доступность: при `prefers-reduced-motion: reduce` анимации мгновенные, + * поэтому и задержка удаления узлов из DOM должна быть нулевой. + */ +describe('prefers-reduced-motion', () => { + it('без поддержки matchMedia считает, что анимации разрешены', () => { + vi.stubGlobal('matchMedia', undefined); + + expect(prefersReducedMotion()).toBe(false); + expect(motionDelay(140)).toBe(140); + }); + + it('при reduce анимации не ждут', () => { + vi.stubGlobal( + 'matchMedia', + vi.fn(() => ({ matches: true })), + ); + + expect(prefersReducedMotion()).toBe(true); + expect(motionDelay(140)).toBe(0); + }); + + it('при обычных настройках возвращает исходную задержку', () => { + vi.stubGlobal( + 'matchMedia', + vi.fn(() => ({ matches: false })), + ); + + expect(prefersReducedMotion()).toBe(false); + expect(motionDelay(140)).toBe(140); + }); +}); diff --git a/web/tests/servers.test.tsx b/web/tests/servers.test.tsx index 6c403eb..9cf8df4 100644 --- a/web/tests/servers.test.tsx +++ b/web/tests/servers.test.tsx @@ -127,10 +127,17 @@ describe('настройки серверов', () => { expect(router.state.location.pathname).toBe('/settings/servers/g-1'); }); - // После выбора первого сервера страница перерисовывается — берём список заново. - const picker = await screen.findByTestId('guild-picker'); + // Первый сервер подсвечен. Список запрашиваем заново: после выбора + // страница перерисовывается, и прежний узел может быть уже отсоединён. + await waitFor(() => { + const picker = screen.getByTestId('guild-picker'); + expect( + within(picker).getByRole('link', { name: 'Открыть настройки сервера Альфа' }), + ).toHaveAttribute('aria-current', 'page'); + }); + + const picker = screen.getByTestId('guild-picker'); const first = within(picker).getByRole('link', { name: 'Открыть настройки сервера Альфа' }); - expect(first).toHaveAttribute('aria-current', 'page'); // Иконка сервера отдаётся файловым сервисом по icon_file_id. expect(first.querySelector('img')?.getAttribute('src')).toBe('/files/icon-1'); expect(