@tomei/sso 0.60.4-dev.1 → 0.60.4-dev.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.commitlintrc.json +22 -22
- package/.gitlab-ci.yml +16 -16
- package/.husky/commit-msg +9 -9
- package/.husky/pre-commit +7 -7
- package/.prettierrc +4 -4
- package/Jenkinsfile +57 -57
- package/README.md +23 -23
- package/__tests__/unit/components/group/group.spec.ts +79 -79
- package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
- package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
- package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
- package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
- package/__tests__/unit/components/login-user/l.spec.ts +746 -746
- package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
- package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
- package/__tests__/unit/components/system/system.spec.ts +254 -254
- package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
- package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
- package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
- package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
- package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
- package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
- package/__tests__/unit/session/session.service.spec.ts +47 -47
- package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
- package/coverage/clover.xml +1452 -1452
- package/coverage/coverage-final.json +47 -47
- package/coverage/lcov-report/base.css +224 -224
- package/coverage/lcov-report/block-navigation.js +87 -87
- package/coverage/lcov-report/components/group/group.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group/group.ts.html +327 -327
- package/coverage/lcov-report/components/group/index.html +130 -130
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +321 -321
- package/coverage/lcov-report/components/group-object-privilege/index.html +130 -130
- package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +303 -303
- package/coverage/lcov-report/components/group-privilege/index.html +130 -130
- package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.ts.html +327 -327
- package/coverage/lcov-report/components/group-reporting-user/index.html +130 -130
- package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +309 -309
- package/coverage/lcov-report/components/group-system-access/index.html +130 -130
- package/coverage/lcov-report/components/login-history/index.html +115 -115
- package/coverage/lcov-report/components/login-history/login-history.repository.ts.html +117 -117
- package/coverage/lcov-report/components/login-user/index.html +130 -130
- package/coverage/lcov-report/components/login-user/login-user.ts.html +5015 -5008
- package/coverage/lcov-report/components/login-user/user.repository.ts.html +117 -117
- package/coverage/lcov-report/components/password-hash/index.html +115 -115
- package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +126 -126
- package/coverage/lcov-report/components/system/index.html +130 -130
- package/coverage/lcov-report/components/system/system.repository.ts.html +117 -117
- package/coverage/lcov-report/components/system/system.ts.html +909 -909
- package/coverage/lcov-report/components/system-privilege/index.html +130 -130
- package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +120 -120
- package/coverage/lcov-report/components/system-privilege/system-privilege.ts.html +390 -390
- package/coverage/lcov-report/components/user-group/index.html +130 -130
- package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-group/user-group.ts.html +354 -354
- package/coverage/lcov-report/components/user-object-privilege/index.html +130 -130
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +312 -312
- package/coverage/lcov-report/components/user-privilege/index.html +130 -130
- package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +306 -306
- package/coverage/lcov-report/components/user-system-access/index.html +130 -130
- package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +312 -312
- package/coverage/lcov-report/enum/group-type.enum.ts.html +108 -108
- package/coverage/lcov-report/enum/index.html +160 -160
- package/coverage/lcov-report/enum/index.ts.html +93 -93
- package/coverage/lcov-report/enum/user-status.enum.ts.html +105 -105
- package/coverage/lcov-report/enum/yn.enum.ts.html +96 -96
- package/coverage/lcov-report/index.html +370 -370
- package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +333 -333
- package/coverage/lcov-report/models/group-privilege.entity.ts.html +315 -315
- package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +339 -339
- package/coverage/lcov-report/models/group-system-access.entity.ts.html +324 -324
- package/coverage/lcov-report/models/group.entity.ts.html +435 -435
- package/coverage/lcov-report/models/index.html +310 -310
- package/coverage/lcov-report/models/login-history.entity.ts.html +252 -252
- package/coverage/lcov-report/models/staff.entity.ts.html +411 -411
- package/coverage/lcov-report/models/system-privilege.entity.ts.html +354 -354
- package/coverage/lcov-report/models/system.entity.ts.html +423 -423
- package/coverage/lcov-report/models/user-group.entity.ts.html +354 -354
- package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +330 -330
- package/coverage/lcov-report/models/user-privilege.entity.ts.html +315 -315
- package/coverage/lcov-report/models/user-system-access.entity.ts.html +315 -315
- package/coverage/lcov-report/models/user.entity.ts.html +522 -522
- package/coverage/lcov-report/prettify.css +1 -1
- package/coverage/lcov-report/prettify.js +2 -2
- package/coverage/lcov-report/redis-client/index.html +115 -115
- package/coverage/lcov-report/redis-client/redis.service.ts.html +240 -240
- package/coverage/lcov-report/session/index.html +115 -115
- package/coverage/lcov-report/session/session.service.ts.html +246 -246
- package/coverage/lcov-report/sorter.js +196 -196
- package/coverage/lcov.info +2490 -2490
- package/coverage/test-report.xml +128 -128
- package/create-sso-user.sql +39 -39
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +1 -0
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +71 -0
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +1 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.js +6 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -0
- package/dist/src/components/login-history/index.d.ts +1 -0
- package/dist/src/components/login-history/index.js +1 -0
- package/dist/src/components/login-history/index.js.map +1 -1
- package/dist/src/components/login-history/login-history.d.ts +23 -0
- package/dist/src/components/login-history/login-history.js +88 -0
- package/dist/src/components/login-history/login-history.js.map +1 -0
- package/dist/src/components/login-history/login-history.repository.d.ts +2 -2
- package/dist/src/components/login-history/login-history.repository.js.map +1 -1
- package/dist/src/components/login-user/interfaces/user-info.interface.d.ts +1 -0
- package/dist/src/components/login-user/login-user.js +1 -0
- package/dist/src/components/login-user/login-user.js.map +1 -1
- package/dist/src/components/login-user/user.d.ts +28 -3
- package/dist/src/components/login-user/user.js +357 -14
- package/dist/src/components/login-user/user.js.map +1 -1
- package/dist/src/components/user-system-access/user-system-access.js +1 -1
- package/dist/src/components/user-system-access/user-system-access.js.map +1 -1
- package/dist/src/interfaces/login-history-search-attr.interface.d.ts +8 -0
- package/dist/src/interfaces/login-history-search-attr.interface.js +3 -0
- package/dist/src/interfaces/login-history-search-attr.interface.js.map +1 -0
- package/dist/src/interfaces/login-history.interface.d.ts +11 -0
- package/dist/src/interfaces/login-history.interface.js +3 -0
- package/dist/src/interfaces/login-history.interface.js.map +1 -0
- package/dist/src/models/login-history.entity.d.ts +2 -2
- package/dist/src/models/login-history.entity.js +13 -13
- package/dist/src/models/login-history.entity.js.map +1 -1
- package/dist/src/models/user.entity.d.ts +1 -0
- package/dist/src/models/user.entity.js +8 -0
- package/dist/src/models/user.entity.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eslint.config.mjs +58 -58
- package/jest.config.js +14 -14
- package/migrations/20240314080602-create-user-table.js +124 -124
- package/migrations/20240314080603-create-user-group-table.js +85 -85
- package/migrations/20240314080604-create-user-user-group-table.js +55 -55
- package/migrations/20240314080605-create-login-history-table.js +53 -53
- package/migrations/20240527064925-create-system-table.js +78 -78
- package/migrations/20240527064926-create-system-privilege-table.js +71 -71
- package/migrations/20240527065342-create-group-table.js +93 -93
- package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
- package/migrations/20240528011551-create-group-system-access-table.js +72 -72
- package/migrations/20240528023018-user-system-access-table.js +75 -75
- package/migrations/20240528032229-user-privilege-table.js +76 -76
- package/migrations/20240528063003-create-group-privilege-table.js +76 -76
- package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
- package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
- package/migrations/20240528063108-create-api-key-table.js +85 -85
- package/migrations/20241104104802-create-building-table.js +95 -95
- package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
- package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
- package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
- package/migrations/20250326043818-crate-user-password-history.js +42 -42
- package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -0
- package/package.json +90 -90
- package/sampledotenv +7 -7
- package/src/components/login-history/index.ts +1 -0
- package/src/components/login-history/login-history.repository.ts +4 -4
- package/src/components/login-history/login-history.ts +124 -0
- package/src/components/login-user/interfaces/user-info.interface.ts +1 -0
- package/src/components/login-user/login-user.ts +1 -0
- package/src/components/login-user/user.ts +435 -16
- package/src/components/user-system-access/user-system-access.ts +1 -1
- package/src/interfaces/login-history-search-attr.interface.ts +8 -0
- package/src/interfaces/login-history.interface.ts +11 -0
- package/src/models/login-history.entity.ts +2 -2
- package/src/models/user.entity.ts +7 -0
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +23 -23
- package/sonar-project.properties +0 -23
@@ -1,32 +1,32 @@
|
|
1
|
-
import { PasswordHashService } from "../../../../src/components/password-hash/password-hash.service";
|
2
|
-
|
3
|
-
jest.mock('argon2', () => {
|
4
|
-
return {
|
5
|
-
hash: jest.fn((passowrd) => {
|
6
|
-
return `hash${passowrd}`;
|
7
|
-
}),
|
8
|
-
verify: jest.fn().mockResolvedValue(true)
|
9
|
-
}
|
10
|
-
})
|
11
|
-
|
12
|
-
describe('password-hash.service', () => {
|
13
|
-
const passwordHashService = new PasswordHashService();
|
14
|
-
afterEach(() => {
|
15
|
-
jest.clearAllMocks();
|
16
|
-
});
|
17
|
-
|
18
|
-
it('should return hash password', async () => {
|
19
|
-
const password = 'password';
|
20
|
-
const hash = await passwordHashService.hashPassword(password);
|
21
|
-
expect(hash).toEqual('hashpassword');
|
22
|
-
})
|
23
|
-
|
24
|
-
it('should return true when verify password', async () => {
|
25
|
-
const password = 'password';
|
26
|
-
const hash = 'hashpassword10';
|
27
|
-
const result = await passwordHashService.verify(password, hash);
|
28
|
-
expect(result).toEqual(true);
|
29
|
-
});
|
30
|
-
|
31
|
-
|
1
|
+
import { PasswordHashService } from "../../../../src/components/password-hash/password-hash.service";
|
2
|
+
|
3
|
+
jest.mock('argon2', () => {
|
4
|
+
return {
|
5
|
+
hash: jest.fn((passowrd) => {
|
6
|
+
return `hash${passowrd}`;
|
7
|
+
}),
|
8
|
+
verify: jest.fn().mockResolvedValue(true)
|
9
|
+
}
|
10
|
+
})
|
11
|
+
|
12
|
+
describe('password-hash.service', () => {
|
13
|
+
const passwordHashService = new PasswordHashService();
|
14
|
+
afterEach(() => {
|
15
|
+
jest.clearAllMocks();
|
16
|
+
});
|
17
|
+
|
18
|
+
it('should return hash password', async () => {
|
19
|
+
const password = 'password';
|
20
|
+
const hash = await passwordHashService.hashPassword(password);
|
21
|
+
expect(hash).toEqual('hashpassword');
|
22
|
+
})
|
23
|
+
|
24
|
+
it('should return true when verify password', async () => {
|
25
|
+
const password = 'password';
|
26
|
+
const hash = 'hashpassword10';
|
27
|
+
const result = await passwordHashService.verify(password, hash);
|
28
|
+
expect(result).toEqual(true);
|
29
|
+
});
|
30
|
+
|
31
|
+
|
32
32
|
})
|
@@ -1,255 +1,255 @@
|
|
1
|
-
import { System } from '../../../../src/components/system/system';
|
2
|
-
import { SystemRepository } from '../../../../src/components/system/system.repository';
|
3
|
-
import { LoginUser } from '../../../../src/components/login-user/login-user';
|
4
|
-
import { ClassError } from '@tomei/general';
|
5
|
-
import { ApplicationConfig } from '@tomei/config';
|
6
|
-
|
7
|
-
describe('System', () => {
|
8
|
-
let system: System;
|
9
|
-
let systemRepositoryMock: jest.Mocked<SystemRepository>;
|
10
|
-
let loginUserMock: jest.Mocked<LoginUser>;
|
11
|
-
|
12
|
-
beforeEach(() => {
|
13
|
-
systemRepositoryMock = new SystemRepository() as jest.Mocked<SystemRepository>;
|
14
|
-
loginUserMock = new (LoginUser.prototype as any).constructor() as jest.Mocked<LoginUser>;
|
15
|
-
system = new (System.prototype as any).constructor();
|
16
|
-
});
|
17
|
-
|
18
|
-
afterEach(() => {
|
19
|
-
jest.clearAllMocks();
|
20
|
-
});
|
21
|
-
|
22
|
-
const systemAttr = {
|
23
|
-
SystemCode: 'TEST',
|
24
|
-
Name: 'Test System',
|
25
|
-
Description: 'This is a test system',
|
26
|
-
AccessURL: undefined,
|
27
|
-
GooglePlayURL: undefined,
|
28
|
-
AppleStoreURL: undefined,
|
29
|
-
APIKey: undefined,
|
30
|
-
APISecret: undefined,
|
31
|
-
Status: undefined,
|
32
|
-
CreatedById: 1,
|
33
|
-
CreatedAt: expect.any(Date),
|
34
|
-
UpdatedById: 1,
|
35
|
-
UpdatedAt: expect.any(Date),
|
36
|
-
}
|
37
|
-
|
38
|
-
describe('init', () => {
|
39
|
-
it('should initialize a system when SystemCode is provided', async () => {
|
40
|
-
const dbTransaction = {};
|
41
|
-
const systemCode = 'TEST';
|
42
|
-
const findOneMock = jest
|
43
|
-
.spyOn(SystemRepository.prototype, 'findByPk')
|
44
|
-
.mockResolvedValueOnce({ ...systemAttr } as any);
|
45
|
-
|
46
|
-
const result = await System.init(dbTransaction, systemCode);
|
47
|
-
|
48
|
-
expect(findOneMock).toBeCalledWith(systemCode, {
|
49
|
-
transaction: dbTransaction,
|
50
|
-
});
|
51
|
-
expect(result).toBeInstanceOf(System);
|
52
|
-
});
|
53
|
-
|
54
|
-
it('should throw an error when SystemCode is not found', async () => {
|
55
|
-
const dbTransaction = {};
|
56
|
-
const systemCode = 'TEST';
|
57
|
-
|
58
|
-
jest
|
59
|
-
.spyOn(SystemRepository.prototype, 'findByPk')
|
60
|
-
.mockResolvedValueOnce(null);
|
61
|
-
await expect(System.init(dbTransaction, systemCode)).rejects.toThrow(
|
62
|
-
new ClassError('System', 'SystemErrMsg01', 'Failed To Initialize System')
|
63
|
-
);
|
64
|
-
});
|
65
|
-
|
66
|
-
it('should initialize a new system when SystemCode is not provided', async () => {
|
67
|
-
const dbTransaction = {};
|
68
|
-
|
69
|
-
const result = await System.init(dbTransaction);
|
70
|
-
|
71
|
-
expect(result).toBeInstanceOf(System);
|
72
|
-
});
|
73
|
-
});
|
74
|
-
|
75
|
-
describe('createSystem', () => {
|
76
|
-
const loginUser = new (LoginUser.prototype as any).constructor();
|
77
|
-
const dbTransaction = {};
|
78
|
-
const checkPrivilegesMock = jest.spyOn(LoginUser.prototype, 'checkPrivileges').mockResolvedValue(true);
|
79
|
-
const getComponentConfigMock = jest
|
80
|
-
.spyOn(ApplicationConfig, 'getComponentConfigValue')
|
81
|
-
.mockReturnValue('system-code');
|
82
|
-
|
83
|
-
beforeEach(() => {
|
84
|
-
getComponentConfigMock.mockReturnValue('system-code');
|
85
|
-
checkPrivilegesMock.mockResolvedValue(true);
|
86
|
-
loginUser.ObjectId = '1';
|
87
|
-
});
|
88
|
-
|
89
|
-
const createMock = jest
|
90
|
-
.spyOn(SystemRepository.prototype, 'create')
|
91
|
-
.mockResolvedValue({} as any);
|
92
|
-
|
93
|
-
it('should create a new system', async () => {
|
94
|
-
const createDate = new Date();
|
95
|
-
const system = await System.init(dbTransaction);
|
96
|
-
system.SystemCode = 'TEST';
|
97
|
-
system.Name = 'Test System';
|
98
|
-
system.Description = 'This is a test system';
|
99
|
-
system['_CreatedById'] = 1;
|
100
|
-
system['__CreatedAt'] = createDate;
|
101
|
-
system['__UpdatedById'] = 1;
|
102
|
-
system['__UpdatedAt'] = createDate;
|
103
|
-
|
104
|
-
await system.createSystem(loginUser, dbTransaction);
|
105
|
-
|
106
|
-
expect(checkPrivilegesMock).toBeCalledWith('system-code', 'System - Create');
|
107
|
-
expect(createMock).toBeCalledWith(
|
108
|
-
{
|
109
|
-
SystemCode: 'TEST',
|
110
|
-
Name: 'Test System',
|
111
|
-
Description: 'This is a test system',
|
112
|
-
AccessURL: undefined,
|
113
|
-
GooglePlayURL: undefined,
|
114
|
-
AppleStoreURL: undefined,
|
115
|
-
APIKey: undefined,
|
116
|
-
APISecret: undefined,
|
117
|
-
Status: undefined,
|
118
|
-
CreatedById: 1,
|
119
|
-
CreatedAt: expect.any(Date),
|
120
|
-
UpdatedById: 1,
|
121
|
-
UpdatedAt: expect.any(Date),
|
122
|
-
}, {
|
123
|
-
transaction: dbTransaction,
|
124
|
-
});
|
125
|
-
});
|
126
|
-
|
127
|
-
it('should throw an error when user does not have permission', async () => {
|
128
|
-
loginUser.checkPrivileges.mockResolvedValue(false);
|
129
|
-
|
130
|
-
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
131
|
-
new Error('You do not have permission to list UserGroup.')
|
132
|
-
);
|
133
|
-
});
|
134
|
-
|
135
|
-
it('should throw an error when SystemCode is missing', async () => {
|
136
|
-
system.Name = 'Test System';
|
137
|
-
system.Description = 'This is a test system';
|
138
|
-
|
139
|
-
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
140
|
-
new ClassError('System', 'SystemErrMsg02', 'SystemCode must have value.')
|
141
|
-
);
|
142
|
-
});
|
143
|
-
|
144
|
-
it('should throw an error when Name is missing', async () => {
|
145
|
-
system.SystemCode = 'TEST';
|
146
|
-
system.Description = 'This is a test system';
|
147
|
-
|
148
|
-
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
149
|
-
new ClassError('System', 'SystemErrMsg03', 'Name must have value.')
|
150
|
-
);
|
151
|
-
});
|
152
|
-
|
153
|
-
it('should throw an error when Description is missing', async () => {
|
154
|
-
system.SystemCode = 'TEST';
|
155
|
-
system.Name = 'Test System';
|
156
|
-
|
157
|
-
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
158
|
-
new ClassError('System', 'SystemErrMsg04', 'Description must have value.')
|
159
|
-
);
|
160
|
-
});
|
161
|
-
|
162
|
-
it('should throw an error when failed to create system', async () => {
|
163
|
-
system.SystemCode = 'TEST';
|
164
|
-
system.Name = 'Test System';
|
165
|
-
system.Description = 'This is a test system';
|
166
|
-
|
167
|
-
systemRepositoryMock.create.mockRejectedValueOnce(new Error());
|
168
|
-
|
169
|
-
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
170
|
-
new Error()
|
171
|
-
);
|
172
|
-
});
|
173
|
-
});
|
174
|
-
|
175
|
-
describe('setSystemCode', () => {
|
176
|
-
const dbTransaction = {};
|
177
|
-
const systemRepositoryMock = jest.spyOn(SystemRepository.prototype, 'findOne');
|
178
|
-
beforeEach(() => {
|
179
|
-
systemRepositoryMock.mockResolvedValue(null);
|
180
|
-
});
|
181
|
-
|
182
|
-
it('should set the SystemCode when there is no duplicate', async () => {
|
183
|
-
const systemCode = 'TEST';
|
184
|
-
|
185
|
-
await system.setSystemCode(dbTransaction, systemCode);
|
186
|
-
|
187
|
-
expect(systemRepositoryMock).toBeCalledWith({
|
188
|
-
where: {
|
189
|
-
SystemCode: systemCode,
|
190
|
-
},
|
191
|
-
transaction: dbTransaction,
|
192
|
-
});
|
193
|
-
expect(system.SystemCode).toBe(systemCode);
|
194
|
-
});
|
195
|
-
|
196
|
-
it('should throw an error when SystemCode already exists', async () => {
|
197
|
-
const systemCode = 'TEST';
|
198
|
-
|
199
|
-
systemRepositoryMock.mockResolvedValue({} as any);
|
200
|
-
|
201
|
-
await expect(system.setSystemCode(dbTransaction, systemCode)).rejects.toThrow(
|
202
|
-
new ClassError('System', 'SystemErrMsg05', 'System Code already exists.')
|
203
|
-
);
|
204
|
-
});
|
205
|
-
|
206
|
-
it('should throw an error when failed to check duplicate SystemCode', async () => {
|
207
|
-
const systemCode = 'TEST';
|
208
|
-
|
209
|
-
systemRepositoryMock.mockRejectedValueOnce(new Error());
|
210
|
-
|
211
|
-
await expect(system.setSystemCode(dbTransaction, systemCode)).rejects.toThrow(
|
212
|
-
new Error()
|
213
|
-
);
|
214
|
-
});
|
215
|
-
});
|
216
|
-
|
217
|
-
describe('findAll', () => {
|
218
|
-
const loginUser = new (LoginUser.prototype as any).constructor();
|
219
|
-
const dbTransaction = {};
|
220
|
-
|
221
|
-
it('should find all systems based on filter', async () => {
|
222
|
-
const page = 1;
|
223
|
-
const rows = 10;
|
224
|
-
const search = { Name: 'exampleName' };
|
225
|
-
const findAllWithPaginationSpy = jest.spyOn(System['_Repo'], 'findAllWithPagination').mockResolvedValueOnce({
|
226
|
-
count: 1,
|
227
|
-
rows: [{} as any],
|
228
|
-
});
|
229
|
-
|
230
|
-
const result = await System.findAll(dbTransaction, loginUser, page, rows, search);
|
231
|
-
|
232
|
-
expect(result.count).toBe(1);
|
233
|
-
expect(result.systems).toHaveLength(1);
|
234
|
-
expect(result.systems[0]).toBeInstanceOf(System);
|
235
|
-
});
|
236
|
-
|
237
|
-
it('should find all systems without pagination when page and rows are not provided', async () => {
|
238
|
-
const findAllWithPaginationSpy = jest.spyOn(System['_Repo'], 'findAllWithPagination').mockResolvedValueOnce({
|
239
|
-
count: 1,
|
240
|
-
rows: [{} as any],
|
241
|
-
});
|
242
|
-
|
243
|
-
const result = await System.findAll(dbTransaction, loginUser);
|
244
|
-
|
245
|
-
expect(findAllWithPaginationSpy).toHaveBeenCalledWith({
|
246
|
-
where: {},
|
247
|
-
order: [['CreatedAt', 'DESC']],
|
248
|
-
transaction: dbTransaction,
|
249
|
-
});
|
250
|
-
expect(result.count).toBe(1);
|
251
|
-
expect(result.systems).toHaveLength(1);
|
252
|
-
expect(result.systems[0]).toBeInstanceOf(System);
|
253
|
-
});
|
254
|
-
});
|
1
|
+
import { System } from '../../../../src/components/system/system';
|
2
|
+
import { SystemRepository } from '../../../../src/components/system/system.repository';
|
3
|
+
import { LoginUser } from '../../../../src/components/login-user/login-user';
|
4
|
+
import { ClassError } from '@tomei/general';
|
5
|
+
import { ApplicationConfig } from '@tomei/config';
|
6
|
+
|
7
|
+
describe('System', () => {
|
8
|
+
let system: System;
|
9
|
+
let systemRepositoryMock: jest.Mocked<SystemRepository>;
|
10
|
+
let loginUserMock: jest.Mocked<LoginUser>;
|
11
|
+
|
12
|
+
beforeEach(() => {
|
13
|
+
systemRepositoryMock = new SystemRepository() as jest.Mocked<SystemRepository>;
|
14
|
+
loginUserMock = new (LoginUser.prototype as any).constructor() as jest.Mocked<LoginUser>;
|
15
|
+
system = new (System.prototype as any).constructor();
|
16
|
+
});
|
17
|
+
|
18
|
+
afterEach(() => {
|
19
|
+
jest.clearAllMocks();
|
20
|
+
});
|
21
|
+
|
22
|
+
const systemAttr = {
|
23
|
+
SystemCode: 'TEST',
|
24
|
+
Name: 'Test System',
|
25
|
+
Description: 'This is a test system',
|
26
|
+
AccessURL: undefined,
|
27
|
+
GooglePlayURL: undefined,
|
28
|
+
AppleStoreURL: undefined,
|
29
|
+
APIKey: undefined,
|
30
|
+
APISecret: undefined,
|
31
|
+
Status: undefined,
|
32
|
+
CreatedById: 1,
|
33
|
+
CreatedAt: expect.any(Date),
|
34
|
+
UpdatedById: 1,
|
35
|
+
UpdatedAt: expect.any(Date),
|
36
|
+
}
|
37
|
+
|
38
|
+
describe('init', () => {
|
39
|
+
it('should initialize a system when SystemCode is provided', async () => {
|
40
|
+
const dbTransaction = {};
|
41
|
+
const systemCode = 'TEST';
|
42
|
+
const findOneMock = jest
|
43
|
+
.spyOn(SystemRepository.prototype, 'findByPk')
|
44
|
+
.mockResolvedValueOnce({ ...systemAttr } as any);
|
45
|
+
|
46
|
+
const result = await System.init(dbTransaction, systemCode);
|
47
|
+
|
48
|
+
expect(findOneMock).toBeCalledWith(systemCode, {
|
49
|
+
transaction: dbTransaction,
|
50
|
+
});
|
51
|
+
expect(result).toBeInstanceOf(System);
|
52
|
+
});
|
53
|
+
|
54
|
+
it('should throw an error when SystemCode is not found', async () => {
|
55
|
+
const dbTransaction = {};
|
56
|
+
const systemCode = 'TEST';
|
57
|
+
|
58
|
+
jest
|
59
|
+
.spyOn(SystemRepository.prototype, 'findByPk')
|
60
|
+
.mockResolvedValueOnce(null);
|
61
|
+
await expect(System.init(dbTransaction, systemCode)).rejects.toThrow(
|
62
|
+
new ClassError('System', 'SystemErrMsg01', 'Failed To Initialize System')
|
63
|
+
);
|
64
|
+
});
|
65
|
+
|
66
|
+
it('should initialize a new system when SystemCode is not provided', async () => {
|
67
|
+
const dbTransaction = {};
|
68
|
+
|
69
|
+
const result = await System.init(dbTransaction);
|
70
|
+
|
71
|
+
expect(result).toBeInstanceOf(System);
|
72
|
+
});
|
73
|
+
});
|
74
|
+
|
75
|
+
describe('createSystem', () => {
|
76
|
+
const loginUser = new (LoginUser.prototype as any).constructor();
|
77
|
+
const dbTransaction = {};
|
78
|
+
const checkPrivilegesMock = jest.spyOn(LoginUser.prototype, 'checkPrivileges').mockResolvedValue(true);
|
79
|
+
const getComponentConfigMock = jest
|
80
|
+
.spyOn(ApplicationConfig, 'getComponentConfigValue')
|
81
|
+
.mockReturnValue('system-code');
|
82
|
+
|
83
|
+
beforeEach(() => {
|
84
|
+
getComponentConfigMock.mockReturnValue('system-code');
|
85
|
+
checkPrivilegesMock.mockResolvedValue(true);
|
86
|
+
loginUser.ObjectId = '1';
|
87
|
+
});
|
88
|
+
|
89
|
+
const createMock = jest
|
90
|
+
.spyOn(SystemRepository.prototype, 'create')
|
91
|
+
.mockResolvedValue({} as any);
|
92
|
+
|
93
|
+
it('should create a new system', async () => {
|
94
|
+
const createDate = new Date();
|
95
|
+
const system = await System.init(dbTransaction);
|
96
|
+
system.SystemCode = 'TEST';
|
97
|
+
system.Name = 'Test System';
|
98
|
+
system.Description = 'This is a test system';
|
99
|
+
system['_CreatedById'] = 1;
|
100
|
+
system['__CreatedAt'] = createDate;
|
101
|
+
system['__UpdatedById'] = 1;
|
102
|
+
system['__UpdatedAt'] = createDate;
|
103
|
+
|
104
|
+
await system.createSystem(loginUser, dbTransaction);
|
105
|
+
|
106
|
+
expect(checkPrivilegesMock).toBeCalledWith('system-code', 'System - Create');
|
107
|
+
expect(createMock).toBeCalledWith(
|
108
|
+
{
|
109
|
+
SystemCode: 'TEST',
|
110
|
+
Name: 'Test System',
|
111
|
+
Description: 'This is a test system',
|
112
|
+
AccessURL: undefined,
|
113
|
+
GooglePlayURL: undefined,
|
114
|
+
AppleStoreURL: undefined,
|
115
|
+
APIKey: undefined,
|
116
|
+
APISecret: undefined,
|
117
|
+
Status: undefined,
|
118
|
+
CreatedById: 1,
|
119
|
+
CreatedAt: expect.any(Date),
|
120
|
+
UpdatedById: 1,
|
121
|
+
UpdatedAt: expect.any(Date),
|
122
|
+
}, {
|
123
|
+
transaction: dbTransaction,
|
124
|
+
});
|
125
|
+
});
|
126
|
+
|
127
|
+
it('should throw an error when user does not have permission', async () => {
|
128
|
+
loginUser.checkPrivileges.mockResolvedValue(false);
|
129
|
+
|
130
|
+
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
131
|
+
new Error('You do not have permission to list UserGroup.')
|
132
|
+
);
|
133
|
+
});
|
134
|
+
|
135
|
+
it('should throw an error when SystemCode is missing', async () => {
|
136
|
+
system.Name = 'Test System';
|
137
|
+
system.Description = 'This is a test system';
|
138
|
+
|
139
|
+
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
140
|
+
new ClassError('System', 'SystemErrMsg02', 'SystemCode must have value.')
|
141
|
+
);
|
142
|
+
});
|
143
|
+
|
144
|
+
it('should throw an error when Name is missing', async () => {
|
145
|
+
system.SystemCode = 'TEST';
|
146
|
+
system.Description = 'This is a test system';
|
147
|
+
|
148
|
+
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
149
|
+
new ClassError('System', 'SystemErrMsg03', 'Name must have value.')
|
150
|
+
);
|
151
|
+
});
|
152
|
+
|
153
|
+
it('should throw an error when Description is missing', async () => {
|
154
|
+
system.SystemCode = 'TEST';
|
155
|
+
system.Name = 'Test System';
|
156
|
+
|
157
|
+
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
158
|
+
new ClassError('System', 'SystemErrMsg04', 'Description must have value.')
|
159
|
+
);
|
160
|
+
});
|
161
|
+
|
162
|
+
it('should throw an error when failed to create system', async () => {
|
163
|
+
system.SystemCode = 'TEST';
|
164
|
+
system.Name = 'Test System';
|
165
|
+
system.Description = 'This is a test system';
|
166
|
+
|
167
|
+
systemRepositoryMock.create.mockRejectedValueOnce(new Error());
|
168
|
+
|
169
|
+
await expect(system.createSystem(loginUser, dbTransaction)).rejects.toThrow(
|
170
|
+
new Error()
|
171
|
+
);
|
172
|
+
});
|
173
|
+
});
|
174
|
+
|
175
|
+
describe('setSystemCode', () => {
|
176
|
+
const dbTransaction = {};
|
177
|
+
const systemRepositoryMock = jest.spyOn(SystemRepository.prototype, 'findOne');
|
178
|
+
beforeEach(() => {
|
179
|
+
systemRepositoryMock.mockResolvedValue(null);
|
180
|
+
});
|
181
|
+
|
182
|
+
it('should set the SystemCode when there is no duplicate', async () => {
|
183
|
+
const systemCode = 'TEST';
|
184
|
+
|
185
|
+
await system.setSystemCode(dbTransaction, systemCode);
|
186
|
+
|
187
|
+
expect(systemRepositoryMock).toBeCalledWith({
|
188
|
+
where: {
|
189
|
+
SystemCode: systemCode,
|
190
|
+
},
|
191
|
+
transaction: dbTransaction,
|
192
|
+
});
|
193
|
+
expect(system.SystemCode).toBe(systemCode);
|
194
|
+
});
|
195
|
+
|
196
|
+
it('should throw an error when SystemCode already exists', async () => {
|
197
|
+
const systemCode = 'TEST';
|
198
|
+
|
199
|
+
systemRepositoryMock.mockResolvedValue({} as any);
|
200
|
+
|
201
|
+
await expect(system.setSystemCode(dbTransaction, systemCode)).rejects.toThrow(
|
202
|
+
new ClassError('System', 'SystemErrMsg05', 'System Code already exists.')
|
203
|
+
);
|
204
|
+
});
|
205
|
+
|
206
|
+
it('should throw an error when failed to check duplicate SystemCode', async () => {
|
207
|
+
const systemCode = 'TEST';
|
208
|
+
|
209
|
+
systemRepositoryMock.mockRejectedValueOnce(new Error());
|
210
|
+
|
211
|
+
await expect(system.setSystemCode(dbTransaction, systemCode)).rejects.toThrow(
|
212
|
+
new Error()
|
213
|
+
);
|
214
|
+
});
|
215
|
+
});
|
216
|
+
|
217
|
+
describe('findAll', () => {
|
218
|
+
const loginUser = new (LoginUser.prototype as any).constructor();
|
219
|
+
const dbTransaction = {};
|
220
|
+
|
221
|
+
it('should find all systems based on filter', async () => {
|
222
|
+
const page = 1;
|
223
|
+
const rows = 10;
|
224
|
+
const search = { Name: 'exampleName' };
|
225
|
+
const findAllWithPaginationSpy = jest.spyOn(System['_Repo'], 'findAllWithPagination').mockResolvedValueOnce({
|
226
|
+
count: 1,
|
227
|
+
rows: [{} as any],
|
228
|
+
});
|
229
|
+
|
230
|
+
const result = await System.findAll(dbTransaction, loginUser, page, rows, search);
|
231
|
+
|
232
|
+
expect(result.count).toBe(1);
|
233
|
+
expect(result.systems).toHaveLength(1);
|
234
|
+
expect(result.systems[0]).toBeInstanceOf(System);
|
235
|
+
});
|
236
|
+
|
237
|
+
it('should find all systems without pagination when page and rows are not provided', async () => {
|
238
|
+
const findAllWithPaginationSpy = jest.spyOn(System['_Repo'], 'findAllWithPagination').mockResolvedValueOnce({
|
239
|
+
count: 1,
|
240
|
+
rows: [{} as any],
|
241
|
+
});
|
242
|
+
|
243
|
+
const result = await System.findAll(dbTransaction, loginUser);
|
244
|
+
|
245
|
+
expect(findAllWithPaginationSpy).toHaveBeenCalledWith({
|
246
|
+
where: {},
|
247
|
+
order: [['CreatedAt', 'DESC']],
|
248
|
+
transaction: dbTransaction,
|
249
|
+
});
|
250
|
+
expect(result.count).toBe(1);
|
251
|
+
expect(result.systems).toHaveLength(1);
|
252
|
+
expect(result.systems[0]).toBeInstanceOf(System);
|
253
|
+
});
|
254
|
+
});
|
255
255
|
});
|