@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.
- package/.commitlintrc.json +22 -22
- package/.gitlab-ci.yml +237 -16
- package/.husky/commit-msg +15 -15
- package/.husky/pre-commit +7 -7
- package/.prettierrc +4 -4
- package/Jenkinsfile +57 -57
- package/README.md +23 -23
- package/__tests__/unit/components/api-key/api-key.spec.ts +201 -0
- package/__tests__/unit/components/group/group.spec.ts +85 -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 +74 -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 +2358 -1164
- package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
- package/__tests__/unit/components/system/system.spec.ts +255 -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-password-history/user-password-history.spec.ts +165 -0
- package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
- package/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.ts +233 -0
- 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/cobertura-coverage.xml +6837 -0
- package/coverage/test-report.xml +130 -40
- package/create-sso-user.sql +39 -39
- package/dist/__tests__/unit/components/{group-privilege/group-privilege.test.d.ts → api-key/api-key.spec.d.ts} +1 -1
- package/dist/__tests__/unit/components/api-key/api-key.spec.js +158 -0
- package/dist/__tests__/unit/components/api-key/api-key.spec.js.map +1 -0
- package/dist/__tests__/unit/components/group/group.spec.js +4 -0
- package/dist/__tests__/unit/components/group/group.spec.js.map +1 -1
- package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js +9 -1
- package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js.map +1 -1
- package/dist/__tests__/unit/components/login-user/login.spec.js +703 -0
- package/dist/__tests__/unit/components/login-user/login.spec.js.map +1 -1
- package/dist/__tests__/unit/components/system/system.spec.js +1 -0
- package/dist/__tests__/unit/components/system/system.spec.js.map +1 -1
- package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.d.ts +1 -0
- package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js +138 -0
- package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js.map +1 -0
- package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.d.ts +1 -0
- package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js +182 -0
- package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js.map +1 -0
- package/dist/src/components/login-user/user.js +1 -1
- package/dist/src/components/login-user/user.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eslint.config.mjs +58 -58
- package/jest.config.js +16 -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 -30
- package/migrations/20250805085707-add-bulk-approval-code-to-sso-user.js +29 -0
- package/package.json +87 -87
- package/sampledotenv +7 -7
- package/src/components/login-user/user.ts +1 -1
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +23 -23
- package/coverage/clover.xml +0 -1380
- package/coverage/coverage-final.json +0 -39
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +0 -160
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +0 -919
- package/coverage/lcov-report/components/group-object-privilege/index.html +0 -131
- package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +0 -172
- package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +0 -337
- package/coverage/lcov-report/components/group-privilege/index.html +0 -131
- package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +0 -214
- package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +0 -355
- package/coverage/lcov-report/components/group-system-access/index.html +0 -131
- package/coverage/lcov-report/components/password-hash/index.html +0 -116
- package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +0 -127
- package/coverage/lcov-report/components/system-privilege/index.html +0 -116
- package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +0 -139
- package/coverage/lcov-report/components/user-group/index.html +0 -131
- package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +0 -142
- package/coverage/lcov-report/components/user-group/user-group.ts.html +0 -2377
- package/coverage/lcov-report/components/user-object-privilege/index.html +0 -131
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +0 -118
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +0 -322
- package/coverage/lcov-report/components/user-privilege/index.html +0 -131
- package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +0 -160
- package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +0 -2071
- package/coverage/lcov-report/components/user-system-access/index.html +0 -131
- package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +0 -208
- package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +0 -2236
- package/coverage/lcov-report/enum/api-key.enum.ts.html +0 -100
- package/coverage/lcov-report/enum/group-type.enum.ts.html +0 -109
- package/coverage/lcov-report/enum/index.html +0 -206
- package/coverage/lcov-report/enum/index.ts.html +0 -103
- package/coverage/lcov-report/enum/login-status.enum.ts.html +0 -97
- package/coverage/lcov-report/enum/object-status.enum.ts.html +0 -97
- package/coverage/lcov-report/enum/user-status.enum.ts.html +0 -106
- package/coverage/lcov-report/enum/yn.enum.ts.html +0 -97
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -296
- package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +0 -358
- package/coverage/lcov-report/models/group-privilege.entity.ts.html +0 -319
- package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +0 -370
- package/coverage/lcov-report/models/group-system-access.entity.ts.html +0 -328
- package/coverage/lcov-report/models/group.entity.ts.html +0 -466
- package/coverage/lcov-report/models/index.html +0 -296
- package/coverage/lcov-report/models/staff.entity.ts.html +0 -358
- package/coverage/lcov-report/models/system-privilege.entity.ts.html +0 -355
- package/coverage/lcov-report/models/system.entity.ts.html +0 -424
- package/coverage/lcov-report/models/user-group.entity.ts.html +0 -358
- package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +0 -355
- package/coverage/lcov-report/models/user-privilege.entity.ts.html +0 -319
- package/coverage/lcov-report/models/user-system-access.entity.ts.html +0 -346
- package/coverage/lcov-report/models/user.entity.ts.html +0 -685
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/redis-client/index.html +0 -116
- package/coverage/lcov-report/redis-client/redis.service.ts.html +0 -310
- package/coverage/lcov-report/session/index.html +0 -116
- package/coverage/lcov-report/session/session.service.ts.html +0 -373
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov.info +0 -2223
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
- 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 +0 -6
- package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
- package/sonar-project.properties +0 -23
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { APIKey } from '../../../../src/components/api-key/api-key';
|
|
2
|
+
import { APIKeyRepository } from '../../../../src/components/api-key/api-key.repository';
|
|
3
|
+
import { LoginUser } from '../../../../src/components/login-user/login-user';
|
|
4
|
+
import { ApplicationConfig } from '@tomei/config';
|
|
5
|
+
import { Activity } from '@tomei/activity-history';
|
|
6
|
+
import { ClassError } from '@tomei/general';
|
|
7
|
+
import { System } from '../../../../src/components/system/system';
|
|
8
|
+
import { APIKeyStatusEnum } from '../../../../src/enum/api-key.enum';
|
|
9
|
+
|
|
10
|
+
describe('APIKey', () => {
|
|
11
|
+
const loginUser = new (LoginUser.prototype as any).constructor();
|
|
12
|
+
loginUser.ObjectId = '1';
|
|
13
|
+
loginUser.UserId = 1;
|
|
14
|
+
|
|
15
|
+
const apiKeyData = {
|
|
16
|
+
APIKeyId: 1,
|
|
17
|
+
ApiKey: 'abc123def456',
|
|
18
|
+
Name: 'Test Key',
|
|
19
|
+
SystemCode: 'TST',
|
|
20
|
+
Description: 'Test description',
|
|
21
|
+
Status: APIKeyStatusEnum.ACTIVE,
|
|
22
|
+
ExpirationDate: new Date('2027-01-01'),
|
|
23
|
+
RevokedById: null,
|
|
24
|
+
RevokedAt: null,
|
|
25
|
+
CreatedAt: new Date('2024-01-01'),
|
|
26
|
+
CreatedById: 1,
|
|
27
|
+
get: function (opts?: any) {
|
|
28
|
+
if (opts?.plain) return this;
|
|
29
|
+
return this;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
jest.clearAllMocks();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
jest
|
|
39
|
+
.spyOn(ApplicationConfig, 'getComponentConfigValue')
|
|
40
|
+
.mockReturnValue('TST' as any);
|
|
41
|
+
jest
|
|
42
|
+
.spyOn(Activity.prototype, 'create')
|
|
43
|
+
.mockResolvedValue(undefined as any);
|
|
44
|
+
jest
|
|
45
|
+
.spyOn(LoginUser.prototype, 'checkPrivileges')
|
|
46
|
+
.mockResolvedValue(true as any);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe('init', () => {
|
|
50
|
+
it('should return a new APIKey instance when no ApiKeyId is provided', async () => {
|
|
51
|
+
const result = await APIKey.init();
|
|
52
|
+
expect(result).toBeInstanceOf(APIKey);
|
|
53
|
+
expect(result.APIKeyId).toBeNaN();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should initialize APIKey with valid ApiKeyId', async () => {
|
|
57
|
+
jest
|
|
58
|
+
.spyOn(APIKeyRepository.prototype, 'findByPk')
|
|
59
|
+
.mockResolvedValueOnce(apiKeyData as any);
|
|
60
|
+
|
|
61
|
+
const result = await APIKey.init(1);
|
|
62
|
+
|
|
63
|
+
expect(result).toBeInstanceOf(APIKey);
|
|
64
|
+
expect(result.Name).toBe('Test Key');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should throw ClassError when ApiKeyId is not found', async () => {
|
|
68
|
+
jest
|
|
69
|
+
.spyOn(APIKeyRepository.prototype, 'findByPk')
|
|
70
|
+
.mockResolvedValueOnce(null);
|
|
71
|
+
|
|
72
|
+
await expect(APIKey.init(999)).rejects.toThrow('APIKey not found');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('generate', () => {
|
|
77
|
+
it('should throw when user lacks API_KEY_CREATE privilege', async () => {
|
|
78
|
+
jest
|
|
79
|
+
.spyOn(LoginUser.prototype, 'checkPrivileges')
|
|
80
|
+
.mockResolvedValueOnce(false as any);
|
|
81
|
+
|
|
82
|
+
const apiKey = await APIKey.init();
|
|
83
|
+
apiKey.SystemCode = 'TST';
|
|
84
|
+
|
|
85
|
+
await expect(apiKey.generate(loginUser)).rejects.toThrow(
|
|
86
|
+
'User does not have privilege to generate API key.',
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should generate an API key successfully', async () => {
|
|
91
|
+
jest
|
|
92
|
+
.spyOn(System, 'init')
|
|
93
|
+
.mockResolvedValueOnce(new (System.prototype as any).constructor() as any);
|
|
94
|
+
jest
|
|
95
|
+
.spyOn(APIKeyRepository.prototype, 'create')
|
|
96
|
+
.mockResolvedValueOnce({ ...apiKeyData, APIKeyId: 1 } as any);
|
|
97
|
+
|
|
98
|
+
const apiKey = await APIKey.init();
|
|
99
|
+
apiKey.SystemCode = 'TST';
|
|
100
|
+
apiKey.Name = 'Test Key';
|
|
101
|
+
apiKey.Status = APIKeyStatusEnum.ACTIVE;
|
|
102
|
+
|
|
103
|
+
const result = await apiKey.generate(loginUser);
|
|
104
|
+
|
|
105
|
+
expect(result).toHaveProperty('ApiKey');
|
|
106
|
+
expect(result.Name).toBe('Test Key');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('findAll', () => {
|
|
111
|
+
it('should throw when user lacks API_KEY_VIEW privilege', async () => {
|
|
112
|
+
jest
|
|
113
|
+
.spyOn(LoginUser.prototype, 'checkPrivileges')
|
|
114
|
+
.mockResolvedValueOnce(false as any);
|
|
115
|
+
|
|
116
|
+
await expect(
|
|
117
|
+
APIKey.findAll({ page: 1, limit: 10 }, loginUser, null, {}),
|
|
118
|
+
).rejects.toThrow('User does not have privilege to generate API key.');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should return paginated API keys', async () => {
|
|
122
|
+
jest
|
|
123
|
+
.spyOn(APIKeyRepository.prototype, 'findAllWithPagination')
|
|
124
|
+
.mockResolvedValueOnce({
|
|
125
|
+
count: 1,
|
|
126
|
+
rows: [new (APIKey.prototype as any).constructor(apiKeyData)],
|
|
127
|
+
} as any);
|
|
128
|
+
|
|
129
|
+
const result = await APIKey.findAll(
|
|
130
|
+
{ page: 1, limit: 10 },
|
|
131
|
+
loginUser,
|
|
132
|
+
null,
|
|
133
|
+
{ SystemCode: 'TST' },
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
expect(result.total).toBe(1);
|
|
137
|
+
expect(result.ApiKeys).toHaveLength(1);
|
|
138
|
+
expect(result.page).toBe(1);
|
|
139
|
+
expect(result.limit).toBe(10);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should apply filters correctly', async () => {
|
|
143
|
+
const spy = jest
|
|
144
|
+
.spyOn(APIKeyRepository.prototype, 'findAllWithPagination')
|
|
145
|
+
.mockResolvedValueOnce({ count: 0, rows: [] } as any);
|
|
146
|
+
|
|
147
|
+
const fromDate = new Date('2024-01-01');
|
|
148
|
+
const toDate = new Date('2024-12-31');
|
|
149
|
+
|
|
150
|
+
await APIKey.findAll(
|
|
151
|
+
{ page: 1, limit: 10 },
|
|
152
|
+
loginUser,
|
|
153
|
+
null,
|
|
154
|
+
{
|
|
155
|
+
Status: APIKeyStatusEnum.ACTIVE,
|
|
156
|
+
ExpirationDate: { FromDate: fromDate, ToDate: toDate },
|
|
157
|
+
CreatedById: 1,
|
|
158
|
+
},
|
|
159
|
+
{ SortBy: 'CreatedAt', SortOrder: 'ASC' },
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('revoke', () => {
|
|
167
|
+
it('should throw when API key is not found', async () => {
|
|
168
|
+
jest
|
|
169
|
+
.spyOn(APIKeyRepository.prototype, 'findOne')
|
|
170
|
+
.mockResolvedValueOnce(null);
|
|
171
|
+
|
|
172
|
+
const apiKey = await APIKey.init();
|
|
173
|
+
await expect(
|
|
174
|
+
apiKey.revoke('nonexistent-key', loginUser, null),
|
|
175
|
+
).rejects.toThrow('API key not found.');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('should revoke an API key successfully', async () => {
|
|
179
|
+
const apiKeyRecord = {
|
|
180
|
+
...apiKeyData,
|
|
181
|
+
Status: APIKeyStatusEnum.ACTIVE,
|
|
182
|
+
RevokedAt: null,
|
|
183
|
+
RevokedById: null,
|
|
184
|
+
RevokedReason: null,
|
|
185
|
+
get: (opts?: any) => ({ ...apiKeyData }),
|
|
186
|
+
};
|
|
187
|
+
jest
|
|
188
|
+
.spyOn(APIKeyRepository.prototype, 'findOne')
|
|
189
|
+
.mockResolvedValueOnce(apiKeyRecord as any);
|
|
190
|
+
jest
|
|
191
|
+
.spyOn(APIKeyRepository.prototype, 'update')
|
|
192
|
+
.mockResolvedValueOnce(undefined as any);
|
|
193
|
+
|
|
194
|
+
const apiKey = await APIKey.init();
|
|
195
|
+
const result = await apiKey.revoke('abc123def456', loginUser, null, 'No longer needed');
|
|
196
|
+
|
|
197
|
+
expect(result.Status).toBe(APIKeyStatusEnum.REVOKED);
|
|
198
|
+
expect(result.RevokedReason).toBe('No longer needed');
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
});
|
|
@@ -1,80 +1,86 @@
|
|
|
1
|
-
import { Group } from '../../../../src/components/group/group';
|
|
2
|
-
import { GroupRepository } from '../../../../src/components/group/group.repository';
|
|
3
|
-
import { ClassError } from '@tomei/general';
|
|
4
|
-
import { GroupTypeEnum } from '../../../../src/enum/group-type.enum';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
expect(result
|
|
42
|
-
expect(result.
|
|
43
|
-
expect(result.
|
|
44
|
-
expect(result.
|
|
45
|
-
expect(result.
|
|
46
|
-
expect(result.
|
|
47
|
-
expect(result.
|
|
48
|
-
|
|
49
|
-
expect(
|
|
50
|
-
expect(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
1
|
+
import { Group } from '../../../../src/components/group/group';
|
|
2
|
+
import { GroupRepository } from '../../../../src/components/group/group.repository';
|
|
3
|
+
import { ClassError } from '@tomei/general';
|
|
4
|
+
import { GroupTypeEnum } from '../../../../src/enum/group-type.enum';
|
|
5
|
+
import { RedisService } from '../../../../src/redis-client/redis.service';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
describe('Group', () => {
|
|
9
|
+
beforeAll(() => {
|
|
10
|
+
process.env.REDIS_HOST = 'localhost';
|
|
11
|
+
process.env.REDIS_PORT = '6379';
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
jest.clearAllMocks();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should initialize a group with valid GroupCode', async () => {
|
|
19
|
+
const groupAttr = {
|
|
20
|
+
GroupCode: 'group1',
|
|
21
|
+
Name: 'Group 1',
|
|
22
|
+
Description: 'This is Group 1',
|
|
23
|
+
Type: GroupTypeEnum.ROLE,
|
|
24
|
+
ParentGroupCode: 'parentGroup1',
|
|
25
|
+
InheritParentPrivilegeYN: 'Y',
|
|
26
|
+
InheritParentSystemAccessYN: 'N',
|
|
27
|
+
Status: 'Active',
|
|
28
|
+
CreatedById: 1,
|
|
29
|
+
CreatedAt: new Date(),
|
|
30
|
+
UpdatedById: 2,
|
|
31
|
+
UpdatedAt: new Date(),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockResolvedValueOnce({
|
|
35
|
+
...groupAttr,
|
|
36
|
+
get: () => groupAttr,
|
|
37
|
+
} as any);
|
|
38
|
+
|
|
39
|
+
const result = await Group.init(null, 'group1');
|
|
40
|
+
|
|
41
|
+
expect(result).toBeInstanceOf(Group);
|
|
42
|
+
expect(result.GroupCode).toBe(groupAttr.GroupCode);
|
|
43
|
+
expect(result.Name).toBe(groupAttr.Name);
|
|
44
|
+
expect(result.Description).toBe(groupAttr.Description);
|
|
45
|
+
expect(result.Type).toBe(groupAttr.Type);
|
|
46
|
+
expect(result.ParentGroupCode).toBe(groupAttr.ParentGroupCode);
|
|
47
|
+
expect(result.InheritParentPrivilegeYN).toBe(groupAttr.InheritParentPrivilegeYN);
|
|
48
|
+
expect(result.InheritParentSystemAccessYN).toBe(groupAttr.InheritParentSystemAccessYN);
|
|
49
|
+
expect(result.Status).toBe(groupAttr.Status);
|
|
50
|
+
expect(result.CreatedById).toBe(groupAttr.CreatedById);
|
|
51
|
+
expect(result.CreatedAt).toBe(groupAttr.CreatedAt);
|
|
52
|
+
expect(result.UpdatedById).toBe(groupAttr.UpdatedById);
|
|
53
|
+
expect(result.UpdatedAt).toBe(groupAttr.UpdatedAt);
|
|
54
|
+
|
|
55
|
+
expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
|
|
56
|
+
expect(groupRepositoryMock).toHaveBeenCalledWith('group1', {
|
|
57
|
+
transaction: null,
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should throw an error when initializing a group with invalid GroupCode', async () => {
|
|
62
|
+
const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockResolvedValueOnce(null);
|
|
63
|
+
|
|
64
|
+
await expect(Group.init(null, 'invalidGroupCode')).rejects.toThrow(
|
|
65
|
+
new ClassError('Group', 'GroupErrMsg01', 'Failed To Initialize Group')
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
|
|
69
|
+
expect(groupRepositoryMock).toHaveBeenCalledWith('invalidGroupCode', {
|
|
70
|
+
transaction: null,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should throw an error when initializing a group with an error', async () => {
|
|
75
|
+
const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockRejectedValueOnce(new Error('Database error'));
|
|
76
|
+
|
|
77
|
+
await expect(Group.init(null, 'group1')).rejects.toThrow(
|
|
78
|
+
new ClassError('Group', 'GroupErrMsg01', 'Failed To Initialize Group')
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
|
|
82
|
+
expect(groupRepositoryMock).toHaveBeenCalledWith('group1', {
|
|
83
|
+
transaction: null,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
80
86
|
});
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
import { GroupObjectPrivilegeRepository } from '../../../../src/components/group-object-privilege/group-object-privilege.repository';
|
|
2
|
-
import { GroupObjectPrivilege } from '../../../../src/components/group-object-privilege/group-object-privilege';
|
|
3
|
-
|
|
4
|
-
describe('GroupObjectPrivilege', () => {
|
|
5
|
-
let groupObjectPrivilege: GroupObjectPrivilege;
|
|
6
|
-
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
groupObjectPrivilege = new GroupObjectPrivilege();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it('should create an instance of GroupObjectPrivilege', () => {
|
|
12
|
-
expect(groupObjectPrivilege).toBeInstanceOf(GroupObjectPrivilege);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it('should have the correct TableName', () => {
|
|
16
|
-
expect(groupObjectPrivilege.TableName).toBe('sso_GroupObjectPrivilege');
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('should have the correct properties', () => {
|
|
20
|
-
expect(groupObjectPrivilege.ObjectName).toBeUndefined();
|
|
21
|
-
expect(groupObjectPrivilege.GroupObjectPrivilegeId).toBeUndefined();
|
|
22
|
-
expect(groupObjectPrivilege.GroupCode).toBeUndefined();
|
|
23
|
-
expect(groupObjectPrivilege.SystemPrivilegeId).toBeUndefined();
|
|
24
|
-
expect(groupObjectPrivilege.ObjectId).toBeUndefined();
|
|
25
|
-
expect(groupObjectPrivilege.ObjectType).toBeUndefined();
|
|
26
|
-
expect(groupObjectPrivilege.CreatedAt).toBeUndefined();
|
|
27
|
-
expect(groupObjectPrivilege.UpdatedAt).toBeUndefined();
|
|
28
|
-
expect(groupObjectPrivilege.CreatedById).toBeUndefined();
|
|
29
|
-
expect(groupObjectPrivilege.UpdatedById).toBeUndefined();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('init', () => {
|
|
33
|
-
it('should return an instance of GroupObjectPrivilege when GroupObjectPrivilegeId is provided', async () => {
|
|
34
|
-
const GroupObjectPrivilegeId = 1;
|
|
35
|
-
const mockGroupObjectPrivilegeAttr = {
|
|
36
|
-
GroupObjectPrivilegeId,
|
|
37
|
-
GroupCode: 'groupCode',
|
|
38
|
-
SystemPrivilegeId: 'SystemPrivilegeId',
|
|
39
|
-
ObjectId: 'objectId',
|
|
40
|
-
ObjectType: 'objectType',
|
|
41
|
-
CreatedAt: new Date(),
|
|
42
|
-
UpdatedAt: new Date(),
|
|
43
|
-
CreatedById: 1,
|
|
44
|
-
UpdatedById: 2,
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce({
|
|
48
|
-
get: () => mockGroupObjectPrivilegeAttr,
|
|
49
|
-
} as any);
|
|
50
|
-
|
|
51
|
-
const result = await GroupObjectPrivilege.init(null, GroupObjectPrivilegeId);
|
|
52
|
-
|
|
53
|
-
expect(result).toBeInstanceOf(GroupObjectPrivilege);
|
|
54
|
-
expect(result.GroupObjectPrivilegeId).toBe(GroupObjectPrivilegeId);
|
|
55
|
-
expect(result.GroupCode).toBe(mockGroupObjectPrivilegeAttr.GroupCode);
|
|
56
|
-
expect(result.SystemPrivilegeId).toBe(mockGroupObjectPrivilegeAttr.SystemPrivilegeId);
|
|
57
|
-
expect(result.ObjectId).toBe(mockGroupObjectPrivilegeAttr.ObjectId);
|
|
58
|
-
expect(result.ObjectType).toBe(mockGroupObjectPrivilegeAttr.ObjectType);
|
|
59
|
-
expect(result.CreatedAt).toBe(mockGroupObjectPrivilegeAttr.CreatedAt);
|
|
60
|
-
expect(result.UpdatedAt).toBe(mockGroupObjectPrivilegeAttr.UpdatedAt);
|
|
61
|
-
expect(result.CreatedById).toBe(mockGroupObjectPrivilegeAttr.CreatedById);
|
|
62
|
-
expect(result.UpdatedById).toBe(mockGroupObjectPrivilegeAttr.UpdatedById);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('should throw an error when GroupObjectPrivilegeId is provided but no GroupObjectPrivilege is found', async () => {
|
|
66
|
-
const GroupObjectPrivilegeId = 1;
|
|
67
|
-
jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce(null);
|
|
68
|
-
|
|
69
|
-
await expect(GroupObjectPrivilege.init(null, GroupObjectPrivilegeId)).rejects.toThrow(
|
|
70
|
-
'GroupObjectPrivilege not found',
|
|
71
|
-
);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('should return a new instance of GroupObjectPrivilege when GroupObjectPrivilegeId is not provided', async () => {
|
|
75
|
-
const result = await GroupObjectPrivilege.init();
|
|
76
|
-
|
|
77
|
-
expect(result).toBeInstanceOf(GroupObjectPrivilege);
|
|
78
|
-
expect(result.GroupObjectPrivilegeId).toBeUndefined();
|
|
79
|
-
expect(result.GroupCode).toBeUndefined();
|
|
80
|
-
expect(result.SystemPrivilegeId).toBeUndefined();
|
|
81
|
-
expect(result.ObjectId).toBeUndefined();
|
|
82
|
-
expect(result.ObjectType).toBeUndefined();
|
|
83
|
-
expect(result.CreatedAt).toBeUndefined();
|
|
84
|
-
expect(result.UpdatedAt).toBeUndefined();
|
|
85
|
-
expect(result.CreatedById).toBeUndefined();
|
|
86
|
-
expect(result.UpdatedById).toBeUndefined();
|
|
87
|
-
});
|
|
88
|
-
});
|
|
1
|
+
import { GroupObjectPrivilegeRepository } from '../../../../src/components/group-object-privilege/group-object-privilege.repository';
|
|
2
|
+
import { GroupObjectPrivilege } from '../../../../src/components/group-object-privilege/group-object-privilege';
|
|
3
|
+
|
|
4
|
+
describe('GroupObjectPrivilege', () => {
|
|
5
|
+
let groupObjectPrivilege: GroupObjectPrivilege;
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
groupObjectPrivilege = new GroupObjectPrivilege();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('should create an instance of GroupObjectPrivilege', () => {
|
|
12
|
+
expect(groupObjectPrivilege).toBeInstanceOf(GroupObjectPrivilege);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should have the correct TableName', () => {
|
|
16
|
+
expect(groupObjectPrivilege.TableName).toBe('sso_GroupObjectPrivilege');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('should have the correct properties', () => {
|
|
20
|
+
expect(groupObjectPrivilege.ObjectName).toBeUndefined();
|
|
21
|
+
expect(groupObjectPrivilege.GroupObjectPrivilegeId).toBeUndefined();
|
|
22
|
+
expect(groupObjectPrivilege.GroupCode).toBeUndefined();
|
|
23
|
+
expect(groupObjectPrivilege.SystemPrivilegeId).toBeUndefined();
|
|
24
|
+
expect(groupObjectPrivilege.ObjectId).toBeUndefined();
|
|
25
|
+
expect(groupObjectPrivilege.ObjectType).toBeUndefined();
|
|
26
|
+
expect(groupObjectPrivilege.CreatedAt).toBeUndefined();
|
|
27
|
+
expect(groupObjectPrivilege.UpdatedAt).toBeUndefined();
|
|
28
|
+
expect(groupObjectPrivilege.CreatedById).toBeUndefined();
|
|
29
|
+
expect(groupObjectPrivilege.UpdatedById).toBeUndefined();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('init', () => {
|
|
33
|
+
it('should return an instance of GroupObjectPrivilege when GroupObjectPrivilegeId is provided', async () => {
|
|
34
|
+
const GroupObjectPrivilegeId = 1;
|
|
35
|
+
const mockGroupObjectPrivilegeAttr = {
|
|
36
|
+
GroupObjectPrivilegeId,
|
|
37
|
+
GroupCode: 'groupCode',
|
|
38
|
+
SystemPrivilegeId: 'SystemPrivilegeId',
|
|
39
|
+
ObjectId: 'objectId',
|
|
40
|
+
ObjectType: 'objectType',
|
|
41
|
+
CreatedAt: new Date(),
|
|
42
|
+
UpdatedAt: new Date(),
|
|
43
|
+
CreatedById: 1,
|
|
44
|
+
UpdatedById: 2,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce({
|
|
48
|
+
get: () => mockGroupObjectPrivilegeAttr,
|
|
49
|
+
} as any);
|
|
50
|
+
|
|
51
|
+
const result = await GroupObjectPrivilege.init(null, GroupObjectPrivilegeId);
|
|
52
|
+
|
|
53
|
+
expect(result).toBeInstanceOf(GroupObjectPrivilege);
|
|
54
|
+
expect(result.GroupObjectPrivilegeId).toBe(GroupObjectPrivilegeId);
|
|
55
|
+
expect(result.GroupCode).toBe(mockGroupObjectPrivilegeAttr.GroupCode);
|
|
56
|
+
expect(result.SystemPrivilegeId).toBe(mockGroupObjectPrivilegeAttr.SystemPrivilegeId);
|
|
57
|
+
expect(result.ObjectId).toBe(mockGroupObjectPrivilegeAttr.ObjectId);
|
|
58
|
+
expect(result.ObjectType).toBe(mockGroupObjectPrivilegeAttr.ObjectType);
|
|
59
|
+
expect(result.CreatedAt).toBe(mockGroupObjectPrivilegeAttr.CreatedAt);
|
|
60
|
+
expect(result.UpdatedAt).toBe(mockGroupObjectPrivilegeAttr.UpdatedAt);
|
|
61
|
+
expect(result.CreatedById).toBe(mockGroupObjectPrivilegeAttr.CreatedById);
|
|
62
|
+
expect(result.UpdatedById).toBe(mockGroupObjectPrivilegeAttr.UpdatedById);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should throw an error when GroupObjectPrivilegeId is provided but no GroupObjectPrivilege is found', async () => {
|
|
66
|
+
const GroupObjectPrivilegeId = 1;
|
|
67
|
+
jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce(null);
|
|
68
|
+
|
|
69
|
+
await expect(GroupObjectPrivilege.init(null, GroupObjectPrivilegeId)).rejects.toThrow(
|
|
70
|
+
'GroupObjectPrivilege not found',
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should return a new instance of GroupObjectPrivilege when GroupObjectPrivilegeId is not provided', async () => {
|
|
75
|
+
const result = await GroupObjectPrivilege.init();
|
|
76
|
+
|
|
77
|
+
expect(result).toBeInstanceOf(GroupObjectPrivilege);
|
|
78
|
+
expect(result.GroupObjectPrivilegeId).toBeUndefined();
|
|
79
|
+
expect(result.GroupCode).toBeUndefined();
|
|
80
|
+
expect(result.SystemPrivilegeId).toBeUndefined();
|
|
81
|
+
expect(result.ObjectId).toBeUndefined();
|
|
82
|
+
expect(result.ObjectType).toBeUndefined();
|
|
83
|
+
expect(result.CreatedAt).toBeUndefined();
|
|
84
|
+
expect(result.UpdatedAt).toBeUndefined();
|
|
85
|
+
expect(result.CreatedById).toBeUndefined();
|
|
86
|
+
expect(result.UpdatedById).toBeUndefined();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
89
|
});
|