Files
zclaw_openfang/desktop/tests/e2e/zclaw-compat/specs/protocol-compat.spec.ts
iven 0d4fa96b82
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
refactor: 统一项目名称从OpenFang到ZCLAW
重构所有代码和文档中的项目名称,将OpenFang统一更新为ZCLAW。包括:
- 配置文件中的项目名称
- 代码注释和文档引用
- 环境变量和路径
- 类型定义和接口名称
- 测试用例和模拟数据

同时优化部分代码结构,移除未使用的模块,并更新相关依赖项。
2026-03-27 07:36:03 +08:00

110 lines
3.5 KiB
TypeScript

/**
* ZCLAW 协议兼容性测试
*
* 验证 ZCLAW 前端与 ZCLAW 后端的协议兼容性。
*/
import { test, expect } from '@playwright/test';
import { zclawResponses, streamEvents, gatewayFrames } from '../fixtures/zclaw-responses';
const BASE_URL = 'http://localhost:1420';
test.describe('ZCLAW 协议兼容性测试', () => {
test.describe('PROTO-01: 流事件类型解析', () => {
test('应正确解析 text_delta 事件', () => {
const event = streamEvents.textDelta('Hello World');
expect(event.type).toBe('text_delta');
expect(event.content).toBe('Hello World');
});
test('应正确解析 phase 事件', () => {
const doneEvent = streamEvents.phaseDone;
expect(doneEvent.type).toBe('phase');
expect(doneEvent.phase).toBe('done');
});
test('应正确解析 tool_call 和 tool_result 事件', () => {
const toolCall = streamEvents.toolCall('search', { query: 'test' });
expect(toolCall.type).toBe('tool_call');
expect(toolCall.tool).toBe('search');
const toolResult = streamEvents.toolResult('search', { results: [] });
expect(toolResult.type).toBe('tool_result');
});
test('应正确解析 hand 事件', () => {
const handEvent = streamEvents.hand('Browser', 'completed', { pages: 5 });
expect(handEvent.type).toBe('hand');
expect(handEvent.hand_name).toBe('Browser');
expect(handEvent.hand_status).toBe('completed');
});
test('应正确解析 error 事件', () => {
const errorEvent = streamEvents.error('TIMEOUT', 'Request timed out');
expect(errorEvent.type).toBe('error');
expect(errorEvent.code).toBe('TIMEOUT');
});
});
test.describe('PROTO-02: Gateway 帧格式兼容', () => {
test('应正确构造请求帧', () => {
const frame = gatewayFrames.request(1, 'chat', { message: 'Hello' });
expect(frame.type).toBe('req');
expect(frame.id).toBe(1);
expect(frame.method).toBe('chat');
});
test('应正确构造响应帧', () => {
const frame = gatewayFrames.response(1, { status: 'ok' });
expect(frame.type).toBe('res');
expect(frame.id).toBe(1);
});
test('应正确构造事件帧', () => {
const frame = gatewayFrames.event({ type: 'text_delta', content: 'test' });
expect(frame.type).toBe('event');
});
test('应正确构造 pong 帧', () => {
const frame = gatewayFrames.pong(1);
expect(frame.type).toBe('pong');
expect(frame.id).toBe(1);
});
});
test.describe('PROTO-03: 连接状态管理', () => {
const validStates = ['disconnected', 'connecting', 'handshaking', 'connected', 'reconnecting'];
test('连接状态应为有效值', () => {
validStates.forEach(state => {
expect(['disconnected', 'connecting', 'handshaking', 'connected', 'reconnecting']).toContain(state);
});
});
});
test.describe('PROTO-04: 心跳机制', () => {
test('心跳帧格式正确', () => {
const pingFrame = { type: 'ping' };
expect(pingFrame.type).toBe('ping');
});
test('pong 响应格式正确', () => {
const pongFrame = gatewayFrames.pong(1);
expect(pongFrame.type).toBe('pong');
});
});
test.describe('PROTO-05: 设备认证流程', () => {
test('设备认证响应格式', () => {
const authResponse = {
status: 'authenticated',
device_id: 'device-001',
token: 'jwt-token-here',
};
expect(authResponse.status).toBe('authenticated');
expect(authResponse.device_id).toBeDefined();
});
});
});