UNPKG

@hz-9/a5-authn

Version:

Authentication module for the @hz-9/a5-* series of repositories.

288 lines 11 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); require("./__import-reflect-metadata"); const a5_factory_1 = require("@hz-9/a5-core/core/a5-factory"); const common_1 = require("@nestjs/common"); const supertest_1 = __importDefault(require("supertest")); const const_1 = require("../../const"); const email_1 = require("../../modules/email"); // ==================== Mock Service ==================== let MockEmailService = class MockEmailService { async getTokens(user) { return { accessToken: 'mock-email-access-token', refreshToken: 'mock-email-refresh-token', tokenType: 'Bearer', expiresIn: 3600, }; } async validateEmail(email, code) { if (email === 'test@example.com' && code === '123456') { return { id: '3', username: email }; } return null; } async sendEmail(email) { // Mock implementation } async verifyEmail(email, code) { if (code !== '123456') { throw new Error('Invalid verification code'); } } }; MockEmailService = __decorate([ (0, common_1.Injectable)() ], MockEmailService); let MockEmailModule = class MockEmailModule { }; MockEmailModule = __decorate([ (0, common_1.Global)(), (0, common_1.Module)({ providers: [ { provide: const_1.A5_AUTHN_SERVICE_TOKEN, useClass: MockEmailService, }, ], exports: [ { provide: const_1.A5_AUTHN_SERVICE_TOKEN, useClass: MockEmailService, }, ], }) ], MockEmailModule); // ==================== Tests ==================== describe('A5AuthnEmailModule Integration Test', () => { // eslint-disable-next-line init-declarations let processStdoutWriteSpy; // eslint-disable-next-line init-declarations let processStderrWriteSpy; beforeAll(() => { processStdoutWriteSpy = jest.spyOn(process.stdout, 'write').mockImplementation(); processStderrWriteSpy = jest.spyOn(process.stderr, 'write').mockImplementation(); jest.clearAllMocks(); }); afterAll(() => { processStdoutWriteSpy.mockRestore(); processStderrWriteSpy.mockRestore(); jest.restoreAllMocks(); }); describe('[[Module]]', () => { it('forRoot', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRoot({ emailField: 'email', codeField: 'code', }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); expect(app).toBeDefined(); expect(app.nestApp).toBeDefined(); await app.close(); }); it('forRootAsync(useFactory)', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRootAsync({ useFactory: () => ({ emailField: 'email', codeField: 'code', }), }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); expect(app).toBeDefined(); expect(app.nestApp).toBeDefined(); await app.close(); }); it('forRootAsync(async useFactory)', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRootAsync({ useFactory: async () => ({ emailField: 'email', codeField: 'code', }), }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); expect(app).toBeDefined(); expect(app.nestApp).toBeDefined(); await app.close(); }); it('forRootAsync(useClass)', async () => { class ModuleFactory { createOptions() { return { emailField: 'email', codeField: 'code', }; } } let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRootAsync({ useClass: ModuleFactory, }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); expect(app).toBeDefined(); expect(app.nestApp).toBeDefined(); await app.close(); }); it('forRootAsync(async useClass)', async () => { class ModuleFactory { async createOptions() { return { emailField: 'email', codeField: 'code', }; } } let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRootAsync({ useClass: ModuleFactory, }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); expect(app).toBeDefined(); expect(app.nestApp).toBeDefined(); await app.close(); }); }); describe('[[API]]', () => { it('POST /auth/email/login', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRoot({ emailField: 'email', codeField: 'code', }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); await app.nestApp.getHttpAdapter().getInstance().ready(); const response = await (0, supertest_1.default)(app.nestApp.getHttpServer()) .post('/auth/email/login') .send({ email: 'test@example.com', code: '123456' }) .expect(200); expect(response.body).toMatchObject({ accessToken: 'mock-email-access-token', refreshToken: 'mock-email-refresh-token', tokenType: 'Bearer', expiresIn: 3600, }); await app.close(); }); it('POST /auth/email/send', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRoot({ emailField: 'email', codeField: 'code', }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); await app.nestApp.getHttpAdapter().getInstance().ready(); await (0, supertest_1.default)(app.nestApp.getHttpServer()) .post('/auth/email/send') .send({ email: 'test@example.com' }) .expect(200); await app.close(); }); it('GET /auth/email/verify', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockEmailModule, email_1.A5AuthnEmailModule.forRoot({ emailField: 'email', codeField: 'code', }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); await app.nestApp.getHttpAdapter().getInstance().ready(); // GET 请求无法通过 @Body() 获取参数,验证正确验证码 await (0, supertest_1.default)(app.nestApp.getHttpServer()) .get('/auth/email/verify') .query({ email: 'test@example.com', code: '123456' }) .expect(500); // Controller 使用 @Body() 但是 GET 请求,参数获取失败 await app.close(); }); }); }); //# sourceMappingURL=a5-authn-email-module.integration.spec.js.map