@nextsparkjs/theme-default 0.1.0-beta.22 → 0.1.0-beta.25
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/LICENSE +21 -0
- package/package.json +3 -3
- package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
- package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +155 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
- package/tests/jest/__mocks__/jose.js +22 -0
- package/tests/jest/__mocks__/next/image.js +15 -0
- package/tests/jest/__mocks__/next-server.js +56 -0
- package/tests/jest/jest.config.cjs +138 -0
- package/tests/jest/langchain/streaming.test.ts +6 -3
- package/tests/jest/services/tasks.service.test.ts +707 -0
- package/tests/jest/setup.ts +170 -0
- package/tests/jest/tsconfig.jest.json +6 -0
- package/tests/jest/config/role-config.test.ts +0 -529
- package/tests/jest/jest.config.ts +0 -81
- package/tests/jest/user-roles/role-helpers.test.ts +0 -432
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Jest Configuration for Default Theme
|
|
3
|
-
*
|
|
4
|
-
* This config is automatically loaded by the theme test runner.
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* pnpm test:theme # Run theme tests
|
|
8
|
-
* pnpm test:theme:watch # Watch mode
|
|
9
|
-
* pnpm test:theme:coverage # With coverage
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { Config } from 'jest'
|
|
13
|
-
|
|
14
|
-
const config: Config = {
|
|
15
|
-
displayName: 'theme-default',
|
|
16
|
-
rootDir: '../../../../..',
|
|
17
|
-
|
|
18
|
-
// Test file patterns
|
|
19
|
-
testMatch: [
|
|
20
|
-
'<rootDir>/contents/themes/default/tests/jest/**/*.{test,spec}.{js,ts,tsx}',
|
|
21
|
-
],
|
|
22
|
-
testPathIgnorePatterns: [
|
|
23
|
-
'<rootDir>/node_modules/',
|
|
24
|
-
'<rootDir>/.next/',
|
|
25
|
-
],
|
|
26
|
-
|
|
27
|
-
// Preset and environment
|
|
28
|
-
preset: 'ts-jest',
|
|
29
|
-
testEnvironment: 'jsdom',
|
|
30
|
-
|
|
31
|
-
// Module resolution (aliases @/)
|
|
32
|
-
// IMPORTANT: More specific patterns MUST come before generic ones
|
|
33
|
-
moduleNameMapper: {
|
|
34
|
-
'^@nextsparkjs/core/(.*)$': '<rootDir>/packages/core/$1',
|
|
35
|
-
'^@/contents/(.*)$': '<rootDir>/contents/$1',
|
|
36
|
-
'^@/entities/(.*)$': '<rootDir>/contents/entities/$1',
|
|
37
|
-
'^@/plugins/(.*)$': '<rootDir>/contents/plugins/$1',
|
|
38
|
-
'^@/themes/(.*)$': '<rootDir>/contents/themes/$1',
|
|
39
|
-
'^@/(.*)$': '<rootDir>/$1',
|
|
40
|
-
'next/server': '<rootDir>/packages/core/tests/jest/__mocks__/next-server.js',
|
|
41
|
-
'^jose$': '<rootDir>/packages/core/tests/jest/__mocks__/jose.js',
|
|
42
|
-
'^jose/(.*)$': '<rootDir>/packages/core/tests/jest/__mocks__/jose.js',
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
// Setup files
|
|
46
|
-
setupFilesAfterEnv: ['<rootDir>/packages/core/tests/setup.ts'],
|
|
47
|
-
|
|
48
|
-
// Transform configuration
|
|
49
|
-
transform: {
|
|
50
|
-
'^.+\\.(ts|tsx)$': [
|
|
51
|
-
'ts-jest',
|
|
52
|
-
{
|
|
53
|
-
tsconfig: 'tsconfig.test.json',
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
// Transform ignore patterns
|
|
59
|
-
transformIgnorePatterns: [
|
|
60
|
-
'node_modules/(?!(uncrypto|better-auth|@noble|.*jose.*|remark.*|unified.*|.*\\.mjs$))',
|
|
61
|
-
'node_modules/\\.pnpm/(?!(.*uncrypto.*|.*better-auth.*|.*@noble.*|.*jose.*|.*remark.*|.*unified.*|.*\\.mjs$))',
|
|
62
|
-
],
|
|
63
|
-
|
|
64
|
-
// File extensions
|
|
65
|
-
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
|
|
66
|
-
|
|
67
|
-
// Test timeout
|
|
68
|
-
testTimeout: 10000,
|
|
69
|
-
|
|
70
|
-
// Verbose output
|
|
71
|
-
verbose: true,
|
|
72
|
-
|
|
73
|
-
// Force exit after tests complete
|
|
74
|
-
forceExit: true,
|
|
75
|
-
|
|
76
|
-
// Coverage output directory
|
|
77
|
-
coverageDirectory: '<rootDir>/contents/themes/default/tests/jest/coverage',
|
|
78
|
-
coverageReporters: ['text', 'lcov', 'html'],
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export default config
|
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit Tests - User Role Helper Functions
|
|
3
|
-
*
|
|
4
|
-
* Tests role helper functions for Developer Area feature:
|
|
5
|
-
* - isDeveloper(): Check if user is developer
|
|
6
|
-
* - canAccessAdmin(): Check if user has Sector7 access
|
|
7
|
-
* - hasRoleLevel(): Hierarchy comparison with developer role
|
|
8
|
-
* - getAllRolesByHierarchy(): Verify developer is first (highest)
|
|
9
|
-
*
|
|
10
|
-
* Focus on developer role integration with existing role system.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { roleHelpers, USER_ROLES, ROLE_HIERARCHY, type UserRole } from '@nextsparkjs/core/types/user.types'
|
|
14
|
-
|
|
15
|
-
describe('User Role Helpers - Developer Role Integration', () => {
|
|
16
|
-
describe('isDeveloper()', () => {
|
|
17
|
-
it('should return true for developer role', () => {
|
|
18
|
-
const result = roleHelpers.isDeveloper(USER_ROLES.DEVELOPER)
|
|
19
|
-
expect(result).toBe(true)
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('should return false for superadmin role', () => {
|
|
23
|
-
const result = roleHelpers.isDeveloper(USER_ROLES.SUPERADMIN)
|
|
24
|
-
expect(result).toBe(false)
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('should return false for member role', () => {
|
|
28
|
-
const result = roleHelpers.isDeveloper(USER_ROLES.MEMBER)
|
|
29
|
-
expect(result).toBe(false)
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
it('should handle string literal "developer"', () => {
|
|
33
|
-
const result = roleHelpers.isDeveloper('developer' as UserRole)
|
|
34
|
-
expect(result).toBe(true)
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('should handle case-sensitive comparison', () => {
|
|
38
|
-
// Should fail because role names are lowercase
|
|
39
|
-
const result = roleHelpers.isDeveloper('Developer' as UserRole)
|
|
40
|
-
expect(result).toBe(false)
|
|
41
|
-
})
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
describe('canAccessAdmin()', () => {
|
|
45
|
-
it('should return true for developer role', () => {
|
|
46
|
-
const result = roleHelpers.canAccessAdmin(USER_ROLES.DEVELOPER)
|
|
47
|
-
expect(result).toBe(true)
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('should return true for superadmin role', () => {
|
|
51
|
-
const result = roleHelpers.canAccessAdmin(USER_ROLES.SUPERADMIN)
|
|
52
|
-
expect(result).toBe(true)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('should return false for member role', () => {
|
|
56
|
-
const result = roleHelpers.canAccessAdmin(USER_ROLES.MEMBER)
|
|
57
|
-
expect(result).toBe(false)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('should handle string literal "developer"', () => {
|
|
61
|
-
const result = roleHelpers.canAccessAdmin('developer' as UserRole)
|
|
62
|
-
expect(result).toBe(true)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('should handle string literal "superadmin"', () => {
|
|
66
|
-
const result = roleHelpers.canAccessAdmin('superadmin' as UserRole)
|
|
67
|
-
expect(result).toBe(true)
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('should handle both privileged roles', () => {
|
|
71
|
-
// Verify both roles have access (dual access pattern)
|
|
72
|
-
const developerAccess = roleHelpers.canAccessAdmin(USER_ROLES.DEVELOPER)
|
|
73
|
-
const superadminAccess = roleHelpers.canAccessAdmin(USER_ROLES.SUPERADMIN)
|
|
74
|
-
|
|
75
|
-
expect(developerAccess).toBe(true)
|
|
76
|
-
expect(superadminAccess).toBe(true)
|
|
77
|
-
})
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
describe('isSuperAdmin()', () => {
|
|
81
|
-
it('should return true for superadmin role', () => {
|
|
82
|
-
const result = roleHelpers.isSuperAdmin(USER_ROLES.SUPERADMIN)
|
|
83
|
-
expect(result).toBe(true)
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
it('should return false for developer role', () => {
|
|
87
|
-
// Developer is NOT superadmin (separate role)
|
|
88
|
-
const result = roleHelpers.isSuperAdmin(USER_ROLES.DEVELOPER)
|
|
89
|
-
expect(result).toBe(false)
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('should return false for member role', () => {
|
|
93
|
-
const result = roleHelpers.isSuperAdmin(USER_ROLES.MEMBER)
|
|
94
|
-
expect(result).toBe(false)
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
describe('hasRoleLevel() - Developer Hierarchy', () => {
|
|
99
|
-
it('should confirm developer has higher level than superadmin', () => {
|
|
100
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.DEVELOPER, USER_ROLES.SUPERADMIN)
|
|
101
|
-
expect(result).toBe(true)
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('should confirm developer has higher level than member', () => {
|
|
105
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.DEVELOPER, USER_ROLES.MEMBER)
|
|
106
|
-
expect(result).toBe(true)
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('should confirm superadmin does NOT have developer level', () => {
|
|
110
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.SUPERADMIN, USER_ROLES.DEVELOPER)
|
|
111
|
-
expect(result).toBe(false)
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
it('should confirm member does NOT have developer level', () => {
|
|
115
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.MEMBER, USER_ROLES.DEVELOPER)
|
|
116
|
-
expect(result).toBe(false)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should confirm developer equals developer level', () => {
|
|
120
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.DEVELOPER, USER_ROLES.DEVELOPER)
|
|
121
|
-
expect(result).toBe(true)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should confirm superadmin has superadmin level', () => {
|
|
125
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.SUPERADMIN, USER_ROLES.SUPERADMIN)
|
|
126
|
-
expect(result).toBe(true)
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
it('should confirm superadmin has higher level than member', () => {
|
|
130
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.SUPERADMIN, USER_ROLES.MEMBER)
|
|
131
|
-
expect(result).toBe(true)
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('should confirm member does NOT have superadmin level', () => {
|
|
135
|
-
const result = roleHelpers.hasRoleLevel(USER_ROLES.MEMBER, USER_ROLES.SUPERADMIN)
|
|
136
|
-
expect(result).toBe(false)
|
|
137
|
-
})
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
describe('getAllRolesByHierarchy() - Developer First', () => {
|
|
141
|
-
it('should return developer as first role (highest hierarchy)', () => {
|
|
142
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
143
|
-
|
|
144
|
-
expect(roles[0]).toBe(USER_ROLES.DEVELOPER)
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('should return superadmin as second role', () => {
|
|
148
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
149
|
-
|
|
150
|
-
expect(roles[1]).toBe(USER_ROLES.SUPERADMIN)
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
it('should return member as last role (lowest hierarchy)', () => {
|
|
154
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
155
|
-
|
|
156
|
-
expect(roles[roles.length - 1]).toBe(USER_ROLES.MEMBER)
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
it('should return all roles in descending hierarchy order', () => {
|
|
160
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
161
|
-
|
|
162
|
-
expect(roles).toEqual([
|
|
163
|
-
USER_ROLES.DEVELOPER, // 100
|
|
164
|
-
USER_ROLES.SUPERADMIN, // 99
|
|
165
|
-
USER_ROLES.MEMBER // 1
|
|
166
|
-
])
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
it('should return array with correct length', () => {
|
|
170
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
171
|
-
|
|
172
|
-
expect(roles.length).toBe(3)
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
it('should not mutate original roles array', () => {
|
|
176
|
-
const roles1 = roleHelpers.getAllRolesByHierarchy()
|
|
177
|
-
const roles2 = roleHelpers.getAllRolesByHierarchy()
|
|
178
|
-
|
|
179
|
-
expect(roles1).toEqual(roles2)
|
|
180
|
-
expect(roles1).not.toBe(roles2) // Different array instances
|
|
181
|
-
})
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
describe('getRoleDisplayKey()', () => {
|
|
185
|
-
it('should return translation key for developer role', () => {
|
|
186
|
-
const key = roleHelpers.getRoleDisplayKey(USER_ROLES.DEVELOPER)
|
|
187
|
-
|
|
188
|
-
expect(key).toBe('common.userRoles.developer')
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
it('should return translation key for superadmin role', () => {
|
|
192
|
-
const key = roleHelpers.getRoleDisplayKey(USER_ROLES.SUPERADMIN)
|
|
193
|
-
|
|
194
|
-
expect(key).toBe('common.userRoles.superadmin')
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
it('should return translation key for member role', () => {
|
|
198
|
-
const key = roleHelpers.getRoleDisplayKey(USER_ROLES.MEMBER)
|
|
199
|
-
|
|
200
|
-
expect(key).toBe('common.userRoles.member')
|
|
201
|
-
})
|
|
202
|
-
})
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
describe('Role Hierarchy Configuration', () => {
|
|
206
|
-
describe('ROLE_HIERARCHY Values', () => {
|
|
207
|
-
it('should have developer at hierarchy level 100', () => {
|
|
208
|
-
expect(ROLE_HIERARCHY.developer).toBe(100)
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
it('should have superadmin at hierarchy level 99', () => {
|
|
212
|
-
expect(ROLE_HIERARCHY.superadmin).toBe(99)
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
it('should have member at hierarchy level 1', () => {
|
|
216
|
-
expect(ROLE_HIERARCHY.member).toBe(1)
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
it('should have developer as highest hierarchy', () => {
|
|
220
|
-
const developerLevel = ROLE_HIERARCHY.developer
|
|
221
|
-
const superadminLevel = ROLE_HIERARCHY.superadmin
|
|
222
|
-
const memberLevel = ROLE_HIERARCHY.member
|
|
223
|
-
|
|
224
|
-
expect(developerLevel).toBeGreaterThan(superadminLevel)
|
|
225
|
-
expect(developerLevel).toBeGreaterThan(memberLevel)
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
it('should have superadmin higher than member', () => {
|
|
229
|
-
const superadminLevel = ROLE_HIERARCHY.superadmin
|
|
230
|
-
const memberLevel = ROLE_HIERARCHY.member
|
|
231
|
-
|
|
232
|
-
expect(superadminLevel).toBeGreaterThan(memberLevel)
|
|
233
|
-
})
|
|
234
|
-
|
|
235
|
-
it('should have numeric values for all roles', () => {
|
|
236
|
-
expect(typeof ROLE_HIERARCHY.developer).toBe('number')
|
|
237
|
-
expect(typeof ROLE_HIERARCHY.superadmin).toBe('number')
|
|
238
|
-
expect(typeof ROLE_HIERARCHY.member).toBe('number')
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
it('should have positive values for all roles', () => {
|
|
242
|
-
expect(ROLE_HIERARCHY.developer).toBeGreaterThan(0)
|
|
243
|
-
expect(ROLE_HIERARCHY.superadmin).toBeGreaterThan(0)
|
|
244
|
-
expect(ROLE_HIERARCHY.member).toBeGreaterThan(0)
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
it('should maintain expected hierarchy gap', () => {
|
|
248
|
-
// Developer (100) is 1 level above superadmin (99)
|
|
249
|
-
expect(ROLE_HIERARCHY.developer - ROLE_HIERARCHY.superadmin).toBe(1)
|
|
250
|
-
|
|
251
|
-
// Large gap between superadmin (99) and member (1)
|
|
252
|
-
expect(ROLE_HIERARCHY.superadmin - ROLE_HIERARCHY.member).toBe(98)
|
|
253
|
-
})
|
|
254
|
-
})
|
|
255
|
-
|
|
256
|
-
describe('USER_ROLES Constants', () => {
|
|
257
|
-
it('should have DEVELOPER constant', () => {
|
|
258
|
-
expect(USER_ROLES.DEVELOPER).toBe('developer')
|
|
259
|
-
})
|
|
260
|
-
|
|
261
|
-
it('should have SUPERADMIN constant', () => {
|
|
262
|
-
expect(USER_ROLES.SUPERADMIN).toBe('superadmin')
|
|
263
|
-
})
|
|
264
|
-
|
|
265
|
-
it('should have MEMBER constant', () => {
|
|
266
|
-
expect(USER_ROLES.MEMBER).toBe('member')
|
|
267
|
-
})
|
|
268
|
-
|
|
269
|
-
it('should have all constants as lowercase strings', () => {
|
|
270
|
-
expect(USER_ROLES.DEVELOPER).toBe(USER_ROLES.DEVELOPER.toLowerCase())
|
|
271
|
-
expect(USER_ROLES.SUPERADMIN).toBe(USER_ROLES.SUPERADMIN.toLowerCase())
|
|
272
|
-
expect(USER_ROLES.MEMBER).toBe(USER_ROLES.MEMBER.toLowerCase())
|
|
273
|
-
})
|
|
274
|
-
})
|
|
275
|
-
})
|
|
276
|
-
|
|
277
|
-
describe('Edge Cases and Error Handling', () => {
|
|
278
|
-
describe('hasRoleLevel() Edge Cases', () => {
|
|
279
|
-
it('should handle null-like values gracefully', () => {
|
|
280
|
-
// These would fail TypeScript compile-time but test runtime behavior
|
|
281
|
-
const result = roleHelpers.hasRoleLevel(
|
|
282
|
-
undefined as unknown as UserRole,
|
|
283
|
-
USER_ROLES.MEMBER
|
|
284
|
-
)
|
|
285
|
-
|
|
286
|
-
expect(result).toBe(false)
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
it('should handle comparing same role multiple times', () => {
|
|
290
|
-
const result1 = roleHelpers.hasRoleLevel(USER_ROLES.DEVELOPER, USER_ROLES.DEVELOPER)
|
|
291
|
-
const result2 = roleHelpers.hasRoleLevel(USER_ROLES.DEVELOPER, USER_ROLES.DEVELOPER)
|
|
292
|
-
|
|
293
|
-
expect(result1).toBe(result2)
|
|
294
|
-
expect(result1).toBe(true)
|
|
295
|
-
})
|
|
296
|
-
})
|
|
297
|
-
|
|
298
|
-
describe('isDeveloper() Edge Cases', () => {
|
|
299
|
-
it('should handle whitespace in role name', () => {
|
|
300
|
-
const result = roleHelpers.isDeveloper(' developer ' as UserRole)
|
|
301
|
-
expect(result).toBe(false) // Exact match required
|
|
302
|
-
})
|
|
303
|
-
|
|
304
|
-
it('should handle empty string', () => {
|
|
305
|
-
const result = roleHelpers.isDeveloper('' as UserRole)
|
|
306
|
-
expect(result).toBe(false)
|
|
307
|
-
})
|
|
308
|
-
})
|
|
309
|
-
|
|
310
|
-
describe('canAccessAdmin() Edge Cases', () => {
|
|
311
|
-
it('should handle invalid role gracefully', () => {
|
|
312
|
-
const result = roleHelpers.canAccessAdmin('invalid-role' as UserRole)
|
|
313
|
-
expect(result).toBe(false)
|
|
314
|
-
})
|
|
315
|
-
|
|
316
|
-
it('should handle null-like value', () => {
|
|
317
|
-
const result = roleHelpers.canAccessAdmin(null as unknown as UserRole)
|
|
318
|
-
expect(result).toBe(false)
|
|
319
|
-
})
|
|
320
|
-
|
|
321
|
-
it('should handle undefined', () => {
|
|
322
|
-
const result = roleHelpers.canAccessAdmin(undefined as unknown as UserRole)
|
|
323
|
-
expect(result).toBe(false)
|
|
324
|
-
})
|
|
325
|
-
})
|
|
326
|
-
})
|
|
327
|
-
|
|
328
|
-
describe('Real-World Use Cases', () => {
|
|
329
|
-
describe('Guard Logic Simulation', () => {
|
|
330
|
-
it('should allow developer through DeveloperGuard', () => {
|
|
331
|
-
const userRole: UserRole = 'developer'
|
|
332
|
-
const canAccess = roleHelpers.isDeveloper(userRole)
|
|
333
|
-
|
|
334
|
-
expect(canAccess).toBe(true)
|
|
335
|
-
})
|
|
336
|
-
|
|
337
|
-
it('should block superadmin from DeveloperGuard', () => {
|
|
338
|
-
const userRole: UserRole = 'superadmin'
|
|
339
|
-
const canAccess = roleHelpers.isDeveloper(userRole)
|
|
340
|
-
|
|
341
|
-
expect(canAccess).toBe(false)
|
|
342
|
-
})
|
|
343
|
-
|
|
344
|
-
it('should block member from DeveloperGuard', () => {
|
|
345
|
-
const userRole: UserRole = 'member'
|
|
346
|
-
const canAccess = roleHelpers.isDeveloper(userRole)
|
|
347
|
-
|
|
348
|
-
expect(canAccess).toBe(false)
|
|
349
|
-
})
|
|
350
|
-
|
|
351
|
-
it('should allow developer through SuperAdminGuard (Sector7)', () => {
|
|
352
|
-
const userRole: UserRole = 'developer'
|
|
353
|
-
const canAccess = roleHelpers.canAccessAdmin(userRole)
|
|
354
|
-
|
|
355
|
-
expect(canAccess).toBe(true)
|
|
356
|
-
})
|
|
357
|
-
|
|
358
|
-
it('should allow superadmin through SuperAdminGuard (Sector7)', () => {
|
|
359
|
-
const userRole: UserRole = 'superadmin'
|
|
360
|
-
const canAccess = roleHelpers.canAccessAdmin(userRole)
|
|
361
|
-
|
|
362
|
-
expect(canAccess).toBe(true)
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
it('should block member from SuperAdminGuard (Sector7)', () => {
|
|
366
|
-
const userRole: UserRole = 'member'
|
|
367
|
-
const canAccess = roleHelpers.canAccessAdmin(userRole)
|
|
368
|
-
|
|
369
|
-
expect(canAccess).toBe(false)
|
|
370
|
-
})
|
|
371
|
-
})
|
|
372
|
-
|
|
373
|
-
describe('Permission Checks', () => {
|
|
374
|
-
it('should grant developer access to all areas', () => {
|
|
375
|
-
const userRole: UserRole = 'developer'
|
|
376
|
-
|
|
377
|
-
const devArea = roleHelpers.isDeveloper(userRole)
|
|
378
|
-
const sector7 = roleHelpers.canAccessAdmin(userRole)
|
|
379
|
-
const hasAdminLevel = roleHelpers.hasRoleLevel(userRole, USER_ROLES.SUPERADMIN)
|
|
380
|
-
|
|
381
|
-
expect(devArea).toBe(true)
|
|
382
|
-
expect(sector7).toBe(true)
|
|
383
|
-
expect(hasAdminLevel).toBe(true)
|
|
384
|
-
})
|
|
385
|
-
|
|
386
|
-
it('should grant superadmin limited access (no /dev)', () => {
|
|
387
|
-
const userRole: UserRole = 'superadmin'
|
|
388
|
-
|
|
389
|
-
const devArea = roleHelpers.isDeveloper(userRole)
|
|
390
|
-
const sector7 = roleHelpers.canAccessAdmin(userRole)
|
|
391
|
-
const isSuperAdmin = roleHelpers.isSuperAdmin(userRole)
|
|
392
|
-
|
|
393
|
-
expect(devArea).toBe(false) // Cannot access /dev
|
|
394
|
-
expect(sector7).toBe(true) // Can access Sector7
|
|
395
|
-
expect(isSuperAdmin).toBe(true)
|
|
396
|
-
})
|
|
397
|
-
|
|
398
|
-
it('should grant member minimal access', () => {
|
|
399
|
-
const userRole: UserRole = 'member'
|
|
400
|
-
|
|
401
|
-
const devArea = roleHelpers.isDeveloper(userRole)
|
|
402
|
-
const sector7 = roleHelpers.canAccessAdmin(userRole)
|
|
403
|
-
const isSuperAdmin = roleHelpers.isSuperAdmin(userRole)
|
|
404
|
-
|
|
405
|
-
expect(devArea).toBe(false)
|
|
406
|
-
expect(sector7).toBe(false)
|
|
407
|
-
expect(isSuperAdmin).toBe(false)
|
|
408
|
-
})
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
describe('Role Display in UI', () => {
|
|
412
|
-
it('should provide translation keys for all roles', () => {
|
|
413
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
414
|
-
|
|
415
|
-
roles.forEach(role => {
|
|
416
|
-
const key = roleHelpers.getRoleDisplayKey(role)
|
|
417
|
-
expect(key).toContain('common.userRoles.')
|
|
418
|
-
})
|
|
419
|
-
})
|
|
420
|
-
|
|
421
|
-
it('should list roles in correct order for admin UI', () => {
|
|
422
|
-
const roles = roleHelpers.getAllRolesByHierarchy()
|
|
423
|
-
|
|
424
|
-
// Admin UI should show roles from most powerful to least
|
|
425
|
-
expect(roles).toEqual([
|
|
426
|
-
'developer',
|
|
427
|
-
'superadmin',
|
|
428
|
-
'member'
|
|
429
|
-
])
|
|
430
|
-
})
|
|
431
|
-
})
|
|
432
|
-
})
|