@sync-in/server
Version:
The secure, open-source platform for file storage, sharing, collaboration, and sync
147 lines (146 loc) • 7.11 kB
JavaScript
/*
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
* This file is part of Sync-in | The open source file sync and share solution
* See the LICENSE file for licensing details
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
const _config = require("@nestjs/config");
const _jwt = require("@nestjs/jwt");
const _passport = require("@nestjs/passport");
const _testing = require("@nestjs/testing");
const _notificationsmanagerservice = require("../applications/notifications/services/notifications-manager.service");
const _usermodel = require("../applications/users/models/user.model");
const _usersmanagerservice = require("../applications/users/services/users-manager.service");
const _test = require("../applications/users/utils/test");
const _functions = require("../common/functions");
const _shared = require("../common/shared");
const _configenvironment = require("../configuration/config.environment");
const _cacheservice = require("../infrastructure/cache/services/cache.service");
const _constants = require("../infrastructure/database/constants");
const _authcontroller = require("./auth.controller");
const _auth = require("./constants/auth");
const _loginresponsedto = require("./dto/login-response.dto");
const _authtwofaguard = require("./guards/auth-two-fa-guard");
const _tokeninterface = require("./interfaces/token.interface");
const _authmanagerservice = require("./services/auth-manager.service");
const _authmethodtwofaservice = require("./services/auth-methods/auth-method-two-fa.service");
describe(_authcontroller.AuthController.name, ()=>{
let module;
let authController;
let authConfig;
let userTest;
beforeAll(async ()=>{
module = await _testing.Test.createTestingModule({
imports: [
await _config.ConfigModule.forRoot({
load: [
_configenvironment.exportConfiguration
],
isGlobal: true
}),
_passport.PassportModule
],
controllers: [
_authcontroller.AuthController
],
providers: [
_config.ConfigService,
_authmanagerservice.AuthManager,
_jwt.JwtService,
_authmethodtwofaservice.AuthMethod2FA,
_authtwofaguard.AuthTwoFaGuard,
{
provide: _constants.DB_TOKEN_PROVIDER,
useValue: {}
},
{
provide: _cacheservice.Cache,
useValue: {}
},
{
provide: _usersmanagerservice.UsersManager,
useValue: {}
},
{
provide: _notificationsmanagerservice.NotificationsManager,
useValue: {}
}
]
}).compile();
module.useLogger([
'fatal'
]);
authConfig = module.get(_config.ConfigService).get('auth');
authController = module.get(_authcontroller.AuthController);
userTest = new _usermodel.UserModel({
...(0, _test.generateUserTest)(),
id: 888
}, false);
});
afterAll(async ()=>{
await module.close();
});
it('should be defined', ()=>{
expect(authConfig).toBeDefined();
expect(authController).toBeDefined();
expect(userTest).toBeDefined();
});
it('should set JWT in cookies', async ()=>{
const res = {
setCookie: jest.fn()
};
const result = await authController.login(userTest, res);
expect(result).toBeDefined();
expect(result).toBeInstanceOf(_loginresponsedto.LoginResponseDto);
expect(res.setCookie).toHaveBeenCalledTimes(4);
expect(result.token.access_expiration).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token.access.expiration) + (0, _shared.currentTimeStamp)(), -1);
expect(result.token.refresh_expiration).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token.refresh.expiration) + (0, _shared.currentTimeStamp)(), -1);
});
it('should clear JWT in cookies', async ()=>{
const res = {
clearCookie: jest.fn()
};
await expect(authController.logout(res)).resolves.not.toThrow();
expect(res.clearCookie).toHaveBeenCalledTimes(Object.keys(_auth.TOKEN_PATHS).length);
});
it('should refresh JWT in cookies', async ()=>{
userTest.exp = (0, _shared.currentTimeStamp)() + (0, _functions.convertHumanTimeToSeconds)('30s');
const res = {
setCookie: jest.fn()
};
const result = await authController.refreshCookies(userTest, res);
expect(result).toBeDefined();
expect(res.setCookie).toHaveBeenCalledTimes(4);
expect(result.access_expiration).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token.access.expiration) + (0, _shared.currentTimeStamp)(), -1);
expect(result.refresh_expiration).toBe(userTest.exp);
});
it('should not refresh JWT in cookies', async ()=>{
userTest.exp = (0, _shared.currentTimeStamp)() - 1;
const res = {
setCookie: jest.fn()
};
await expect(authController.refreshCookies(userTest, res)).rejects.toThrow();
});
it('should get JWT in response body', async ()=>{
const result = await authController.token(userTest);
expect(result[_tokeninterface.TOKEN_TYPE.ACCESS]).toBeDefined();
expect(result[_tokeninterface.TOKEN_TYPE.REFRESH]).toBeDefined();
expect(result[`${_tokeninterface.TOKEN_TYPE.ACCESS}_expiration`]).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token.access.expiration) + (0, _shared.currentTimeStamp)(), -1);
expect(result[`${_tokeninterface.TOKEN_TYPE.REFRESH}_expiration`]).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token.refresh.expiration) + (0, _shared.currentTimeStamp)(), -1);
});
it('should refresh JWT in response body', async ()=>{
userTest.exp = (0, _shared.currentTimeStamp)() + (0, _functions.convertHumanTimeToSeconds)('30s');
const result = await authController.refreshToken(userTest);
expect(result[_tokeninterface.TOKEN_TYPE.ACCESS]).toBeDefined();
expect(result[_tokeninterface.TOKEN_TYPE.REFRESH]).toBeDefined();
expect(result[`${_tokeninterface.TOKEN_TYPE.ACCESS}_expiration`]).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token.access.expiration) + (0, _shared.currentTimeStamp)(), -1);
expect(result[`${_tokeninterface.TOKEN_TYPE.REFRESH}_expiration`]).toBe(userTest.exp);
});
it('should not refresh JWT in response body', async ()=>{
userTest.exp = (0, _shared.currentTimeStamp)() - 1;
await expect(authController.refreshToken(userTest)).rejects.toThrow();
});
});
//# sourceMappingURL=auth.controller.spec.js.map