/** * post-content 测试:钉住代码块 copy 按钮的生成与复制行为。 * 黑盒驱动:只通过 window.__initPostContent 入口。 */ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import './index'; describe('initPostContent', () => { beforeEach(() => { document.body.innerHTML = ''; vi.restoreAllMocks(); vi.useFakeTimers(); }); afterEach(() => { vi.useRealTimers(); document.body.innerHTML = ''; }); it('为 pre>code 注入 .copy-code 按钮', () => { const root = document.createElement('div'); root.className = 'post-content'; root.innerHTML = '
console.log(1)
'; document.body.appendChild(root); window.__initPostContent('.post-content'); const btn = root.querySelector('pre .copy-code'); expect(btn).not.toBeNull(); expect(btn?.textContent).toBe('copy'); }); it('已有 .copy-code 的 pre 不重复注入', () => { const root = document.createElement('div'); root.className = 'post-content'; root.innerHTML = '
x
'; document.body.appendChild(root); window.__initPostContent('.post-content'); const btns = root.querySelectorAll('pre .copy-code'); expect(btns.length).toBe(1); }); it('点击按钮调用 clipboard.writeText 并回显 copied!', () => { const writeText = vi.fn().mockResolvedValue(undefined); Object.defineProperty(navigator, 'clipboard', { value: { writeText }, configurable: true, }); const root = document.createElement('div'); root.className = 'post-content'; root.innerHTML = '
hello
'; document.body.appendChild(root); window.__initPostContent('.post-content'); const btn = root.querySelector('.copy-code') as HTMLButtonElement; btn.click(); expect(writeText).toHaveBeenCalledWith('hello'); expect(btn.textContent).toBe('copied!'); // 2 秒后还原回 'copy' vi.advanceTimersByTime(2000); expect(btn.textContent).toBe('copy'); }); it('selector 未命中时不报错', () => { expect(() => window.__initPostContent('.not-exist')).not.toThrow(); }); });