@@ -3,7 +3,7 @@ import { getConfig, setConfig } from '@edx/frontend-platform';
33import { renderHook , waitFor } from '@testing-library/react' ;
44import { QueryClient , QueryClientProvider } from '@tanstack/react-query' ;
55import { ReactNode } from 'react' ;
6- import { useUserPermissions } from '@src/authz/data/apiHooks ' ;
6+ import { useCourseUserPermissions } from '@src/authz/hooks ' ;
77import { mockWaffleFlags } from '@src/data/apiHooks.mock' ;
88import messages from './messages' ;
99import {
@@ -34,8 +34,9 @@ jest.mock('react-redux', () => ({
3434 useSelector : jest . fn ( ) ,
3535} ) ) ;
3636
37- jest . mock ( '@src/authz/data/apiHooks' , ( ) => ( {
38- useUserPermissions : jest . fn ( ) ,
37+ jest . mock ( '@src/authz/hooks' , ( ) => ( {
38+ ...jest . requireActual ( '@src/authz/hooks' ) ,
39+ useCourseUserPermissions : jest . fn ( ) ,
3940} ) ) ;
4041
4142const createWrapper = ( ) => {
@@ -56,6 +57,15 @@ const createWrapper = () => {
5657
5758describe ( 'header utils' , ( ) => {
5859 describe ( 'getContentMenuItems' , ( ) => {
60+ beforeEach ( ( ) => {
61+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
62+ isLoading : false ,
63+ isAuthzEnabled : false ,
64+ canViewPagesAndResources : true ,
65+ canManagePagesAndResources : true ,
66+ } as ReturnType < typeof useCourseUserPermissions > ) ;
67+ } ) ;
68+
5969 it ( 'when video upload page enabled should include Video Uploads option' , ( ) => {
6070 jest . mocked ( useSelector ) . mockReturnValue ( {
6171 librariesV2Enabled : false ,
@@ -88,17 +98,49 @@ describe('header utils', () => {
8898 renderHook ( ( ) => useContentMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) . result . current ;
8999 expect ( actualItems [ 1 ] ) . toEqual ( { href : '/course/course-123/libraries' , title : 'Library Updates' } ) ;
90100 } ) ;
101+ it ( 'when authz enabled and user has canViewPagesAndResources should include pages and resources option' , async ( ) => {
102+ mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
103+ jest . mocked ( useSelector ) . mockReturnValue ( { librariesV2Enabled : false } ) ;
104+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
105+ isLoading : false ,
106+ isAuthzEnabled : true ,
107+ canViewPagesAndResources : true ,
108+ canManagePagesAndResources : true ,
109+ } as ReturnType < typeof useCourseUserPermissions > ) ;
110+ const { result } = renderHook ( ( ) => useContentMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
111+ await waitFor ( ( ) => {
112+ expect ( result . current . map ( ( item ) => item . title ) ) . toContain ( 'Pages & Resources' ) ;
113+ } ) ;
114+ } ) ;
115+ it ( 'when authz enabled and user lacks canViewPagesAndResources should not include pages and resources option' , async ( ) => {
116+ mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
117+ jest . mocked ( useSelector ) . mockReturnValue ( { librariesV2Enabled : false } ) ;
118+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
119+ isLoading : false ,
120+ isAuthzEnabled : true ,
121+ canViewPagesAndResources : false ,
122+ canManagePagesAndResources : false ,
123+ } as ReturnType < typeof useCourseUserPermissions > ) ;
124+ const { result } = renderHook ( ( ) => useContentMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
125+ await waitFor ( ( ) => {
126+ expect ( result . current . map ( ( item ) => item . title ) ) . not . toContain ( 'Pages & Resources' ) ;
127+ } ) ;
128+ } ) ;
91129 } ) ;
92130
93131 describe ( 'getSettingsMenuitems' , ( ) => {
94132 beforeEach ( ( ) => {
133+ mockWaffleFlags ( { enableAuthzCourseAuthoring : false , useNewCertificatesPage : false } ) ;
95134 jest . mocked ( useSelector ) . mockReturnValue ( {
96135 canAccessAdvancedSettings : true ,
97136 } ) ;
98- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
137+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
99138 isLoading : false ,
100- data : { canManageAdvancedSettings : true } ,
101- } as any ) ;
139+ isAuthzEnabled : false ,
140+ canManageAdvancedSettings : true ,
141+ canViewGradingSettings : true ,
142+ canViewScheduleAndDetails : true ,
143+ } as ReturnType < typeof useCourseUserPermissions > ) ;
102144 } ) ;
103145
104146 it ( 'when certificate page enabled should include certificates option' , ( ) => {
@@ -132,27 +174,29 @@ describe('header utils', () => {
132174 } ) ;
133175
134176 it ( 'when the authz.enable_course_authoring flag is enabled and user has access to advanced settings should include advanced settings option' , async ( ) => {
135- // Mock feature flag
136177 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
137- // Mock the useUserPermissions hook to return true for the authz.enable_course_authoring permission
138- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
178+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
139179 isLoading : false ,
140- data : { canManageAdvancedSettings : true } ,
141- } as any ) ;
180+ isAuthzEnabled : true ,
181+ canManageAdvancedSettings : true ,
182+ canViewGradingSettings : true ,
183+ canViewScheduleAndDetails : true ,
184+ } as ReturnType < typeof useCourseUserPermissions > ) ;
142185 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
143186 await waitFor ( ( ) => {
144187 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
145188 expect ( actualItemsTitle ) . toContain ( 'Advanced Settings' ) ;
146189 } ) ;
147190 } ) ;
148191 it ( 'when authz.enable_course_authoring flag is enabled and user has no access to advanced settings should not include advanced settings option' , async ( ) => {
149- // Mock feature flag
150192 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
151- // Mock the useUserPermissions hook to return true for the authz.enable_course_authoring permission
152- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
193+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
153194 isLoading : false ,
154- data : { canManageAdvancedSettings : false } ,
155- } as any ) ;
195+ isAuthzEnabled : true ,
196+ canManageAdvancedSettings : false ,
197+ canViewGradingSettings : true ,
198+ canViewScheduleAndDetails : true ,
199+ } as ReturnType < typeof useCourseUserPermissions > ) ;
156200 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
157201 await waitFor ( ( ) => {
158202 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
@@ -161,13 +205,11 @@ describe('header utils', () => {
161205 } ) ;
162206
163207 it ( 'when authz.enable_course_authoring flag is enabled and the permission request is still loading, should not include advanced settings option' , async ( ) => {
164- // Mock feature flag
165208 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
166- // Mock the useUserPermissions hook to return true for the authz.enable_course_authoring permission
167- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
209+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
168210 isLoading : true ,
169- data : undefined ,
170- } as any ) ;
211+ isAuthzEnabled : true ,
212+ } as ReturnType < typeof useCourseUserPermissions > ) ;
171213 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
172214 await waitFor ( ( ) => {
173215 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
@@ -177,10 +219,13 @@ describe('header utils', () => {
177219
178220 it ( 'when authz flag is enabled and user has canViewScheduleAndDetails should include schedule and details option' , async ( ) => {
179221 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
180- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
222+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
181223 isLoading : false ,
182- data : { canViewScheduleAndDetails : true } ,
183- } as any ) ;
224+ isAuthzEnabled : true ,
225+ canViewScheduleAndDetails : true ,
226+ canManageAdvancedSettings : true ,
227+ canViewGradingSettings : true ,
228+ } as ReturnType < typeof useCourseUserPermissions > ) ;
184229 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
185230 await waitFor ( ( ) => {
186231 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
@@ -190,10 +235,13 @@ describe('header utils', () => {
190235
191236 it ( 'when authz flag is enabled and user lacks canViewScheduleAndDetails should not include schedule and details option' , async ( ) => {
192237 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
193- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
238+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
194239 isLoading : false ,
195- data : { canViewScheduleAndDetails : false } ,
196- } as any ) ;
240+ isAuthzEnabled : true ,
241+ canViewScheduleAndDetails : false ,
242+ canManageAdvancedSettings : true ,
243+ canViewGradingSettings : true ,
244+ } as ReturnType < typeof useCourseUserPermissions > ) ;
197245 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
198246 await waitFor ( ( ) => {
199247 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
@@ -203,10 +251,13 @@ describe('header utils', () => {
203251
204252 it ( 'when authz flag is enabled and user has canViewGradingSettings should include grading option' , async ( ) => {
205253 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
206- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
254+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
207255 isLoading : false ,
208- data : { canViewGradingSettings : true } ,
209- } as any ) ;
256+ isAuthzEnabled : true ,
257+ canViewGradingSettings : true ,
258+ canManageAdvancedSettings : true ,
259+ canViewScheduleAndDetails : true ,
260+ } as ReturnType < typeof useCourseUserPermissions > ) ;
210261 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
211262 await waitFor ( ( ) => {
212263 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
@@ -216,10 +267,13 @@ describe('header utils', () => {
216267
217268 it ( 'when authz flag is enabled and user lacks canViewGradingSettings should not include grading option' , async ( ) => {
218269 mockWaffleFlags ( { enableAuthzCourseAuthoring : true } ) ;
219- jest . mocked ( useUserPermissions ) . mockReturnValue ( {
270+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
220271 isLoading : false ,
221- data : { canViewGradingSettings : false } ,
222- } as any ) ;
272+ isAuthzEnabled : true ,
273+ canViewGradingSettings : false ,
274+ canManageAdvancedSettings : true ,
275+ canViewScheduleAndDetails : true ,
276+ } as ReturnType < typeof useCourseUserPermissions > ) ;
223277 const { result } = renderHook ( ( ) => useSettingMenuItems ( 'course-123' ) , { wrapper : createWrapper ( ) } ) ;
224278 await waitFor ( ( ) => {
225279 const actualItemsTitle = result . current . map ( ( item ) => item . title ) ;
@@ -228,6 +282,14 @@ describe('header utils', () => {
228282 } ) ;
229283
230284 it ( 'should include roles and permissions option' , ( ) => {
285+ mockWaffleFlags ( { enableAuthzCourseAuthoring : true , useNewCertificatesPage : false } ) ;
286+ jest . mocked ( useCourseUserPermissions ) . mockReturnValue ( {
287+ isLoading : false ,
288+ isAuthzEnabled : true ,
289+ canManageAdvancedSettings : true ,
290+ canViewGradingSettings : true ,
291+ canViewScheduleAndDetails : true ,
292+ } as ReturnType < typeof useCourseUserPermissions > ) ;
231293 setConfig ( {
232294 ...getConfig ( ) ,
233295 ADMIN_CONSOLE_URL : 'http://admin-console.example.com' ,
0 commit comments