feat: 0.10.2 大快照加载修复、快照保存防抖与关于弹框 - 新增snapshot:read专用读取IPC(128MB上限,修复保存32MB内容上限与加载10MB通用上限不对称导致大快照保存成功却永远无法加载的自相矛盾,顺带消除加载污染lastDir记忆)、快照保存中保存/加载按钮saving禁用与App守卫双保险(computing-overlay不拦截交互可并发触发两轮保存对话框)、同目录防呆路径归一化判定(复用normDir,Windows异写路径不再绕过)、关于弹框(header常驻ⓘ按钮,app:get-version取版本号,作者/双邮箱/组织/开源地址/许可证,点击复制走主进程剪贴板)、删除孤儿CSS类.diff-empty-pane与folderTree注释补unreadable,新增14单测与2条E2E(626单测+E2E 29全过覆盖率98.15/93.49/93.65/98.15),文档四件套同步
This commit is contained in:
@@ -768,6 +768,74 @@ test.describe('偏好持久化(跨实例重启)', () => {
|
||||
})
|
||||
})
|
||||
|
||||
test.describe('关于弹框(0.10.2)', () => {
|
||||
test('点击关于按钮展示应用信息,点击邮箱复制,Esc 关闭', async () => {
|
||||
const { app, window } = await launchApp()
|
||||
await window.getByTitle('关于 DiffLens').click()
|
||||
// 版本号来自主进程 app.getVersion()(package.json 为唯一来源,0.x 形态)
|
||||
await expect(window.locator('.about-version')).toHaveText(/^版本 0\.\d+\.\d+$/)
|
||||
await expect(window.locator('.about-modal')).toContainText('DiffLens')
|
||||
await expect(window.locator('.about-modal')).toContainText('thzxx')
|
||||
await expect(window.locator('.about-modal')).toContainText('stinanimz@gmail.com')
|
||||
await expect(window.locator('.about-modal')).toContainText('1440196015@qq.com')
|
||||
await expect(window.locator('.about-modal')).toContainText('MetonaTeam')
|
||||
await expect(window.locator('.about-modal')).toContainText('https://git.metona.cn/MetonaTeam/DiffLens')
|
||||
await expect(window.locator('.about-modal')).toContainText('MIT License')
|
||||
// 点击邮箱复制到剪贴板(主进程剪贴板链路)+ toast 反馈
|
||||
await window.getByText('stinanimz@gmail.com').click()
|
||||
await expect(window.getByText(/邮箱已复制到剪贴板/)).toBeVisible()
|
||||
// Esc 关闭弹框
|
||||
await window.keyboard.press('Escape')
|
||||
await expect(window.locator('.about-modal')).toHaveCount(0)
|
||||
await app.close()
|
||||
})
|
||||
})
|
||||
|
||||
test.describe('大快照加载(0.10.2 专用读取通道)', () => {
|
||||
test('超过 10MB 的快照可正常加载对照(通用文件上限不再拦截自家快照)', async () => {
|
||||
const root = await makeTmpDir('difflens-e2e-bigsnap-')
|
||||
try {
|
||||
const leftDir = join(root, 'left')
|
||||
const rightDir = join(root, 'right')
|
||||
const { mkdir, writeFile: wf } = await import('fs/promises')
|
||||
await mkdir(leftDir, { recursive: true })
|
||||
await mkdir(rightDir, { recursive: true })
|
||||
await wf(join(leftDir, 'same.txt'), 'identical')
|
||||
await wf(join(rightDir, 'same.txt'), 'identical')
|
||||
|
||||
// 手工构造 11MB+ 快照(contents 塞大字符串):旧通道 file:open 的 10MB 上限会拦截
|
||||
const snap = {
|
||||
version: 2,
|
||||
leftDir,
|
||||
rightDir,
|
||||
semantic: true,
|
||||
truncated: false,
|
||||
total: 1,
|
||||
entries: [
|
||||
{ rel: 'same.txt', status: 'same', leftSize: 9, rightSize: 9 }
|
||||
],
|
||||
savedAt: Date.now(),
|
||||
contents: { 'same.txt': { left: 'x'.repeat(11 * 1024 * 1024), right: null } }
|
||||
}
|
||||
const snapPath = join(root, 'big-snapshot.json')
|
||||
await wf(snapPath, JSON.stringify(snap), 'utf-8')
|
||||
|
||||
const { app, window } = await launchApp()
|
||||
// 对话框调用序:folder:pick 左 → folder:pick 右 → snapshot:read 快照
|
||||
await stubOpenDialogSeq(app, [[leftDir], [rightDir], [snapPath]])
|
||||
await window.getByRole('button', { name: '对比文件夹' }).click()
|
||||
await expect(window.getByText('相同 1')).toBeVisible()
|
||||
await window.getByRole('button', { name: '加载快照' }).click()
|
||||
// 专用通道(128MB 上限)加载成功:出现对照 toast,而非"文件超过 10MB"拦截
|
||||
await expect(window.getByText(/已加载快照/)).toBeVisible()
|
||||
await expect(window.getByText(/文件超过 10MB/)).toHaveCount(0)
|
||||
await app.close()
|
||||
} finally {
|
||||
await removeTmpDir(root)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
test.describe('大文件性能基准(耗时上限断言)', () => {
|
||||
// 口径说明:万级行 diff 在 worker 后台实测为秒级;上限按慢机约 4 倍余量放宽
|
||||
// 防 CI flaky(用例超时 60s 兜底)。断言失败即性能回归,需排查引擎/IO 退化。
|
||||
|
||||
Reference in New Issue
Block a user