UNPKG

@hz-9/a5-authn

Version:

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

289 lines 10.8 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 jwt_1 = require("../../modules/jwt"); // ==================== Mock Service ==================== let MockJwtService = class MockJwtService { async logout(user) { // Mock implementation } async me(user) { return { id: user.id, username: user.username, email: 'mock@example.com', roles: ['user'], }; } async refreshToken(refreshToken) { if (refreshToken !== 'valid-refresh-token') { throw new Error('Invalid refresh token'); } return { accessToken: 'mock-jwt-new-access-token', refreshToken: 'mock-jwt-new-refresh-token', tokenType: 'Bearer', expiresIn: 3600, }; } async jwtPayloadToUserPayload(payload) { return { id: payload.sub, username: payload.username || 'unknown', }; } }; MockJwtService = __decorate([ (0, common_1.Injectable)() ], MockJwtService); let MockJwtModule = class MockJwtModule { }; MockJwtModule = __decorate([ (0, common_1.Global)(), (0, common_1.Module)({ providers: [ { provide: const_1.A5_AUTHN_SERVICE_TOKEN, useClass: MockJwtService, }, ], exports: [ { provide: const_1.A5_AUTHN_SERVICE_TOKEN, useClass: MockJwtService, }, ], }) ], MockJwtModule); // ==================== Tests ==================== describe('A5AuthnJwtModule 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: [ MockJwtModule, jwt_1.A5AuthnJwtModule.forRoot({ secret: 'test-secret-key', expiresIn: '1d', }), ], }) ], 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: [ MockJwtModule, jwt_1.A5AuthnJwtModule.forRootAsync({ useFactory: () => ({ secret: 'test-secret-key', expiresIn: '1d', }), }), ], }) ], 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: [ MockJwtModule, jwt_1.A5AuthnJwtModule.forRootAsync({ useFactory: async () => ({ secret: 'test-secret-key', expiresIn: '1d', }), }), ], }) ], 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 { secret: 'test-secret-key', expiresIn: '1d', }; } } let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockJwtModule, jwt_1.A5AuthnJwtModule.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 { secret: 'test-secret-key', expiresIn: '1d', }; } } let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockJwtModule, jwt_1.A5AuthnJwtModule.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/refresh', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockJwtModule, jwt_1.A5AuthnJwtModule.forRoot({ secret: 'test-secret-key', expiresIn: '1d', }), ], }) ], 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/refresh') .send({ refreshToken: 'valid-refresh-token' }) .expect(200); expect(response.body).toMatchObject({ accessToken: 'mock-jwt-new-access-token', refreshToken: 'mock-jwt-new-refresh-token', tokenType: 'Bearer', expiresIn: 3600, }); await app.close(); }); it('POST /auth/logout', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockJwtModule, jwt_1.A5AuthnJwtModule.forRoot({ secret: 'test-secret-key', expiresIn: '1d', }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); await app.nestApp.getHttpAdapter().getInstance().ready(); // 未提供 JWT token,应该返回 401 await (0, supertest_1.default)(app.nestApp.getHttpServer()).post('/auth/logout').expect(401); await app.close(); }); it('GET /auth/me', async () => { let TestModule = class TestModule { }; TestModule = __decorate([ (0, common_1.Module)({ imports: [ MockJwtModule, jwt_1.A5AuthnJwtModule.forRoot({ secret: 'test-secret-key', expiresIn: '1d', }), ], }) ], TestModule); const app = await a5_factory_1.A5Factory.create(TestModule, { printLogo: false, }); await app.nestApp.getHttpAdapter().getInstance().ready(); // 未提供 JWT token,应该返回 401 await (0, supertest_1.default)(app.nestApp.getHttpServer()).get('/auth/me').expect(401); await app.close(); }); }); }); //# sourceMappingURL=a5-authn-jwt-module.integration.spec.js.map