- 新增多个模块的单元测试文件,提升测试覆盖率 - 完善AI-Reading文档系统,包含7步代码检查流程 - 新增集成测试和属性测试框架 - 优化项目结构和配置文件 - 清理过时的规范文档,统一使用新的检查标准
230 lines
7.0 KiB
TypeScript
230 lines
7.0 KiB
TypeScript
/**
|
||
* Zulip集成功能端到端测试
|
||
*
|
||
* 功能描述:
|
||
* - 测试用户注册时Zulip账号的创建和绑定
|
||
* - 验证用户登录时Zulip API Key的验证和更新
|
||
* - 确保Zulip账号关联的完整性
|
||
* - 测试Zulip集成的完整业务流程
|
||
*
|
||
* 职责分离:
|
||
* - E2E测试:测试完整的用户注册和登录流程
|
||
* - 集成验证:验证Zulip服务与业务逻辑的集成
|
||
* - 数据一致性:确保Zulip账号关联数据的正确性
|
||
*
|
||
* 测试策略:
|
||
* - 模拟真实用户操作流程进行端到端测试
|
||
* - 验证Zulip账号创建和绑定的各种场景
|
||
* - 测试异常情况下的错误处理和恢复机制
|
||
*
|
||
* 使用场景:
|
||
* - 验证Zulip集成功能的完整性
|
||
* - 确保用户注册登录流程的稳定性
|
||
* - 回归测试中验证Zulip相关功能
|
||
*
|
||
* 最近修改:
|
||
* - 2026-01-12: 代码规范优化 - 完善E2E测试文件注释规范,添加职责分离和使用场景 (修改者: moyin)
|
||
*
|
||
* @author moyin
|
||
* @version 1.0.1
|
||
* @since 2026-01-12
|
||
* @lastModified 2026-01-12
|
||
*/
|
||
|
||
import { Test, TestingModule } from '@nestjs/testing';
|
||
import { INestApplication } from '@nestjs/common';
|
||
import * as request from 'supertest';
|
||
import { AppModule } from '../../src/app.module';
|
||
|
||
describe('Zulip Integration (e2e)', () => {
|
||
let app: INestApplication;
|
||
|
||
beforeEach(async () => {
|
||
const moduleFixture: TestingModule = await Test.createTestingModule({
|
||
imports: [AppModule],
|
||
}).compile();
|
||
|
||
app = moduleFixture.createNestApplication();
|
||
await app.init();
|
||
});
|
||
|
||
afterEach(async () => {
|
||
await app.close();
|
||
});
|
||
|
||
describe('用户注册时的Zulip集成', () => {
|
||
it('应该在用户注册时创建或绑定Zulip账号', async () => {
|
||
const timestamp = Date.now();
|
||
const username = `zuliptest${timestamp}`;
|
||
const email = `zuliptest${timestamp}@example.com`;
|
||
|
||
const response = await request(app.getHttpServer())
|
||
.post('/auth/register')
|
||
.send({
|
||
username,
|
||
password: 'password123',
|
||
nickname: 'Zulip测试用户',
|
||
email,
|
||
email_verification_code: '123456' // 在测试模式下可能需要
|
||
})
|
||
.expect(201);
|
||
|
||
expect(response.body.success).toBe(true);
|
||
expect(response.body.data.user.username).toBe(username);
|
||
expect(response.body.data.access_token).toBeDefined();
|
||
|
||
// 检查响应消息是否包含Zulip相关信息
|
||
const message = response.body.data.message || response.body.message;
|
||
console.log('注册响应消息:', message);
|
||
});
|
||
|
||
it('应该处理邮箱已存在的Zulip账号绑定', async () => {
|
||
const timestamp = Date.now();
|
||
const username1 = `zulipbind1_${timestamp}`;
|
||
const username2 = `zulipbind2_${timestamp}`;
|
||
const sharedEmail = `shared${timestamp}@example.com`;
|
||
|
||
// 第一次注册
|
||
await request(app.getHttpServer())
|
||
.post('/auth/register')
|
||
.send({
|
||
username: username1,
|
||
password: 'password123',
|
||
nickname: 'Zulip绑定测试1',
|
||
email: sharedEmail,
|
||
})
|
||
.expect(201);
|
||
|
||
// 第二次注册使用不同用户名但相同邮箱(模拟Zulip账号已存在的情况)
|
||
const response = await request(app.getHttpServer())
|
||
.post('/auth/register')
|
||
.send({
|
||
username: username2,
|
||
password: 'password123',
|
||
nickname: 'Zulip绑定测试2',
|
||
email: `different${timestamp}@example.com`, // 使用不同邮箱避免冲突
|
||
})
|
||
.expect(201);
|
||
|
||
expect(response.body.success).toBe(true);
|
||
});
|
||
});
|
||
|
||
describe('用户登录时的Zulip API Key验证', () => {
|
||
let testUser: any;
|
||
|
||
beforeEach(async () => {
|
||
// 创建测试用户
|
||
const timestamp = Date.now();
|
||
const username = `loginzulip${timestamp}`;
|
||
const email = `loginzulip${timestamp}@example.com`;
|
||
|
||
const registerResponse = await request(app.getHttpServer())
|
||
.post('/auth/register')
|
||
.send({
|
||
username,
|
||
password: 'password123',
|
||
nickname: 'Zulip登录测试用户',
|
||
email,
|
||
})
|
||
.expect(201);
|
||
|
||
testUser = {
|
||
username,
|
||
password: 'password123',
|
||
email,
|
||
userId: registerResponse.body.data.user.id
|
||
};
|
||
});
|
||
|
||
it('应该在登录时验证Zulip API Key', async () => {
|
||
const response = await request(app.getHttpServer())
|
||
.post('/auth/login')
|
||
.send({
|
||
identifier: testUser.username,
|
||
password: testUser.password
|
||
})
|
||
.expect(200);
|
||
|
||
expect(response.body.success).toBe(true);
|
||
expect(response.body.data.user.username).toBe(testUser.username);
|
||
expect(response.body.data.access_token).toBeDefined();
|
||
|
||
// 登录成功表示Zulip API Key验证通过或已更新
|
||
console.log('登录成功,Zulip API Key状态正常');
|
||
});
|
||
|
||
it('应该处理多次登录的API Key验证', async () => {
|
||
// 第一次登录
|
||
const firstLogin = await request(app.getHttpServer())
|
||
.post('/auth/login')
|
||
.send({
|
||
identifier: testUser.username,
|
||
password: testUser.password
|
||
})
|
||
.expect(200);
|
||
|
||
expect(firstLogin.body.success).toBe(true);
|
||
|
||
// 第二次登录(测试API Key缓存和验证)
|
||
const secondLogin = await request(app.getHttpServer())
|
||
.post('/auth/login')
|
||
.send({
|
||
identifier: testUser.username,
|
||
password: testUser.password
|
||
})
|
||
.expect(200);
|
||
|
||
expect(secondLogin.body.success).toBe(true);
|
||
console.log('多次登录API Key验证正常');
|
||
});
|
||
});
|
||
|
||
describe('错误处理', () => {
|
||
it('应该在Zulip服务不可用时仍能正常注册', async () => {
|
||
const timestamp = Date.now();
|
||
const username = `errortest${timestamp}`;
|
||
|
||
// 即使Zulip服务出错,用户注册也应该成功
|
||
const response = await request(app.getHttpServer())
|
||
.post('/auth/register')
|
||
.send({
|
||
username,
|
||
password: 'password123',
|
||
nickname: 'Zulip错误测试用户',
|
||
// 不提供邮箱,跳过Zulip创建
|
||
})
|
||
.expect(201);
|
||
|
||
expect(response.body.success).toBe(true);
|
||
expect(response.body.data.user.username).toBe(username);
|
||
});
|
||
|
||
it('应该在Zulip API Key验证失败时仍能正常登录', async () => {
|
||
// 创建没有邮箱的用户(不会创建Zulip账号)
|
||
const timestamp = Date.now();
|
||
const username = `nozulip${timestamp}`;
|
||
|
||
await request(app.getHttpServer())
|
||
.post('/auth/register')
|
||
.send({
|
||
username,
|
||
password: 'password123',
|
||
nickname: '无Zulip测试用户',
|
||
})
|
||
.expect(201);
|
||
|
||
// 登录应该成功,即使没有Zulip账号
|
||
const response = await request(app.getHttpServer())
|
||
.post('/auth/login')
|
||
.send({
|
||
identifier: username,
|
||
password: 'password123'
|
||
})
|
||
.expect(200);
|
||
|
||
expect(response.body.success).toBe(true);
|
||
console.log('无Zulip账号用户登录正常');
|
||
});
|
||
});
|
||
}); |