@@ -31,51 +31,62 @@ describe('Verify User Case: properties.view-all||properties.view-own', () => {
3131 // Test case 1: User has both permissions
3232 mockPageProps ( [ 'properties.view-all' , 'properties.view-own' ] ) ;
3333 let { result } = renderHook ( ( ) => usePermissions ( ) ) ;
34-
34+
3535 console . log ( '\n=== Test Case 1: User has BOTH permissions ===' ) ;
36- console . log ( 'User permissions:' , [ 'properties.view-all' , 'properties.view-own' ] ) ;
36+ console . log ( 'User permissions:' , [
37+ 'properties.view-all' ,
38+ 'properties.view-own' ,
39+ ] ) ;
3740 console . log ( 'Expression: "properties.view-all||properties.view-own"' ) ;
38-
39- const result1 = result . current . hasPermission ( 'properties.view-all||properties.view-own' ) ;
41+
42+ const result1 = result . current . hasPermission (
43+ 'properties.view-all||properties.view-own'
44+ ) ;
4045 console . log ( 'Result:' , result1 ) ;
4146 expect ( result1 ) . toBe ( true ) ;
4247 console . log ( '✅ PASS: Should return true when user has both permissions' ) ;
4348
4449 // Test case 2: User has only first permission
4550 mockPageProps ( [ 'properties.view-all' ] ) ;
4651 result = renderHook ( ( ) => usePermissions ( ) ) . result ;
47-
52+
4853 console . log ( '\n=== Test Case 2: User has FIRST permission only ===' ) ;
4954 console . log ( 'User permissions:' , [ 'properties.view-all' ] ) ;
5055 console . log ( 'Expression: "properties.view-all||properties.view-own"' ) ;
51-
52- const result2 = result . current . hasPermission ( 'properties.view-all||properties.view-own' ) ;
56+
57+ const result2 = result . current . hasPermission (
58+ 'properties.view-all||properties.view-own'
59+ ) ;
5360 console . log ( 'Result:' , result2 ) ;
5461 expect ( result2 ) . toBe ( true ) ;
5562 console . log ( '✅ PASS: Should return true when user has first permission' ) ;
5663
5764 // Test case 3: User has only second permission
5865 mockPageProps ( [ 'properties.view-own' ] ) ;
5966 result = renderHook ( ( ) => usePermissions ( ) ) . result ;
60-
67+
6168 console . log ( '\n=== Test Case 3: User has SECOND permission only ===' ) ;
6269 console . log ( 'User permissions:' , [ 'properties.view-own' ] ) ;
6370 console . log ( 'Expression: "properties.view-all||properties.view-own"' ) ;
64-
65- const result3 = result . current . hasPermission ( 'properties.view-all||properties.view-own' ) ;
71+
72+ const result3 = result . current . hasPermission (
73+ 'properties.view-all||properties.view-own'
74+ ) ;
6675 console . log ( 'Result:' , result3 ) ;
6776 expect ( result3 ) . toBe ( true ) ;
6877 console . log ( '✅ PASS: Should return true when user has second permission' ) ;
6978
7079 // Test case 4: User has neither permission
7180 mockPageProps ( [ ] ) ;
7281 result = renderHook ( ( ) => usePermissions ( ) ) . result ;
73-
82+
7483 console . log ( '\n=== Test Case 4: User has NO permissions ===' ) ;
7584 console . log ( 'User permissions:' , [ ] ) ;
7685 console . log ( 'Expression: "properties.view-all||properties.view-own"' ) ;
77-
78- const result4 = result . current . hasPermission ( 'properties.view-all||properties.view-own' ) ;
86+
87+ const result4 = result . current . hasPermission (
88+ 'properties.view-all||properties.view-own'
89+ ) ;
7990 console . log ( 'Result:' , result4 ) ;
8091 expect ( result4 ) . toBe ( false ) ;
8192 console . log ( '✅ PASS: Should return false when user has no permissions' ) ;
@@ -84,102 +95,126 @@ describe('Verify User Case: properties.view-all||properties.view-own', () => {
8495 it ( 'should work with different permission combinations' , ( ) => {
8596 // Test with different permission names to ensure the fix is general
8697 mockPageProps ( [ 'users.create' , 'posts.view' ] ) ;
87-
98+
8899 const { result } = renderHook ( ( ) => usePermissions ( ) ) ;
89-
100+
90101 console . log ( '\n=== Test with different permissions ===' ) ;
91102 console . log ( 'User permissions:' , [ 'users.create' , 'posts.view' ] ) ;
92-
103+
93104 // Test OR expression
94105 const orResult = result . current . hasPermission ( 'users.create||posts.view' ) ;
95106 console . log ( 'users.create||posts.view:' , orResult ) ;
96107 expect ( orResult ) . toBe ( true ) ;
97-
108+
98109 // Test AND expression
99110 const andResult = result . current . hasPermission ( 'users.create&&posts.view' ) ;
100111 console . log ( 'users.create&&posts.view:' , andResult ) ;
101112 expect ( andResult ) . toBe ( true ) ;
102-
113+
103114 // Test with one missing permission
104- const missingResult = result . current . hasPermission ( 'users.create||posts.delete' ) ;
115+ const missingResult = result . current . hasPermission (
116+ 'users.create||posts.delete'
117+ ) ;
105118 console . log ( 'users.create||posts.delete:' , missingResult ) ;
106119 expect ( missingResult ) . toBe ( true ) ;
107-
120+
108121 // Test with both missing permissions
109- const bothMissingResult = result . current . hasPermission ( 'users.delete||posts.delete' ) ;
122+ const bothMissingResult = result . current . hasPermission (
123+ 'users.delete||posts.delete'
124+ ) ;
110125 console . log ( 'users.delete||posts.delete:' , bothMissingResult ) ;
111126 expect ( bothMissingResult ) . toBe ( false ) ;
112-
113- console . log ( '✅ PASS: All different permission combinations work correctly' ) ;
127+
128+ console . log (
129+ '✅ PASS: All different permission combinations work correctly'
130+ ) ;
114131 } ) ;
115132
116133 it ( 'should work with hyphenated permission names' , ( ) => {
117134 // Test specifically with hyphenated permissions like the user's case
118- mockPageProps ( [ 'user-profile.edit' , 'api-access.read' , 'system-config.update' ] ) ;
119-
135+ mockPageProps ( [
136+ 'user-profile.edit' ,
137+ 'api-access.read' ,
138+ 'system-config.update' ,
139+ ] ) ;
140+
120141 const { result } = renderHook ( ( ) => usePermissions ( ) ) ;
121-
142+
122143 console . log ( '\n=== Test with hyphenated permissions ===' ) ;
123- console . log ( 'User permissions:' , [ 'user-profile.edit' , 'api-access.read' , 'system-config.update' ] ) ;
124-
144+ console . log ( 'User permissions:' , [
145+ 'user-profile.edit' ,
146+ 'api-access.read' ,
147+ 'system-config.update' ,
148+ ] ) ;
149+
125150 // Test OR with hyphens
126- const orResult = result . current . hasPermission ( 'user-profile.edit||api-access.read' ) ;
151+ const orResult = result . current . hasPermission (
152+ 'user-profile.edit||api-access.read'
153+ ) ;
127154 console . log ( 'user-profile.edit||api-access.read:' , orResult ) ;
128155 expect ( orResult ) . toBe ( true ) ;
129-
156+
130157 // Test AND with hyphens
131- const andResult = result . current . hasPermission ( 'user-profile.edit&&api-access.read' ) ;
158+ const andResult = result . current . hasPermission (
159+ 'user-profile.edit&&api-access.read'
160+ ) ;
132161 console . log ( 'user-profile.edit&&api-access.read:' , andResult ) ;
133162 expect ( andResult ) . toBe ( true ) ;
134-
163+
135164 // Test complex expression with hyphens
136- const complexResult = result . current . hasPermission ( '(user-profile.edit||api-access.read)&&system-config.update' ) ;
137- console . log ( '(user-profile.edit||api-access.read)&&system-config.update:' , complexResult ) ;
165+ const complexResult = result . current . hasPermission (
166+ '(user-profile.edit||api-access.read)&&system-config.update'
167+ ) ;
168+ console . log (
169+ '(user-profile.edit||api-access.read)&&system-config.update:' ,
170+ complexResult
171+ ) ;
138172 expect ( complexResult ) . toBe ( true ) ;
139-
173+
140174 console . log ( '✅ PASS: Hyphenated permission names work correctly' ) ;
141175 } ) ;
142176
143177 it ( 'should debug the evaluation process step by step' , ( ) => {
144178 mockPageProps ( [ 'properties.view-all' , 'properties.view-own' ] ) ;
145-
179+
146180 const { result } = renderHook ( ( ) => usePermissions ( ) ) ;
147-
181+
148182 console . log ( '\n=== Step-by-step debugging ===' ) ;
149- console . log ( 'User permissions:' , [ 'properties.view-all' , 'properties.view-own' ] ) ;
150-
183+ console . log ( 'User permissions:' , [
184+ 'properties.view-all' ,
185+ 'properties.view-own' ,
186+ ] ) ;
187+
151188 const expression = 'properties.view-all||properties.view-own' ;
152189 console . log ( 'Original expression:' , expression ) ;
153-
190+
154191 // Let's manually trace through the normalization process
155192 let jsExpression = expression ;
156-
193+
157194 // Step 1: Replace double operators with markers
158195 jsExpression = jsExpression
159196 . replace ( / \| \| / g, ' DOUBLE_PIPE ' )
160197 . replace ( / & & / g, ' DOUBLE_AMP ' ) ;
161198 console . log ( 'After double operator replacement:' , jsExpression ) ;
162-
199+
163200 // Step 2: Replace single operators
164- jsExpression = jsExpression
165- . replace ( / \| / g, ' || ' )
166- . replace ( / & / g, ' && ' ) ;
201+ jsExpression = jsExpression . replace ( / \| / g, ' || ' ) . replace ( / & / g, ' && ' ) ;
167202 console . log ( 'After single operator replacement:' , jsExpression ) ;
168-
203+
169204 // Step 3: Replace markers with proper operators
170205 jsExpression = jsExpression
171206 . replace ( / D O U B L E _ P I P E / g, ' || ' )
172207 . replace ( / D O U B L E _ A M P / g, ' && ' ) ;
173208 console . log ( 'After marker replacement:' , jsExpression ) ;
174-
209+
175210 // Step 4: Clean up spaces
176211 jsExpression = jsExpression . replace ( / \s + / g, ' ' ) . trim ( ) ;
177212 console . log ( 'Final normalized expression:' , jsExpression ) ;
178-
213+
179214 // Test the actual function
180215 const actualResult = result . current . hasPermission ( expression ) ;
181216 console . log ( 'Actual function result:' , actualResult ) ;
182-
217+
183218 expect ( actualResult ) . toBe ( true ) ;
184219 console . log ( '✅ PASS: Step-by-step debugging shows correct evaluation' ) ;
185220 } ) ;
0 commit comments