Ctrl K
ComunidadGuías…

frontend/test/grow-collapse.test.ts

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { afterEach, expect, it, vi } from 'vitest';
import { growCollapse, setCollapseOpen, setCollapseRegionOpen } from '../src/ui-kit';

afterEach(() => { vi.useRealTimers(); document.body.replaceChildren(); });

it('从起始高度长到内容高度,跑完交回 auto 并装回展开态', () => {
  vi.useFakeTimers();
  const body = document.createElement('div'); body.className = 'ui-fcollapse ui-fcollapse-settled'; document.body.append(body);
  Object.defineProperty(body, 'scrollHeight', { configurable: true, value: 480 });
  growCollapse(body, 120);
  expect(body.classList.contains('ui-fcollapse-settled')).toBe(false);
  expect(body.style.height).toBe('480px');
  body.dispatchEvent(Object.assign(new Event('transitionend'), { propertyName: 'opacity' }));
  expect(body.style.height).toBe('480px');
  vi.advanceTimersByTime(260);
  expect(body.style.height).toBe('auto');
  expect(body.classList.contains('ui-fcollapse-settled')).toBe(true);
});

it('过渡途中又被收起时不收尾', () => {
  vi.useFakeTimers();
  const body = document.createElement('div'); body.className = 'ui-fcollapse'; document.body.append(body);
  let open = true;
  growCollapse(body, 0, () => open);
  open = false; body.style.height = '0px';
  vi.advanceTimersByTime(260);
  expect(body.style.height).toBe('0px');
  expect(body.classList.contains('ui-fcollapse-settled')).toBe(false);
});

const collapse = () => {
  const details = document.createElement('details');
  const body = document.createElement('div');
  details.append(document.createElement('summary'), body); document.body.append(details);
  return { details, body };
};

it('收起时高度先收到 0,过渡跑完才合上 details', () => {
  vi.useFakeTimers();
  const { details, body } = collapse();
  setCollapseOpen(details, body, true);
  expect(details.open).toBe(true);
  expect(body.classList.contains('ui-fcollapse')).toBe(true);
  vi.advanceTimersByTime(260);
  setCollapseOpen(details, body, false);
  expect(body.style.height).toBe('0px');
  expect(body.inert).toBe(true);
  expect(details.open).toBe(true);
  vi.advanceTimersByTime(260);
  expect(details.open).toBe(false);
  expect(body.style.height).toBe('');
});

it('收到一半又点开时,收起那次的收尾不再合上 details', () => {
  vi.useFakeTimers();
  const { details, body } = collapse();
  setCollapseOpen(details, body, true);
  vi.advanceTimersByTime(260);
  setCollapseOpen(details, body, false);
  setCollapseOpen(details, body, true);
  vi.advanceTimersByTime(260);
  expect(details.open).toBe(true);
  expect(body.inert).toBe(false);
  expect(body.style.height).toBe('auto');
});

it('外置触发器保留正文,收起即退出焦点顺序,反向展开取消隐藏', () => {
  vi.useFakeTimers();
  const body = document.createElement('div'); document.body.append(body);
  Object.defineProperty(body, 'scrollHeight', { configurable: true, value: 180 });
  setCollapseRegionOpen(body, false);
  expect(body.hidden).toBe(false);
  expect(body.inert).toBe(true);
  setCollapseRegionOpen(body, true);
  vi.advanceTimersByTime(260);
  expect(body.hidden).toBe(false);
  expect(body.inert).toBe(false);
  expect(body.style.height).toBe('auto');
  setCollapseRegionOpen(body, false);
  vi.advanceTimersByTime(260);
  expect(body.hidden).toBe(true);
});