@tomei/sso 0.64.1 → 0.65.1-test.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 (147) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.gitlab-ci.yml +237 -16
  3. package/.husky/commit-msg +15 -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/api-key/api-key.spec.ts +201 -0
  9. package/__tests__/unit/components/group/group.spec.ts +85 -79
  10. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  11. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  12. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +74 -66
  13. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  14. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  15. package/__tests__/unit/components/login-user/login.spec.ts +2358 -1164
  16. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  17. package/__tests__/unit/components/system/system.spec.ts +255 -254
  18. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  19. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  20. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  21. package/__tests__/unit/components/user-password-history/user-password-history.spec.ts +165 -0
  22. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  23. package/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.ts +233 -0
  24. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  25. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  26. package/__tests__/unit/session/session.service.spec.ts +47 -47
  27. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  28. package/coverage/cobertura-coverage.xml +6837 -0
  29. package/coverage/test-report.xml +130 -40
  30. package/create-sso-user.sql +39 -39
  31. package/dist/__tests__/unit/components/{group-privilege/group-privilege.test.d.ts → api-key/api-key.spec.d.ts} +1 -1
  32. package/dist/__tests__/unit/components/api-key/api-key.spec.js +158 -0
  33. package/dist/__tests__/unit/components/api-key/api-key.spec.js.map +1 -0
  34. package/dist/__tests__/unit/components/group/group.spec.js +4 -0
  35. package/dist/__tests__/unit/components/group/group.spec.js.map +1 -1
  36. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js +9 -1
  37. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js.map +1 -1
  38. package/dist/__tests__/unit/components/login-user/login.spec.js +703 -0
  39. package/dist/__tests__/unit/components/login-user/login.spec.js.map +1 -1
  40. package/dist/__tests__/unit/components/system/system.spec.js +1 -0
  41. package/dist/__tests__/unit/components/system/system.spec.js.map +1 -1
  42. package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.d.ts +1 -0
  43. package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js +138 -0
  44. package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js.map +1 -0
  45. package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.d.ts +1 -0
  46. package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js +182 -0
  47. package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js.map +1 -0
  48. package/dist/src/components/login-user/user.js +1 -1
  49. package/dist/src/components/login-user/user.js.map +1 -1
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/eslint.config.mjs +58 -58
  52. package/jest.config.js +16 -14
  53. package/migrations/20240314080602-create-user-table.js +124 -124
  54. package/migrations/20240314080603-create-user-group-table.js +85 -85
  55. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  56. package/migrations/20240314080605-create-login-history-table.js +53 -53
  57. package/migrations/20240527064925-create-system-table.js +78 -78
  58. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  59. package/migrations/20240527065342-create-group-table.js +93 -93
  60. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  61. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  62. package/migrations/20240528023018-user-system-access-table.js +75 -75
  63. package/migrations/20240528032229-user-privilege-table.js +76 -76
  64. package/migrations/20240528063003-create-group-privilege-table.js +76 -76
  65. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  66. package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
  67. package/migrations/20240528063108-create-api-key-table.js +85 -85
  68. package/migrations/20241104104802-create-building-table.js +95 -95
  69. package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
  70. package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
  71. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
  72. package/migrations/20250326043818-crate-user-password-history.js +42 -42
  73. package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -30
  74. package/migrations/20250805085707-add-bulk-approval-code-to-sso-user.js +29 -0
  75. package/package.json +87 -87
  76. package/sampledotenv +7 -7
  77. package/src/components/login-user/user.ts +1 -1
  78. package/tsconfig.build.json +5 -5
  79. package/tsconfig.json +23 -23
  80. package/coverage/clover.xml +0 -1380
  81. package/coverage/coverage-final.json +0 -39
  82. package/coverage/lcov-report/base.css +0 -224
  83. package/coverage/lcov-report/block-navigation.js +0 -87
  84. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +0 -160
  85. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +0 -919
  86. package/coverage/lcov-report/components/group-object-privilege/index.html +0 -131
  87. package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +0 -172
  88. package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +0 -337
  89. package/coverage/lcov-report/components/group-privilege/index.html +0 -131
  90. package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +0 -214
  91. package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +0 -355
  92. package/coverage/lcov-report/components/group-system-access/index.html +0 -131
  93. package/coverage/lcov-report/components/password-hash/index.html +0 -116
  94. package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +0 -127
  95. package/coverage/lcov-report/components/system-privilege/index.html +0 -116
  96. package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +0 -139
  97. package/coverage/lcov-report/components/user-group/index.html +0 -131
  98. package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +0 -142
  99. package/coverage/lcov-report/components/user-group/user-group.ts.html +0 -2377
  100. package/coverage/lcov-report/components/user-object-privilege/index.html +0 -131
  101. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +0 -118
  102. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +0 -322
  103. package/coverage/lcov-report/components/user-privilege/index.html +0 -131
  104. package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +0 -160
  105. package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +0 -2071
  106. package/coverage/lcov-report/components/user-system-access/index.html +0 -131
  107. package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +0 -208
  108. package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +0 -2236
  109. package/coverage/lcov-report/enum/api-key.enum.ts.html +0 -100
  110. package/coverage/lcov-report/enum/group-type.enum.ts.html +0 -109
  111. package/coverage/lcov-report/enum/index.html +0 -206
  112. package/coverage/lcov-report/enum/index.ts.html +0 -103
  113. package/coverage/lcov-report/enum/login-status.enum.ts.html +0 -97
  114. package/coverage/lcov-report/enum/object-status.enum.ts.html +0 -97
  115. package/coverage/lcov-report/enum/user-status.enum.ts.html +0 -106
  116. package/coverage/lcov-report/enum/yn.enum.ts.html +0 -97
  117. package/coverage/lcov-report/favicon.png +0 -0
  118. package/coverage/lcov-report/index.html +0 -296
  119. package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +0 -358
  120. package/coverage/lcov-report/models/group-privilege.entity.ts.html +0 -319
  121. package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +0 -370
  122. package/coverage/lcov-report/models/group-system-access.entity.ts.html +0 -328
  123. package/coverage/lcov-report/models/group.entity.ts.html +0 -466
  124. package/coverage/lcov-report/models/index.html +0 -296
  125. package/coverage/lcov-report/models/staff.entity.ts.html +0 -358
  126. package/coverage/lcov-report/models/system-privilege.entity.ts.html +0 -355
  127. package/coverage/lcov-report/models/system.entity.ts.html +0 -424
  128. package/coverage/lcov-report/models/user-group.entity.ts.html +0 -358
  129. package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +0 -355
  130. package/coverage/lcov-report/models/user-privilege.entity.ts.html +0 -319
  131. package/coverage/lcov-report/models/user-system-access.entity.ts.html +0 -346
  132. package/coverage/lcov-report/models/user.entity.ts.html +0 -685
  133. package/coverage/lcov-report/prettify.css +0 -1
  134. package/coverage/lcov-report/prettify.js +0 -2
  135. package/coverage/lcov-report/redis-client/index.html +0 -116
  136. package/coverage/lcov-report/redis-client/redis.service.ts.html +0 -310
  137. package/coverage/lcov-report/session/index.html +0 -116
  138. package/coverage/lcov-report/session/session.service.ts.html +0 -373
  139. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  140. package/coverage/lcov-report/sorter.js +0 -210
  141. package/coverage/lcov.info +0 -2223
  142. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
  143. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
  144. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  145. package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
  146. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
  147. package/sonar-project.properties +0 -23
@@ -1,84 +1,84 @@
1
- import { SystemPrivilege } from '../../../../src/components/system-privilege/system-privilege';
2
- import { SystemPrivilegeRepository } from '../../../../src/components/system-privilege/system-privilege.repository';
3
- import { ClassError } from '@tomei/general';
4
-
5
- describe('SystemPrivilege', () => {
6
- let systemPrivilege: SystemPrivilege;
7
- const systemPrivilegeAttr = {
8
- PrivilegeCode: 'test',
9
- SystemCode: 'test',
10
- Name: 'test',
11
- Description: 'test',
12
- Status: 'test',
13
- CreatedById: 1,
14
- CreatedAt: new Date(),
15
- UpdatedById: 1,
16
- UpdatedAt: new Date(),
17
- };
18
-
19
- beforeEach(() => {
20
- jest.resetAllMocks();
21
- });
22
-
23
- describe('constructor', () => {
24
- it('should create a new SystemPrivilege instance', () => {
25
- systemPrivilege = new (SystemPrivilege as any)(systemPrivilegeAttr);
26
-
27
- expect(systemPrivilege).toBeDefined();
28
- expect(systemPrivilege).toBeInstanceOf(SystemPrivilege);
29
- expect(systemPrivilege.PrivilegeCode).toBe(systemPrivilegeAttr.PrivilegeCode);
30
- expect(systemPrivilege.SystemCode).toBe(systemPrivilegeAttr.SystemCode);
31
- expect(systemPrivilege.Description).toBe(systemPrivilegeAttr.Description);
32
- expect(systemPrivilege.Status).toBe(systemPrivilegeAttr.Status);
33
- expect(systemPrivilege.CreatedById).toBe(systemPrivilegeAttr.CreatedById);
34
- expect(systemPrivilege.CreatedAt).toBe(systemPrivilegeAttr.CreatedAt);
35
- expect(systemPrivilege.UpdatedById).toBe(systemPrivilegeAttr.UpdatedById);
36
- expect(systemPrivilege.UpdatedAt).toBe(systemPrivilegeAttr.UpdatedAt);
37
- });
38
- });
39
-
40
- describe('init', () => {
41
- it('should initialize SystemPrivilege without PrivilegeCode', async () => {
42
- const systemPrivilege = await SystemPrivilege.init(null);
43
- expect(systemPrivilege).toBeDefined();
44
- expect(systemPrivilege).toBeInstanceOf(SystemPrivilege);
45
- expect(systemPrivilege.PrivilegeCode).toBeUndefined();
46
- expect(systemPrivilege.SystemCode).toBeUndefined();
47
- expect(systemPrivilege.Description).toBeUndefined();
48
- expect(systemPrivilege.Status).toBeUndefined();
49
- expect(systemPrivilege.CreatedById).toBeUndefined();
50
- expect(systemPrivilege.CreatedAt).toBeUndefined();
51
- expect(systemPrivilege.UpdatedById).toBeUndefined();
52
- expect(systemPrivilege.UpdatedAt).toBeUndefined();
53
- });
54
-
55
- it('should initialize SystemPrivilege with PrivilegeCode', async () => {
56
- const findByPkSpy = jest
57
- .spyOn(SystemPrivilegeRepository.prototype, 'findByPk')
58
- .mockResolvedValue(systemPrivilegeAttr as any);
59
-
60
- const systemPrivilege = await SystemPrivilege.init(null, 'test');
61
- expect(findByPkSpy).toHaveBeenCalledWith('test', {
62
- transaction: null,
63
- });
64
- expect(systemPrivilege).toBeDefined();
65
- expect(systemPrivilege).toBeInstanceOf(SystemPrivilege);
66
- expect(systemPrivilege.PrivilegeCode).toBe(systemPrivilegeAttr.PrivilegeCode);
67
- expect(systemPrivilege.SystemCode).toBe(systemPrivilegeAttr.SystemCode);
68
- expect(systemPrivilege.Description).toBe(systemPrivilegeAttr.Description);
69
- expect(systemPrivilege.Status).toBe(systemPrivilegeAttr.Status);
70
- expect(systemPrivilege.CreatedById).toBe(systemPrivilegeAttr.CreatedById);
71
- expect(systemPrivilege.CreatedAt).toBe(systemPrivilegeAttr.CreatedAt);
72
- expect(systemPrivilege.UpdatedById).toBe(systemPrivilegeAttr.UpdatedById);
73
- expect(systemPrivilege.UpdatedAt).toBe(systemPrivilegeAttr.UpdatedAt);
74
- });
75
-
76
- it('should throw an error if PrivilegeCode is not found', async () => {
77
- jest.spyOn(SystemPrivilegeRepository.prototype, 'findByPk').mockResolvedValue(null);
78
-
79
- await expect(SystemPrivilege.init(null, 'test')).rejects.toThrow(
80
- new ClassError('SystemPrivilege', 'SystemPrivilegeErrMsg00', 'System Privilege Not Found'),
81
- );
82
- });
83
- });
1
+ import { SystemPrivilege } from '../../../../src/components/system-privilege/system-privilege';
2
+ import { SystemPrivilegeRepository } from '../../../../src/components/system-privilege/system-privilege.repository';
3
+ import { ClassError } from '@tomei/general';
4
+
5
+ describe('SystemPrivilege', () => {
6
+ let systemPrivilege: SystemPrivilege;
7
+ const systemPrivilegeAttr = {
8
+ PrivilegeCode: 'test',
9
+ SystemCode: 'test',
10
+ Name: 'test',
11
+ Description: 'test',
12
+ Status: 'test',
13
+ CreatedById: 1,
14
+ CreatedAt: new Date(),
15
+ UpdatedById: 1,
16
+ UpdatedAt: new Date(),
17
+ };
18
+
19
+ beforeEach(() => {
20
+ jest.resetAllMocks();
21
+ });
22
+
23
+ describe('constructor', () => {
24
+ it('should create a new SystemPrivilege instance', () => {
25
+ systemPrivilege = new (SystemPrivilege as any)(systemPrivilegeAttr);
26
+
27
+ expect(systemPrivilege).toBeDefined();
28
+ expect(systemPrivilege).toBeInstanceOf(SystemPrivilege);
29
+ expect(systemPrivilege.PrivilegeCode).toBe(systemPrivilegeAttr.PrivilegeCode);
30
+ expect(systemPrivilege.SystemCode).toBe(systemPrivilegeAttr.SystemCode);
31
+ expect(systemPrivilege.Description).toBe(systemPrivilegeAttr.Description);
32
+ expect(systemPrivilege.Status).toBe(systemPrivilegeAttr.Status);
33
+ expect(systemPrivilege.CreatedById).toBe(systemPrivilegeAttr.CreatedById);
34
+ expect(systemPrivilege.CreatedAt).toBe(systemPrivilegeAttr.CreatedAt);
35
+ expect(systemPrivilege.UpdatedById).toBe(systemPrivilegeAttr.UpdatedById);
36
+ expect(systemPrivilege.UpdatedAt).toBe(systemPrivilegeAttr.UpdatedAt);
37
+ });
38
+ });
39
+
40
+ describe('init', () => {
41
+ it('should initialize SystemPrivilege without PrivilegeCode', async () => {
42
+ const systemPrivilege = await SystemPrivilege.init(null);
43
+ expect(systemPrivilege).toBeDefined();
44
+ expect(systemPrivilege).toBeInstanceOf(SystemPrivilege);
45
+ expect(systemPrivilege.PrivilegeCode).toBeUndefined();
46
+ expect(systemPrivilege.SystemCode).toBeUndefined();
47
+ expect(systemPrivilege.Description).toBeUndefined();
48
+ expect(systemPrivilege.Status).toBeUndefined();
49
+ expect(systemPrivilege.CreatedById).toBeUndefined();
50
+ expect(systemPrivilege.CreatedAt).toBeUndefined();
51
+ expect(systemPrivilege.UpdatedById).toBeUndefined();
52
+ expect(systemPrivilege.UpdatedAt).toBeUndefined();
53
+ });
54
+
55
+ it('should initialize SystemPrivilege with PrivilegeCode', async () => {
56
+ const findByPkSpy = jest
57
+ .spyOn(SystemPrivilegeRepository.prototype, 'findByPk')
58
+ .mockResolvedValue(systemPrivilegeAttr as any);
59
+
60
+ const systemPrivilege = await SystemPrivilege.init(null, 'test');
61
+ expect(findByPkSpy).toHaveBeenCalledWith('test', {
62
+ transaction: null,
63
+ });
64
+ expect(systemPrivilege).toBeDefined();
65
+ expect(systemPrivilege).toBeInstanceOf(SystemPrivilege);
66
+ expect(systemPrivilege.PrivilegeCode).toBe(systemPrivilegeAttr.PrivilegeCode);
67
+ expect(systemPrivilege.SystemCode).toBe(systemPrivilegeAttr.SystemCode);
68
+ expect(systemPrivilege.Description).toBe(systemPrivilegeAttr.Description);
69
+ expect(systemPrivilege.Status).toBe(systemPrivilegeAttr.Status);
70
+ expect(systemPrivilege.CreatedById).toBe(systemPrivilegeAttr.CreatedById);
71
+ expect(systemPrivilege.CreatedAt).toBe(systemPrivilegeAttr.CreatedAt);
72
+ expect(systemPrivilege.UpdatedById).toBe(systemPrivilegeAttr.UpdatedById);
73
+ expect(systemPrivilege.UpdatedAt).toBe(systemPrivilegeAttr.UpdatedAt);
74
+ });
75
+
76
+ it('should throw an error if PrivilegeCode is not found', async () => {
77
+ jest.spyOn(SystemPrivilegeRepository.prototype, 'findByPk').mockResolvedValue(null);
78
+
79
+ await expect(SystemPrivilege.init(null, 'test')).rejects.toThrow(
80
+ new ClassError('SystemPrivilege', 'SystemPrivilegeErrMsg00', 'System Privilege Not Found'),
81
+ );
82
+ });
83
+ });
84
84
  });
@@ -1,87 +1,87 @@
1
- import { UserGroup } from '../../../../src/components/user-group/user-group';
2
- import { UserGroupRepository } from '../../../../src/components/user-group/user-group.repository';
3
- import { ClassError } from '@tomei/general';
4
-
5
- describe('UserGroup', () => {
6
- let userGroup: UserGroup;
7
- const userGroupAttr = {
8
- UserGroupId: 1,
9
- UserId: 1,
10
- GroupCode: 'group1',
11
- Status: 'active',
12
- InheritGroupPrivilegeYN: 'yes',
13
- InheritGroupSystemAccessYN: 'yes',
14
- CreatedById: 1,
15
- CreatedAt: new Date(),
16
- UpdatedById: 1,
17
- UpdatedAt: new Date(),
18
- };
19
-
20
- beforeEach(() => {
21
- userGroup = new (UserGroup as any)(userGroupAttr);
22
- });
23
-
24
- afterEach(() => {
25
- jest.clearAllMocks();
26
- });
27
-
28
- describe('constructor', () => {
29
- it('should create a new UserGroup instance', () => {
30
- expect(userGroup).toBeDefined();
31
- expect(userGroup).toBeInstanceOf(UserGroup);
32
- expect(userGroup.UserGroupId).toBe(userGroupAttr.UserGroupId);
33
- expect(userGroup.UserId).toBe(userGroupAttr.UserId);
34
- expect(userGroup.GroupCode).toBe(userGroupAttr.GroupCode);
35
- expect(userGroup.Status).toBe(userGroupAttr.Status);
36
- expect(userGroup.InheritGroupPrivilegeYN).toBe(
37
- userGroupAttr.InheritGroupPrivilegeYN
38
- );
39
- expect(userGroup.InheritGroupSystemAccessYN).toBe(
40
- userGroupAttr.InheritGroupSystemAccessYN
41
- );
42
- expect(userGroup.CreatedById).toBe(userGroupAttr.CreatedById);
43
- expect(userGroup.CreatedAt).toBe(userGroupAttr.CreatedAt);
44
- expect(userGroup.UpdatedById).toBe(userGroupAttr.UpdatedById);
45
- expect(userGroup.UpdatedAt).toBe(userGroupAttr.UpdatedAt);
46
- });
47
- });
48
-
49
- describe('init', () => {
50
- it('should initialize UserGroup with valid UserGroupId', async () => {
51
- const findOneMock = jest
52
- .spyOn(UserGroupRepository.prototype, 'findOne')
53
- .mockResolvedValueOnce(userGroupAttr as any);
54
-
55
- const result = await UserGroup.init(null, 1);
56
-
57
- expect(findOneMock).toHaveBeenCalledTimes(1);
58
- expect(findOneMock).toHaveBeenCalledWith({
59
- where: { UserGroupId: 1 },
60
- transaction: null,
61
- });
62
- expect(result).toBeInstanceOf(UserGroup);
63
- expect(result.UserGroupId).toBe(userGroupAttr.UserGroupId);
64
- expect(result.UserId).toBe(userGroupAttr.UserId);
65
- expect(result.GroupCode).toBe(userGroupAttr.GroupCode);
66
- expect(result.Status).toBe(userGroupAttr.Status);
67
- expect(result.InheritGroupPrivilegeYN).toBe(
68
- userGroupAttr.InheritGroupPrivilegeYN
69
- );
70
- expect(result.InheritGroupSystemAccessYN).toBe(
71
- userGroupAttr.InheritGroupSystemAccessYN
72
- );
73
- expect(result.CreatedById).toBe(userGroupAttr.CreatedById);
74
- expect(result.CreatedAt).toBe(userGroupAttr.CreatedAt);
75
- expect(result.UpdatedById).toBe(userGroupAttr.UpdatedById);
76
- expect(result.UpdatedAt).toBe(userGroupAttr.UpdatedAt);
77
- });
78
-
79
- it('should throw ClassError when UserGroupId is not found', async () => {
80
- jest
81
- .spyOn(UserGroupRepository.prototype, 'findOne')
82
- .mockResolvedValueOnce(null);
83
-
84
- await expect(UserGroup.init(null, 1)).rejects.toThrow(ClassError);
85
- });
86
- });
1
+ import { UserGroup } from '../../../../src/components/user-group/user-group';
2
+ import { UserGroupRepository } from '../../../../src/components/user-group/user-group.repository';
3
+ import { ClassError } from '@tomei/general';
4
+
5
+ describe('UserGroup', () => {
6
+ let userGroup: UserGroup;
7
+ const userGroupAttr = {
8
+ UserGroupId: 1,
9
+ UserId: 1,
10
+ GroupCode: 'group1',
11
+ Status: 'active',
12
+ InheritGroupPrivilegeYN: 'yes',
13
+ InheritGroupSystemAccessYN: 'yes',
14
+ CreatedById: 1,
15
+ CreatedAt: new Date(),
16
+ UpdatedById: 1,
17
+ UpdatedAt: new Date(),
18
+ };
19
+
20
+ beforeEach(() => {
21
+ userGroup = new (UserGroup as any)(userGroupAttr);
22
+ });
23
+
24
+ afterEach(() => {
25
+ jest.clearAllMocks();
26
+ });
27
+
28
+ describe('constructor', () => {
29
+ it('should create a new UserGroup instance', () => {
30
+ expect(userGroup).toBeDefined();
31
+ expect(userGroup).toBeInstanceOf(UserGroup);
32
+ expect(userGroup.UserGroupId).toBe(userGroupAttr.UserGroupId);
33
+ expect(userGroup.UserId).toBe(userGroupAttr.UserId);
34
+ expect(userGroup.GroupCode).toBe(userGroupAttr.GroupCode);
35
+ expect(userGroup.Status).toBe(userGroupAttr.Status);
36
+ expect(userGroup.InheritGroupPrivilegeYN).toBe(
37
+ userGroupAttr.InheritGroupPrivilegeYN
38
+ );
39
+ expect(userGroup.InheritGroupSystemAccessYN).toBe(
40
+ userGroupAttr.InheritGroupSystemAccessYN
41
+ );
42
+ expect(userGroup.CreatedById).toBe(userGroupAttr.CreatedById);
43
+ expect(userGroup.CreatedAt).toBe(userGroupAttr.CreatedAt);
44
+ expect(userGroup.UpdatedById).toBe(userGroupAttr.UpdatedById);
45
+ expect(userGroup.UpdatedAt).toBe(userGroupAttr.UpdatedAt);
46
+ });
47
+ });
48
+
49
+ describe('init', () => {
50
+ it('should initialize UserGroup with valid UserGroupId', async () => {
51
+ const findOneMock = jest
52
+ .spyOn(UserGroupRepository.prototype, 'findOne')
53
+ .mockResolvedValueOnce(userGroupAttr as any);
54
+
55
+ const result = await UserGroup.init(null, 1);
56
+
57
+ expect(findOneMock).toHaveBeenCalledTimes(1);
58
+ expect(findOneMock).toHaveBeenCalledWith({
59
+ where: { UserGroupId: 1 },
60
+ transaction: null,
61
+ });
62
+ expect(result).toBeInstanceOf(UserGroup);
63
+ expect(result.UserGroupId).toBe(userGroupAttr.UserGroupId);
64
+ expect(result.UserId).toBe(userGroupAttr.UserId);
65
+ expect(result.GroupCode).toBe(userGroupAttr.GroupCode);
66
+ expect(result.Status).toBe(userGroupAttr.Status);
67
+ expect(result.InheritGroupPrivilegeYN).toBe(
68
+ userGroupAttr.InheritGroupPrivilegeYN
69
+ );
70
+ expect(result.InheritGroupSystemAccessYN).toBe(
71
+ userGroupAttr.InheritGroupSystemAccessYN
72
+ );
73
+ expect(result.CreatedById).toBe(userGroupAttr.CreatedById);
74
+ expect(result.CreatedAt).toBe(userGroupAttr.CreatedAt);
75
+ expect(result.UpdatedById).toBe(userGroupAttr.UpdatedById);
76
+ expect(result.UpdatedAt).toBe(userGroupAttr.UpdatedAt);
77
+ });
78
+
79
+ it('should throw ClassError when UserGroupId is not found', async () => {
80
+ jest
81
+ .spyOn(UserGroupRepository.prototype, 'findOne')
82
+ .mockResolvedValueOnce(null);
83
+
84
+ await expect(UserGroup.init(null, 1)).rejects.toThrow(ClassError);
85
+ });
86
+ });
87
87
  });
@@ -1,79 +1,79 @@
1
- import { UserObjectPrivilege } from '../../../../src/components/user-object-privilege/user-object-privilege';
2
- import { UserObjectPrivilegeRepository } from '../../../../src/components/user-object-privilege/user-object-privilege.repository';
3
- import { ClassError } from '@tomei/general';
4
-
5
- describe('UserObjectPrivilege', () => {
6
- let userObjectPrivilege: UserObjectPrivilege;
7
- const userObjectPrivilegeAttr = {
8
- ObjectPrivilegeId: 1,
9
- UserId: 1,
10
- SystemPrivilegeId: 'code1',
11
- ObjectId: 'object1',
12
- ObjectType: 'type1',
13
- CreatedAt: new Date(),
14
- UpdatedAt: new Date(),
15
- CreatedById: 1,
16
- UpdatedById: 1,
17
- };
18
-
19
- beforeEach(() => {
20
- userObjectPrivilege = new (UserObjectPrivilege as any)(userObjectPrivilegeAttr);
21
- });
22
-
23
- afterEach(() => {
24
- jest.clearAllMocks();
25
- });
26
-
27
- describe('constructor', () => {
28
- it('should create a new UserObjectPrivilege instance', () => {
29
- expect(userObjectPrivilege).toBeDefined();
30
- expect(userObjectPrivilege).toBeInstanceOf(UserObjectPrivilege);
31
- expect(userObjectPrivilege.ObjectPrivilegeId).toBe(userObjectPrivilegeAttr.ObjectPrivilegeId);
32
- expect(userObjectPrivilege.UserId).toBe(userObjectPrivilegeAttr.UserId);
33
- expect(userObjectPrivilege.SystemPrivilegeId).toBe(userObjectPrivilegeAttr.SystemPrivilegeId);
34
- expect(userObjectPrivilege.ObjectId).toBe(userObjectPrivilegeAttr.ObjectId);
35
- expect(userObjectPrivilege.ObjectType).toBe(userObjectPrivilegeAttr.ObjectType);
36
- expect(userObjectPrivilege.CreatedAt).toBe(userObjectPrivilegeAttr.CreatedAt);
37
- expect(userObjectPrivilege.UpdatedAt).toBe(userObjectPrivilegeAttr.UpdatedAt);
38
- expect(userObjectPrivilege.CreatedById).toBe(userObjectPrivilegeAttr.CreatedById);
39
- expect(userObjectPrivilege.UpdatedById).toBe(userObjectPrivilegeAttr.UpdatedById);
40
- });
41
- });
42
-
43
- describe('init', () => {
44
- it('should initialize UserObjectPrivilege with valid ObjectPrivilegeId', async () => {
45
- const findOneMock = jest
46
- .spyOn(UserObjectPrivilegeRepository.prototype, 'findOne')
47
- .mockResolvedValueOnce({
48
- ...userObjectPrivilegeAttr,
49
- get: () => userObjectPrivilegeAttr,
50
- } as any);
51
-
52
- const result = await UserObjectPrivilege.init(null, 1);
53
-
54
- expect(findOneMock).toHaveBeenCalledTimes(1);
55
- expect(findOneMock).toHaveBeenCalledWith({
56
- where: { ObjectPrivilegeId: 1 },
57
- transaction: null,
58
- });
59
- expect(result).toBeInstanceOf(UserObjectPrivilege);
60
- expect(result.ObjectPrivilegeId).toBe(userObjectPrivilegeAttr.ObjectPrivilegeId);
61
- expect(result.UserId).toBe(userObjectPrivilegeAttr.UserId);
62
- expect(result.SystemPrivilegeId).toBe(userObjectPrivilegeAttr.SystemPrivilegeId);
63
- expect(result.ObjectId).toBe(userObjectPrivilegeAttr.ObjectId);
64
- expect(result.ObjectType).toBe(userObjectPrivilegeAttr.ObjectType);
65
- expect(result.CreatedAt).toBe(userObjectPrivilegeAttr.CreatedAt);
66
- expect(result.UpdatedAt).toBe(userObjectPrivilegeAttr.UpdatedAt);
67
- expect(result.CreatedById).toBe(userObjectPrivilegeAttr.CreatedById);
68
- expect(result.UpdatedById).toBe(userObjectPrivilegeAttr.UpdatedById);
69
- });
70
-
71
- it('should throw ClassError when ObjectPrivilegeId is not found', async () => {
72
- jest
73
- .spyOn(UserObjectPrivilegeRepository.prototype, 'findOne')
74
- .mockResolvedValueOnce(null);
75
-
76
- await expect(UserObjectPrivilege.init(null, 1)).rejects.toThrow(ClassError);
77
- });
78
- });
1
+ import { UserObjectPrivilege } from '../../../../src/components/user-object-privilege/user-object-privilege';
2
+ import { UserObjectPrivilegeRepository } from '../../../../src/components/user-object-privilege/user-object-privilege.repository';
3
+ import { ClassError } from '@tomei/general';
4
+
5
+ describe('UserObjectPrivilege', () => {
6
+ let userObjectPrivilege: UserObjectPrivilege;
7
+ const userObjectPrivilegeAttr = {
8
+ ObjectPrivilegeId: 1,
9
+ UserId: 1,
10
+ SystemPrivilegeId: 'code1',
11
+ ObjectId: 'object1',
12
+ ObjectType: 'type1',
13
+ CreatedAt: new Date(),
14
+ UpdatedAt: new Date(),
15
+ CreatedById: 1,
16
+ UpdatedById: 1,
17
+ };
18
+
19
+ beforeEach(() => {
20
+ userObjectPrivilege = new (UserObjectPrivilege as any)(userObjectPrivilegeAttr);
21
+ });
22
+
23
+ afterEach(() => {
24
+ jest.clearAllMocks();
25
+ });
26
+
27
+ describe('constructor', () => {
28
+ it('should create a new UserObjectPrivilege instance', () => {
29
+ expect(userObjectPrivilege).toBeDefined();
30
+ expect(userObjectPrivilege).toBeInstanceOf(UserObjectPrivilege);
31
+ expect(userObjectPrivilege.ObjectPrivilegeId).toBe(userObjectPrivilegeAttr.ObjectPrivilegeId);
32
+ expect(userObjectPrivilege.UserId).toBe(userObjectPrivilegeAttr.UserId);
33
+ expect(userObjectPrivilege.SystemPrivilegeId).toBe(userObjectPrivilegeAttr.SystemPrivilegeId);
34
+ expect(userObjectPrivilege.ObjectId).toBe(userObjectPrivilegeAttr.ObjectId);
35
+ expect(userObjectPrivilege.ObjectType).toBe(userObjectPrivilegeAttr.ObjectType);
36
+ expect(userObjectPrivilege.CreatedAt).toBe(userObjectPrivilegeAttr.CreatedAt);
37
+ expect(userObjectPrivilege.UpdatedAt).toBe(userObjectPrivilegeAttr.UpdatedAt);
38
+ expect(userObjectPrivilege.CreatedById).toBe(userObjectPrivilegeAttr.CreatedById);
39
+ expect(userObjectPrivilege.UpdatedById).toBe(userObjectPrivilegeAttr.UpdatedById);
40
+ });
41
+ });
42
+
43
+ describe('init', () => {
44
+ it('should initialize UserObjectPrivilege with valid ObjectPrivilegeId', async () => {
45
+ const findOneMock = jest
46
+ .spyOn(UserObjectPrivilegeRepository.prototype, 'findOne')
47
+ .mockResolvedValueOnce({
48
+ ...userObjectPrivilegeAttr,
49
+ get: () => userObjectPrivilegeAttr,
50
+ } as any);
51
+
52
+ const result = await UserObjectPrivilege.init(null, 1);
53
+
54
+ expect(findOneMock).toHaveBeenCalledTimes(1);
55
+ expect(findOneMock).toHaveBeenCalledWith({
56
+ where: { ObjectPrivilegeId: 1 },
57
+ transaction: null,
58
+ });
59
+ expect(result).toBeInstanceOf(UserObjectPrivilege);
60
+ expect(result.ObjectPrivilegeId).toBe(userObjectPrivilegeAttr.ObjectPrivilegeId);
61
+ expect(result.UserId).toBe(userObjectPrivilegeAttr.UserId);
62
+ expect(result.SystemPrivilegeId).toBe(userObjectPrivilegeAttr.SystemPrivilegeId);
63
+ expect(result.ObjectId).toBe(userObjectPrivilegeAttr.ObjectId);
64
+ expect(result.ObjectType).toBe(userObjectPrivilegeAttr.ObjectType);
65
+ expect(result.CreatedAt).toBe(userObjectPrivilegeAttr.CreatedAt);
66
+ expect(result.UpdatedAt).toBe(userObjectPrivilegeAttr.UpdatedAt);
67
+ expect(result.CreatedById).toBe(userObjectPrivilegeAttr.CreatedById);
68
+ expect(result.UpdatedById).toBe(userObjectPrivilegeAttr.UpdatedById);
69
+ });
70
+
71
+ it('should throw ClassError when ObjectPrivilegeId is not found', async () => {
72
+ jest
73
+ .spyOn(UserObjectPrivilegeRepository.prototype, 'findOne')
74
+ .mockResolvedValueOnce(null);
75
+
76
+ await expect(UserObjectPrivilege.init(null, 1)).rejects.toThrow(ClassError);
77
+ });
78
+ });
79
79
  });
@@ -0,0 +1,165 @@
1
+ import { UserPasswordHistory } from '../../../../src/components/user-password-history/user-password-history';
2
+ import { UserPasswordHistoryRepository } from '../../../../src/components/user-password-history/user-password-history.repository';
3
+ import { PasswordHashService } from '../../../../src/components/password-hash';
4
+ import { ComponentConfig } from '@tomei/config';
5
+ import { ClassError } from '@tomei/general';
6
+
7
+ describe('UserPasswordHistory', () => {
8
+ const historyData = {
9
+ HistoryId: '1',
10
+ UserId: 1,
11
+ PasswordHash: '$argon2id$v=19$m=65536,t=3,p=4$hash1',
12
+ CreatedAt: new Date('2024-01-01'),
13
+ get: (opts?: any) => ({
14
+ HistoryId: '1',
15
+ UserId: 1,
16
+ PasswordHash: '$argon2id$v=19$m=65536,t=3,p=4$hash1',
17
+ CreatedAt: new Date('2024-01-01'),
18
+ }),
19
+ };
20
+
21
+ afterEach(() => {
22
+ jest.clearAllMocks();
23
+ });
24
+
25
+ describe('init', () => {
26
+ it('should return new instance when no historyId is provided', async () => {
27
+ const result = await UserPasswordHistory.init();
28
+ expect(result).toBeInstanceOf(UserPasswordHistory);
29
+ expect(result.HistoryId).toBeUndefined();
30
+ });
31
+
32
+ it('should initialize UserPasswordHistory with valid historyId', async () => {
33
+ jest
34
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findByPk')
35
+ .mockResolvedValueOnce(historyData as any);
36
+
37
+ const result = await UserPasswordHistory.init(1);
38
+
39
+ expect(result).toBeInstanceOf(UserPasswordHistory);
40
+ expect(result.UserId).toBe(1);
41
+ });
42
+
43
+ it('should throw ClassError when historyId is not found', async () => {
44
+ jest
45
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findByPk')
46
+ .mockResolvedValueOnce(null);
47
+
48
+ await expect(UserPasswordHistory.init(999)).rejects.toThrow(
49
+ 'UserPasswordHistory not found',
50
+ );
51
+ });
52
+ });
53
+
54
+ describe('validate', () => {
55
+ const passwordHashService = new PasswordHashService();
56
+
57
+ beforeEach(() => {
58
+ jest
59
+ .spyOn(ComponentConfig, 'getComponentConfigValue')
60
+ .mockReturnValue(3 as any);
61
+ });
62
+
63
+ it('should return null when no password history exists', async () => {
64
+ jest
65
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findAll')
66
+ .mockResolvedValueOnce([] as any);
67
+
68
+ const result = await UserPasswordHistory.validate(
69
+ null,
70
+ 1,
71
+ 'NewPassword1!',
72
+ passwordHashService,
73
+ );
74
+
75
+ expect(result).toBeNull();
76
+ });
77
+
78
+ it('should throw ClassError when password matches history', async () => {
79
+ jest
80
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findAll')
81
+ .mockResolvedValueOnce([historyData] as any);
82
+ jest
83
+ .spyOn(passwordHashService, 'verify')
84
+ .mockResolvedValueOnce(true as any);
85
+
86
+ await expect(
87
+ UserPasswordHistory.validate(null, 1, 'OldPassword1!', passwordHashService),
88
+ ).rejects.toThrow(ClassError);
89
+ });
90
+
91
+ it('should not throw when password does not match any history', async () => {
92
+ jest
93
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findAll')
94
+ .mockResolvedValueOnce([historyData] as any);
95
+ jest
96
+ .spyOn(passwordHashService, 'verify')
97
+ .mockResolvedValueOnce(false as any);
98
+
99
+ await expect(
100
+ UserPasswordHistory.validate(null, 1, 'NewPassword1!', passwordHashService),
101
+ ).resolves.not.toThrow();
102
+ });
103
+ });
104
+
105
+ describe('create', () => {
106
+ beforeEach(() => {
107
+ jest
108
+ .spyOn(ComponentConfig, 'getComponentConfigValue')
109
+ .mockReturnValue(3 as any);
110
+ });
111
+
112
+ it('should create a new password history record', async () => {
113
+ const createSpy = jest
114
+ .spyOn(UserPasswordHistoryRepository.prototype, 'create')
115
+ .mockResolvedValueOnce(historyData as any);
116
+ jest
117
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findAll')
118
+ .mockResolvedValueOnce([historyData] as any);
119
+
120
+ await UserPasswordHistory.create(null, 1, 'hashedPassword');
121
+
122
+ expect(createSpy).toHaveBeenCalledTimes(1);
123
+ });
124
+
125
+ it('should purge oldest records when history exceeds policy limit', async () => {
126
+ const oldRecords = [
127
+ { HistoryId: '1', CreatedAt: new Date('2024-01-01') },
128
+ { HistoryId: '2', CreatedAt: new Date('2024-02-01') },
129
+ { HistoryId: '3', CreatedAt: new Date('2024-03-01') },
130
+ { HistoryId: '4', CreatedAt: new Date('2024-04-01') },
131
+ ];
132
+
133
+ jest
134
+ .spyOn(UserPasswordHistoryRepository.prototype, 'create')
135
+ .mockResolvedValueOnce(historyData as any);
136
+ jest
137
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findAll')
138
+ .mockResolvedValueOnce(oldRecords as any);
139
+ const destroySpy = jest
140
+ .spyOn(UserPasswordHistoryRepository.prototype, 'destroyMultiple')
141
+ .mockResolvedValueOnce(undefined as any);
142
+
143
+ await UserPasswordHistory.create(null, 1, 'hashedPassword');
144
+
145
+ expect(destroySpy).toHaveBeenCalledTimes(1);
146
+ expect(destroySpy).toHaveBeenCalledWith(['4'], null);
147
+ });
148
+
149
+ it('should not purge when history is within policy limit', async () => {
150
+ jest
151
+ .spyOn(UserPasswordHistoryRepository.prototype, 'create')
152
+ .mockResolvedValueOnce(historyData as any);
153
+ jest
154
+ .spyOn(UserPasswordHistoryRepository.prototype, 'findAll')
155
+ .mockResolvedValueOnce([historyData] as any);
156
+ const destroySpy = jest
157
+ .spyOn(UserPasswordHistoryRepository.prototype, 'destroyMultiple')
158
+ .mockResolvedValueOnce(undefined as any);
159
+
160
+ await UserPasswordHistory.create(null, 1, 'hashedPassword');
161
+
162
+ expect(destroySpy).not.toHaveBeenCalled();
163
+ });
164
+ });
165
+ });