@@ -2,7 +2,7 @@ import { act, ReactNode } from 'react';
22import { renderHook , waitFor } from '@testing-library/react' ;
33import { QueryClient , QueryClientProvider } from '@tanstack/react-query' ;
44import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth' ;
5- import { useValidateUserPermissions } from './apiHooks' ;
5+ import { useUserPermissions } from './apiHooks' ;
66
77jest . mock ( '@edx/frontend-platform/auth' , ( ) => ( {
88 getAuthenticatedHttpClient : jest . fn ( ) ,
@@ -18,64 +18,134 @@ const createWrapper = () => {
1818 } ) ;
1919
2020 const wrapper = ( { children } : { children : ReactNode } ) => (
21- < QueryClientProvider client = { queryClient } >
22- { children }
23- </ QueryClientProvider >
21+ < QueryClientProvider client = { queryClient } > { children } </ QueryClientProvider >
2422 ) ;
2523
2624 return wrapper ;
2725} ;
2826
29- const permissions = [
30- {
27+ const singlePermission = {
28+ canRead : {
3129 action : 'act:read' ,
32- object : 'lib:test-lib' ,
33- scope : 'org:OpenedX' ,
30+ scope : 'lib:test-lib' ,
3431 } ,
32+ } ;
33+
34+ const mockValidSinglePermission = [
35+ { action : 'act:read' , scope : 'lib:test-lib' , allowed : true } ,
36+ ] ;
37+
38+ const mockInvalidSinglePermission = [
39+ { action : 'act:read' , scope : 'lib:test-lib' , allowed : false } ,
40+ ] ;
41+
42+ const mockEmptyPermissions = [
43+ // No permissions returned
3544] ;
3645
37- const mockValidPermissions = [
38- { action : 'act:read' , object : 'lib:test-lib' , allowed : true } ,
46+ const multiplePermissions = {
47+ canRead : {
48+ action : 'act:read' ,
49+ scope : 'lib:test-lib' ,
50+ } ,
51+ canWrite : {
52+ action : 'act:write' ,
53+ scope : 'lib:test-lib' ,
54+ } ,
55+ } ;
56+
57+ const mockValidMultiplePermissions = [
58+ { action : 'act:read' , scope : 'lib:test-lib' , allowed : true } ,
59+ { action : 'act:write' , scope : 'lib:test-lib' , allowed : true } ,
3960] ;
4061
41- const mockInvalidPermissions = [
42- { action : 'act:read' , object : 'lib:test-lib' , allowed : false } ,
62+ const mockInvalidMultiplePermissions = [
63+ { action : 'act:read' , scope : 'lib:test-lib' , allowed : false } ,
64+ { action : 'act:write' , scope : 'lib:test-lib' , allowed : false } ,
4365] ;
4466
45- describe ( 'useValidateUserPermissions ' , ( ) => {
67+ describe ( 'useUserPermissions ' , ( ) => {
4668 beforeEach ( ( ) => {
4769 jest . clearAllMocks ( ) ;
4870 } ) ;
4971
50- it ( 'returns allowed true when permissions are valid' , async ( ) => {
72+ it ( 'returns allowed true when permission is valid' , async ( ) => {
5173 getAuthenticatedHttpClient . mockReturnValue ( {
52- post : jest . fn ( ) . mockResolvedValueOnce ( { data : mockValidPermissions } ) ,
74+ post : jest . fn ( ) . mockResolvedValueOnce ( { data : mockValidSinglePermission } ) ,
5375 } ) ;
5476
55- const { result } = renderHook ( ( ) => useValidateUserPermissions ( permissions ) , {
77+ const { result } = renderHook ( ( ) => useUserPermissions ( singlePermission ) , {
5678 wrapper : createWrapper ( ) ,
5779 } ) ;
5880
5981 await waitFor ( ( ) => expect ( result . current ) . toBeDefined ( ) ) ;
6082 await waitFor ( ( ) => expect ( result . current . data ) . toBeDefined ( ) ) ;
6183
6284 expect ( getAuthenticatedHttpClient ) . toHaveBeenCalled ( ) ;
63- expect ( result . current . data ! [ 0 ] . allowed ) . toBe ( true ) ;
85+ expect ( result . current . data ! . canRead ) . toBe ( true ) ;
86+ } ) ;
87+
88+ it ( 'returns allowed false when permission is invalid' , async ( ) => {
89+ getAuthenticatedHttpClient . mockReturnValue ( {
90+ post : jest . fn ( ) . mockResolvedValue ( { data : mockInvalidSinglePermission } ) ,
91+ } ) ;
92+
93+ const { result } = renderHook ( ( ) => useUserPermissions ( singlePermission ) , {
94+ wrapper : createWrapper ( ) ,
95+ } ) ;
96+ await waitFor ( ( ) => expect ( result . current ) . toBeDefined ( ) ) ;
97+ await waitFor ( ( ) => expect ( result . current . data ) . toBeDefined ( ) ) ;
98+
99+ expect ( getAuthenticatedHttpClient ) . toHaveBeenCalled ( ) ;
100+ expect ( result . current . data ! . canRead ) . toBe ( false ) ;
101+ } ) ;
102+
103+ it ( 'returns allowed true when multiple permissions are valid' , async ( ) => {
104+ getAuthenticatedHttpClient . mockReturnValue ( {
105+ post : jest . fn ( ) . mockResolvedValueOnce ( { data : mockValidMultiplePermissions } ) ,
106+ } ) ;
107+
108+ const { result } = renderHook ( ( ) => useUserPermissions ( multiplePermissions ) , {
109+ wrapper : createWrapper ( ) ,
110+ } ) ;
111+
112+ await waitFor ( ( ) => expect ( result . current ) . toBeDefined ( ) ) ;
113+ await waitFor ( ( ) => expect ( result . current . data ) . toBeDefined ( ) ) ;
114+
115+ expect ( getAuthenticatedHttpClient ) . toHaveBeenCalled ( ) ;
116+ expect ( result . current . data ! . canRead ) . toBe ( true ) ;
117+ expect ( result . current . data ! . canWrite ) . toBe ( true ) ;
118+ } ) ;
119+
120+ it ( 'returns allowed false when multiple permissions are invalid' , async ( ) => {
121+ getAuthenticatedHttpClient . mockReturnValue ( {
122+ post : jest . fn ( ) . mockResolvedValue ( { data : mockInvalidMultiplePermissions } ) ,
123+ } ) ;
124+
125+ const { result } = renderHook ( ( ) => useUserPermissions ( multiplePermissions ) , {
126+ wrapper : createWrapper ( ) ,
127+ } ) ;
128+ await waitFor ( ( ) => expect ( result . current ) . toBeDefined ( ) ) ;
129+ await waitFor ( ( ) => expect ( result . current . data ) . toBeDefined ( ) ) ;
130+
131+ expect ( getAuthenticatedHttpClient ) . toHaveBeenCalled ( ) ;
132+ expect ( result . current . data ! . canRead ) . toBe ( false ) ;
133+ expect ( result . current . data ! . canWrite ) . toBe ( false ) ;
64134 } ) ;
65135
66- it ( 'returns allowed false when permissions are invalid ' , async ( ) => {
136+ it ( 'returns allowed false when the permission is not included in the server response ' , async ( ) => {
67137 getAuthenticatedHttpClient . mockReturnValue ( {
68- post : jest . fn ( ) . mockResolvedValue ( { data : mockInvalidPermissions } ) ,
138+ post : jest . fn ( ) . mockResolvedValue ( { data : mockEmptyPermissions } ) ,
69139 } ) ;
70140
71- const { result } = renderHook ( ( ) => useValidateUserPermissions ( permissions ) , {
141+ const { result } = renderHook ( ( ) => useUserPermissions ( singlePermission ) , {
72142 wrapper : createWrapper ( ) ,
73143 } ) ;
74144 await waitFor ( ( ) => expect ( result . current ) . toBeDefined ( ) ) ;
75145 await waitFor ( ( ) => expect ( result . current . data ) . toBeDefined ( ) ) ;
76146
77147 expect ( getAuthenticatedHttpClient ) . toHaveBeenCalled ( ) ;
78- expect ( result . current . data ! [ 0 ] . allowed ) . toBe ( false ) ;
148+ expect ( result . current . data ! . canRead ) . toBe ( false ) ;
79149 } ) ;
80150
81151 it ( 'handles error when the API call fails' , async ( ) => {
@@ -87,7 +157,7 @@ describe('useValidateUserPermissions', () => {
87157
88158 try {
89159 act ( ( ) => {
90- renderHook ( ( ) => useValidateUserPermissions ( permissions ) , {
160+ renderHook ( ( ) => useUserPermissions ( singlePermission ) , {
91161 wrapper : createWrapper ( ) ,
92162 } ) ;
93163 } ) ;
0 commit comments