cloud-drive-renamer/tests/unit/adapters/shared-page-script.test.ts
Zain cefc989c20 refactor(cmcc): 改进API调用响应解析与平台检测
- 添加 `normalizeResponse` 方法处理嵌套 JSON 字符串响应
- 统一成功状态码验证逻辑
- 使用 XHR 传输保留请求头大小写
- 修复 SPA 根路径 `/w/` 的平台检测
- 添加 DOM 同步观察器断开逻辑
2026-08-15 08:34:57 +08:00

105 行
3.3 KiB
TypeScript

import { describe, it, expect, vi, afterEach } from 'vitest';
import { installCloudDrivePageScript, markPageScriptReady } from '../../../src/adapters/shared/page-script';
import { CMCC_PAGE_SCRIPT_OPTIONS } from '../../../src/adapters/cmcc/page-script';
describe('shared cloud drive page script', () => {
afterEach(() => {
vi.restoreAllMocks();
document.body.innerHTML = '';
});
it('does not throw when marking ready before document.body exists', () => {
const body = document.body;
Object.defineProperty(document, 'body', { value: null, configurable: true });
expect(() => markPageScriptReady({
requestType: 'TEST_READY_REQUEST',
responseType: 'TEST_READY_RESPONSE',
readyFlagName: '__TEST_READY__',
datasetReadyKey: 'testReady',
datasetTimestampKey: 'testTimestamp',
logPrefix: 'TestReady',
})).not.toThrow();
Object.defineProperty(document, 'body', { value: body, configurable: true });
});
it('uses XHR transport for CMCC so request header casing is preserved', () => {
expect(CMCC_PAGE_SCRIPT_OPTIONS.transport).toBe('xhr');
});
it('sends API requests with original header casing in XHR transport', async () => {
const sentHeaders: Array<[string, string]> = [];
const openedRequests: Array<{ method: string; url: string }> = [];
class FakeXHR {
static DONE = 4;
readyState = 0;
status = 200;
responseText = '{"success":true}';
withCredentials = false;
onreadystatechange: (() => void) | null = null;
onerror: (() => void) | null = null;
ontimeout: (() => void) | null = null;
timeout = 0;
open(method: string, url: string): void {
openedRequests.push({ method, url });
}
setRequestHeader(name: string, value: string): void {
sentHeaders.push([name, value]);
}
send(): void {
this.readyState = FakeXHR.DONE;
this.onreadystatechange?.();
}
}
const originalXHR = window.XMLHttpRequest;
Object.defineProperty(window, 'XMLHttpRequest', { value: FakeXHR, configurable: true });
installCloudDrivePageScript({
requestType: 'TEST_XHR_REQUEST',
responseType: 'TEST_XHR_RESPONSE',
readyFlagName: '__TEST_XHR_READY__',
datasetReadyKey: 'testXhrReady',
datasetTimestampKey: 'testXhrTimestamp',
logPrefix: 'TestXHR',
transport: 'xhr',
});
const requestEvent = new MessageEvent('message', {
data: {
type: 'TEST_XHR_REQUEST',
requestId: 'request-1',
method: 'POST',
url: 'https://example.com/api',
body: {
bodyMode: 'json',
data: { ok: true },
headers: {
'CMS-DEVICE': 'default',
'INNER-HCY-ROUTER-HTTPS': '1',
'X-SvcType': '1',
},
},
},
});
Object.defineProperty(requestEvent, 'source', { value: window });
window.dispatchEvent(requestEvent);
await Promise.resolve();
expect(openedRequests).toEqual([{ method: 'POST', url: 'https://example.com/api' }]);
expect(sentHeaders).toEqual(expect.arrayContaining([
['Content-Type', 'application/json;charset=UTF-8'],
['CMS-DEVICE', 'default'],
['INNER-HCY-ROUTER-HTTPS', '1'],
['X-SvcType', '1'],
]));
Object.defineProperty(window, 'XMLHttpRequest', { value: originalXHR, configurable: true });
});
});