Files
胡绍康andCopilot cf7817bb95 feat: UI全局美化重设计 + 恢复CI/测试/文档
UI 改进:
- 设置页面内嵌显示(不再弹窗)
- 临时邮箱卡片添加验证码提取按钮
- 导入账号弹窗 textarea 样式优化
- 账号头像 8 色渐变轮转
- 临时邮箱页顶栏邮箱点击复制
- 邮箱管理页自动选中默认分组
- 切换分组时重置邮件列 UI
- 修复收件箱/垃圾邮件 Tab 切换(.folder-tab → .email-tab)
- 修复从临时邮箱返回后账号列数据残留
- 仪表盘分组列表可点击导航

恢复:
- 恢复 .github/ CI 工作流
- 恢复 tests/ 测试目录
- 恢复 docs/ 文档目录
- 恢复 CONTRIBUTING.md, SECURITY.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-01 21:24:06 +08:00

86 lines
2.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 集成测试 - 状态保存(TASK-04-002)
*
* 覆盖:
* - TC-F4-001-P: 拖动后 500ms 保存状态
* - TC-F4-002-P: 折叠后立即保存状态
* - TC-F4-005-P: beforeunload 强制保存
*/
const LayoutManager = require('../../../static/js/layout-manager.js');
const { createLayoutDOM, simulateDrag } = require('../test-utils.js');
describe('状态保存集成测试(TASK-04-002)', () => {
let layoutManager;
const storageKey = 'outlook_layout_state_guest';
beforeEach(() => {
createLayoutDOM();
Object.defineProperty(window, 'innerWidth', {
writable: true,
configurable: true,
value: 1600
});
layoutManager = new LayoutManager();
layoutManager.init();
});
test('TC-F4-001-P: 拖动后 500ms 保存状态', () => {
jest.useFakeTimers();
try {
const resizer = document.querySelector('[data-resizer="groups"]');
simulateDrag(resizer, 200, 250);
// 500ms 内不应写入
expect(window.localStorage.getItem(storageKey)).toBeNull();
jest.advanceTimersByTime(499);
expect(window.localStorage.getItem(storageKey)).toBeNull();
// 500ms 到达后写入
jest.advanceTimersByTime(1);
const savedRaw = window.localStorage.getItem(storageKey);
expect(savedRaw).toBeTruthy();
const saved = JSON.parse(savedRaw);
expect(saved.version).toBe('1.1');
expect(saved.userId).toBe('guest');
expect(saved.panels.groups.width).toBe('250px');
expect(saved.panels.groups.collapsed).toBe(false);
} finally {
jest.useRealTimers();
}
});
test('TC-F4-002-P: 折叠后立即保存状态', () => {
const btn = document.querySelector('[data-panel="groups"] .collapse-btn');
btn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
const savedRaw = window.localStorage.getItem(storageKey);
expect(savedRaw).toBeTruthy();
const saved = JSON.parse(savedRaw);
expect(saved.panels.groups.collapsed).toBe(true);
});
test('TC-F4-005-P: 页面卸载时强制保存', () => {
jest.useFakeTimers();
try {
const resizer = document.querySelector('[data-resizer="groups"]');
simulateDrag(resizer, 200, 260);
// 防抖尚未到达时触发 beforeunload,应立即落盘
expect(window.localStorage.getItem(storageKey)).toBeNull();
window.dispatchEvent(new Event('beforeunload'));
const savedRaw = window.localStorage.getItem(storageKey);
expect(savedRaw).toBeTruthy();
const saved = JSON.parse(savedRaw);
expect(saved.panels.groups.width).toBe('260px');
} finally {
jest.useRealTimers();
}
});
});