Files
whale-town-end/test/business/login.e2e_spec.ts
moyin 71bc317c57 test:添加位置广播系统端到端测试
- 添加并发用户测试场景
- 实现数据库恢复集成测试
- 重命名登录测试文件以符合命名规范
2026-01-08 23:06:11 +08:00

195 lines
5.6 KiB
TypeScript
Raw 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.
/**
* 登录功能端到端测试
*
* 功能描述:
* - 测试用户注册、登录、GitHub OAuth等认证功能
* - 验证密码重置流程的完整性
* - 确保API端点的正确响应和错误处理
*
* 最近修改:
* - 2026-01-08: 文件重命名 - 修正kebab-case为snake_case命名规范 (修改者: moyin)
*
* @author original
* @version 1.0.1
* @since 2025-01-01
* @lastModified 2026-01-08
*/
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from '../../src/app.module';
describe('Login (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('/auth/register (POST)', () => {
it('should register a new user', () => {
return request(app.getHttpServer())
.post('/auth/register')
.send({
username: 'testuser' + Date.now(),
password: 'password123',
nickname: '测试用户',
email: `test${Date.now()}@example.com`
})
.expect(201)
.expect((res) => {
expect(res.body.success).toBe(true);
expect(res.body.data.user.username).toBeDefined();
expect(res.body.data.access_token).toBeDefined();
});
});
it('should return error for invalid password', () => {
return request(app.getHttpServer())
.post('/auth/register')
.send({
username: 'testuser',
password: '123', // 密码太短
nickname: '测试用户'
})
.expect(400);
});
});
describe('/auth/login (POST)', () => {
it('should login with valid credentials', async () => {
// 先注册用户
const username = 'logintest' + Date.now();
await request(app.getHttpServer())
.post('/auth/register')
.send({
username,
password: 'password123',
nickname: '登录测试用户'
});
// 然后登录
return request(app.getHttpServer())
.post('/auth/login')
.send({
identifier: username,
password: 'password123'
})
.expect(200)
.expect((res) => {
expect(res.body.success).toBe(true);
expect(res.body.data.user.username).toBe(username);
expect(res.body.data.access_token).toBeDefined();
});
});
it('should return error for invalid credentials', () => {
return request(app.getHttpServer())
.post('/auth/login')
.send({
identifier: 'nonexistent',
password: 'wrongpassword'
})
.expect(200) // 业务层返回200但success为false
.expect((res) => {
expect(res.body.success).toBe(false);
expect(res.body.error_code).toBe('LOGIN_FAILED');
});
});
});
describe('/auth/github (POST)', () => {
it('should handle GitHub OAuth login', () => {
return request(app.getHttpServer())
.post('/auth/github')
.send({
github_id: 'github' + Date.now(),
username: 'githubuser' + Date.now(),
nickname: 'GitHub用户',
email: `github${Date.now()}@example.com`,
avatar_url: 'https://avatars.githubusercontent.com/u/123456'
})
.expect(200)
.expect((res) => {
expect(res.body.success).toBe(true);
expect(res.body.data.user.username).toBeDefined();
expect(res.body.data.is_new_user).toBe(true);
});
});
});
describe('/auth/forgot-password (POST)', () => {
it('should send password reset code', async () => {
// 先注册用户
const email = `reset${Date.now()}@example.com`;
await request(app.getHttpServer())
.post('/auth/register')
.send({
username: 'resettest' + Date.now(),
password: 'password123',
nickname: '重置测试用户',
email
});
// 发送重置验证码
return request(app.getHttpServer())
.post('/auth/forgot-password')
.send({
identifier: email
})
.expect(200)
.expect((res) => {
expect(res.body.success).toBe(true);
expect(res.body.data.verification_code).toMatch(/^\d{6}$/);
});
});
});
describe('/auth/reset-password (POST)', () => {
it('should reset password with valid code', async () => {
// 先注册用户
const email = `resetpwd${Date.now()}@example.com`;
await request(app.getHttpServer())
.post('/auth/register')
.send({
username: 'resetpwdtest' + Date.now(),
password: 'password123',
nickname: '重置密码测试用户',
email
});
// 获取验证码
const codeResponse = await request(app.getHttpServer())
.post('/auth/forgot-password')
.send({
identifier: email
});
const verificationCode = codeResponse.body.data.verification_code;
// 重置密码
return request(app.getHttpServer())
.post('/auth/reset-password')
.send({
identifier: email,
verification_code: verificationCode,
new_password: 'newpassword123'
})
.expect(200)
.expect((res) => {
expect(res.body.success).toBe(true);
expect(res.body.message).toBe('密码重置成功');
});
});
});
});