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>
86 lines
2.6 KiB
JavaScript
86 lines
2.6 KiB
JavaScript
/**
|
||
* 集成测试 - 状态保存(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();
|
||
}
|
||
});
|
||
});
|
||
|