Ctrl K
ComunidadGuías…

frontend/test/skeleton-reveal.test.ts

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

Archivo original ↗Preguntar a KiBot
/* 骨架的延迟显形:低于门槛的请求不该闪一下占位。
 *
 * 这里守的是「同一批占位都要拿到标记」。`fitSkeleton` 会被反复调用——网格补行、
 * 容器改宽都会再进来一次,第二次里总有已经武装过的那几枚。 */
import { describe, expect, it, vi } from 'vitest';

import { fitSkeleton } from '../src/ui-kit';

const placeholder = (root: HTMLElement): HTMLElement => {
  const node = document.createElement('div');
  node.dataset.skeleton = '';
  root.append(node);
  return node;
};

describe('骨架延迟显形', () => {
  it('补进来的占位与先到的一样拿到等待标记', () => {
    const root = document.createElement('div');
    document.body.append(root);
    const first = placeholder(root);
    fitSkeleton(root);
    const second = placeholder(root);
    fitSkeleton(root);
    for (const node of [first, second]) {
      expect(node.dataset.skeletonReveal).toBe('pending');
      expect(node.classList.contains('skeleton-awaiting')).toBe(true);
    }
    root.remove();
  });

  it('等待超过门槛后整批一起显形', () => {
    vi.useFakeTimers();
    try {
      const root = document.createElement('div');
      document.body.append(root);
      const first = placeholder(root);
      fitSkeleton(root);
      const second = placeholder(root);
      fitSkeleton(root);
      vi.advanceTimersByTime(200);
      for (const node of [first, second]) {
        expect(node.dataset.skeletonReveal).toBe('shown');
        expect(node.classList.contains('skeleton-awaiting')).toBe(false);
      }
      root.remove();
    } finally {
      vi.useRealTimers();
    }
  });
});