@tomei/sso 0.62.0 → 0.64.0-dev.1

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.
Files changed (177) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.gitlab-ci.yml +16 -16
  3. package/.husky/commit-msg +9 -15
  4. package/.husky/pre-commit +7 -7
  5. package/.prettierrc +4 -4
  6. package/Jenkinsfile +57 -57
  7. package/README.md +23 -23
  8. package/__tests__/unit/components/group/group.spec.ts +79 -79
  9. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  10. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  11. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
  12. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  13. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  14. package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
  15. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  16. package/__tests__/unit/components/system/system.spec.ts +254 -254
  17. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  18. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  19. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  20. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  21. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  22. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  23. package/__tests__/unit/session/session.service.spec.ts +47 -47
  24. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  25. package/create-sso-user.sql +39 -39
  26. package/dist/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.js +1 -1
  27. package/dist/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.js.map +1 -1
  28. package/dist/__tests__/unit/components/group-privilege/group-privilege.spec.js +2 -2
  29. package/dist/__tests__/unit/components/group-privilege/group-privilege.spec.js.map +1 -1
  30. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +1 -0
  31. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +71 -0
  32. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +1 -0
  33. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js +2 -2
  34. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js.map +1 -1
  35. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  36. package/dist/__tests__/unit/components/login-user/login-user.spec.js +6 -0
  37. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -0
  38. package/dist/__tests__/unit/components/system/system.spec.js +4 -4
  39. package/dist/__tests__/unit/components/system/system.spec.js.map +1 -1
  40. package/dist/__tests__/unit/session/session.service.spec.js +2 -2
  41. package/dist/__tests__/unit/session/session.service.spec.js.map +1 -1
  42. package/dist/src/components/login-history/index.d.ts +1 -0
  43. package/dist/src/components/login-history/index.js +1 -0
  44. package/dist/src/components/login-history/index.js.map +1 -1
  45. package/dist/src/components/login-history/login-history.repository.d.ts +2 -2
  46. package/dist/src/components/login-history/login-history.repository.js.map +1 -1
  47. package/dist/src/components/login-user/interfaces/user-info.interface.d.ts +1 -0
  48. package/dist/src/components/login-user/login-user.js +1 -0
  49. package/dist/src/components/login-user/login-user.js.map +1 -1
  50. package/dist/src/components/login-user/user.d.ts +28 -3
  51. package/dist/src/components/login-user/user.js +363 -25
  52. package/dist/src/components/login-user/user.js.map +1 -1
  53. package/dist/src/components/user-system-access/user-system-access.js +1 -1
  54. package/dist/src/components/user-system-access/user-system-access.js.map +1 -1
  55. package/dist/src/models/login-history.entity.d.ts +2 -2
  56. package/dist/src/models/login-history.entity.js +13 -13
  57. package/dist/src/models/login-history.entity.js.map +1 -1
  58. package/dist/src/models/user.entity.d.ts +1 -0
  59. package/dist/src/models/user.entity.js +8 -0
  60. package/dist/src/models/user.entity.js.map +1 -1
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/eslint.config.mjs +58 -58
  63. package/jest.config.js +14 -14
  64. package/migrations/20240314080602-create-user-table.js +124 -124
  65. package/migrations/20240314080603-create-user-group-table.js +85 -85
  66. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  67. package/migrations/20240314080605-create-login-history-table.js +53 -53
  68. package/migrations/20240527064925-create-system-table.js +78 -78
  69. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  70. package/migrations/20240527065342-create-group-table.js +93 -93
  71. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  72. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  73. package/migrations/20240528023018-user-system-access-table.js +75 -75
  74. package/migrations/20240528032229-user-privilege-table.js +76 -76
  75. package/migrations/20240528063003-create-group-privilege-table.js +76 -76
  76. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  77. package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
  78. package/migrations/20240528063108-create-api-key-table.js +85 -85
  79. package/migrations/20241104104802-create-building-table.js +95 -95
  80. package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
  81. package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
  82. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
  83. package/migrations/20250326043818-crate-user-password-history.js +42 -42
  84. package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -0
  85. package/migrations/20250805085707-add-bulk-approval-code-to-sso-user.js +29 -0
  86. package/package.json +87 -90
  87. package/sampledotenv +7 -7
  88. package/src/components/login-history/index.ts +1 -0
  89. package/src/components/login-history/login-history.repository.ts +4 -4
  90. package/src/components/login-history/login-history.ts +124 -0
  91. package/src/components/login-user/interfaces/user-info.interface.ts +1 -0
  92. package/src/components/login-user/login-user.ts +1 -0
  93. package/src/components/login-user/user.ts +441 -27
  94. package/src/components/user-system-access/user-system-access.ts +1 -1
  95. package/src/interfaces/login-history-search-attr.interface.ts +8 -0
  96. package/src/interfaces/login-history.interface.ts +11 -0
  97. package/src/models/login-history.entity.ts +2 -2
  98. package/src/models/user.entity.ts +7 -0
  99. package/tsconfig.build.json +5 -5
  100. package/tsconfig.json +23 -23
  101. package/coverage/clover.xml +0 -1452
  102. package/coverage/coverage-final.json +0 -47
  103. package/coverage/lcov-report/base.css +0 -224
  104. package/coverage/lcov-report/block-navigation.js +0 -87
  105. package/coverage/lcov-report/components/group/group.repository.ts.html +0 -118
  106. package/coverage/lcov-report/components/group/group.ts.html +0 -328
  107. package/coverage/lcov-report/components/group/index.html +0 -131
  108. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +0 -118
  109. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +0 -322
  110. package/coverage/lcov-report/components/group-object-privilege/index.html +0 -131
  111. package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +0 -118
  112. package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +0 -304
  113. package/coverage/lcov-report/components/group-privilege/index.html +0 -131
  114. package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.repository.ts.html +0 -118
  115. package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.ts.html +0 -328
  116. package/coverage/lcov-report/components/group-reporting-user/index.html +0 -131
  117. package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +0 -118
  118. package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +0 -310
  119. package/coverage/lcov-report/components/group-system-access/index.html +0 -131
  120. package/coverage/lcov-report/components/login-history/index.html +0 -116
  121. package/coverage/lcov-report/components/login-history/login-history.repository.ts.html +0 -118
  122. package/coverage/lcov-report/components/login-user/index.html +0 -131
  123. package/coverage/lcov-report/components/login-user/login-user.ts.html +0 -5008
  124. package/coverage/lcov-report/components/login-user/user.repository.ts.html +0 -118
  125. package/coverage/lcov-report/components/password-hash/index.html +0 -116
  126. package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +0 -127
  127. package/coverage/lcov-report/components/system/index.html +0 -131
  128. package/coverage/lcov-report/components/system/system.repository.ts.html +0 -118
  129. package/coverage/lcov-report/components/system/system.ts.html +0 -910
  130. package/coverage/lcov-report/components/system-privilege/index.html +0 -131
  131. package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +0 -121
  132. package/coverage/lcov-report/components/system-privilege/system-privilege.ts.html +0 -391
  133. package/coverage/lcov-report/components/user-group/index.html +0 -131
  134. package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +0 -118
  135. package/coverage/lcov-report/components/user-group/user-group.ts.html +0 -355
  136. package/coverage/lcov-report/components/user-object-privilege/index.html +0 -131
  137. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +0 -118
  138. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +0 -313
  139. package/coverage/lcov-report/components/user-privilege/index.html +0 -131
  140. package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +0 -118
  141. package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +0 -307
  142. package/coverage/lcov-report/components/user-system-access/index.html +0 -131
  143. package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +0 -118
  144. package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +0 -313
  145. package/coverage/lcov-report/enum/group-type.enum.ts.html +0 -109
  146. package/coverage/lcov-report/enum/index.html +0 -161
  147. package/coverage/lcov-report/enum/index.ts.html +0 -94
  148. package/coverage/lcov-report/enum/user-status.enum.ts.html +0 -106
  149. package/coverage/lcov-report/enum/yn.enum.ts.html +0 -97
  150. package/coverage/lcov-report/favicon.png +0 -0
  151. package/coverage/lcov-report/index.html +0 -371
  152. package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +0 -334
  153. package/coverage/lcov-report/models/group-privilege.entity.ts.html +0 -316
  154. package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +0 -340
  155. package/coverage/lcov-report/models/group-system-access.entity.ts.html +0 -325
  156. package/coverage/lcov-report/models/group.entity.ts.html +0 -436
  157. package/coverage/lcov-report/models/index.html +0 -311
  158. package/coverage/lcov-report/models/login-history.entity.ts.html +0 -253
  159. package/coverage/lcov-report/models/staff.entity.ts.html +0 -412
  160. package/coverage/lcov-report/models/system-privilege.entity.ts.html +0 -355
  161. package/coverage/lcov-report/models/system.entity.ts.html +0 -424
  162. package/coverage/lcov-report/models/user-group.entity.ts.html +0 -355
  163. package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +0 -331
  164. package/coverage/lcov-report/models/user-privilege.entity.ts.html +0 -316
  165. package/coverage/lcov-report/models/user-system-access.entity.ts.html +0 -316
  166. package/coverage/lcov-report/models/user.entity.ts.html +0 -523
  167. package/coverage/lcov-report/prettify.css +0 -1
  168. package/coverage/lcov-report/prettify.js +0 -2
  169. package/coverage/lcov-report/redis-client/index.html +0 -116
  170. package/coverage/lcov-report/redis-client/redis.service.ts.html +0 -241
  171. package/coverage/lcov-report/session/index.html +0 -116
  172. package/coverage/lcov-report/session/session.service.ts.html +0 -247
  173. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  174. package/coverage/lcov-report/sorter.js +0 -196
  175. package/coverage/lcov.info +0 -2490
  176. package/coverage/test-report.xml +0 -129
  177. 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).toHaveBeenCalledWith(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).toHaveBeenCalledWith('system-code', 'System - Create');
107
+ expect(createMock).toHaveBeenCalledWith(
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).toHaveBeenCalledWith({
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
  });