@@ -3,7 +3,8 @@ import { render, waitFor, act } from '@testing-library/react';
33import { describe , it , expect , vi , beforeAll } from 'vitest' ;
44
55import { AuthContext } from './AuthContext' ;
6- import { AuthProvider } from './AuthProvider' ;
6+ import { AuthProvider , preserveRolesReference } from './AuthProvider' ;
7+ import { Role , type FamLoginUser , type FamRole } from './types' ;
78
89import { jwtfy } from '@/config/tests/auth.helper' ;
910import { navigateTo } from '@/utils/navigation' ;
@@ -113,6 +114,7 @@ describe('AuthProvider (extra coverage)', () => {
113114 await waitFor ( ( ) => expect ( context ) . toBeDefined ( ) ) ;
114115 expect ( context . userToken ( ) ) . toBe ( 'sometoken' ) ;
115116 } ) ;
117+
116118 } ) ;
117119
118120 describe ( 'when VITE_MOCK_AUTH is true' , ( ) => {
@@ -165,3 +167,82 @@ describe('AuthProvider (extra coverage)', () => {
165167 } ) ;
166168 } ) ;
167169} ) ;
170+
171+ describe ( 'preserveRolesReference' , ( ) => {
172+ const mockRoles : FamRole [ ] = [ { role : Role . VIEWER , clients : [ '100' ] } ] ;
173+ const mockRoles2 : FamRole [ ] = [ { role : Role . ADMIN , clients : [ '200' ] } ] ;
174+ const mockUser : FamLoginUser = {
175+ userName : 'testuser' ,
176+ displayName : 'Test User' ,
177+ email : 'test@example.com' ,
178+ roles : mockRoles ,
179+ privileges : { } ,
180+ } ;
181+
182+ it ( 'returns nextUser when previousUser is undefined' , ( ) => {
183+ const nextUser = { ...mockUser , roles : mockRoles } ;
184+ const result = preserveRolesReference ( undefined , nextUser ) ;
185+ expect ( result ) . toBe ( nextUser ) ;
186+ } ) ;
187+
188+ it ( 'returns nextUser when nextUser is undefined' , ( ) => {
189+ const result = preserveRolesReference ( mockUser , undefined ) ;
190+ expect ( result ) . toBeUndefined ( ) ;
191+ } ) ;
192+
193+ it ( 'returns nextUser when both are undefined' , ( ) => {
194+ const result = preserveRolesReference ( undefined , undefined ) ;
195+ expect ( result ) . toBeUndefined ( ) ;
196+ } ) ;
197+
198+ it ( 'returns nextUser when role content differs' , ( ) => {
199+ const previousUser = { ...mockUser , roles : mockRoles } ;
200+ const nextUser = { ...mockUser , roles : mockRoles2 } ;
201+ const result = preserveRolesReference ( previousUser , nextUser ) ;
202+ expect ( result ) . toBe ( nextUser ) ;
203+ expect ( result ?. roles ) . toBe ( mockRoles2 ) ;
204+ } ) ;
205+
206+ it ( 'preserves previous roles reference when role content is equal but reference differs' , ( ) => {
207+ const previousRoles : FamRole [ ] = [ { role : Role . VIEWER , clients : [ '100' ] } ] ;
208+ const nextRoles : FamRole [ ] = [ { role : Role . VIEWER , clients : [ '100' ] } ] ;
209+ const previousUser = { ...mockUser , roles : previousRoles } ;
210+ const nextUser = { ...mockUser , roles : nextRoles } ;
211+
212+ const result = preserveRolesReference ( previousUser , nextUser ) ;
213+
214+ expect ( result ) . toBeDefined ( ) ;
215+ expect ( result ?. roles ) . toBe ( previousRoles ) ;
216+ expect ( result ?. roles ) . not . toBe ( nextRoles ) ;
217+ expect ( result ?. userName ) . toBe ( nextUser . userName ) ;
218+ } ) ;
219+
220+ it ( 'returns nextUser unchanged when roles reference is already the same' , ( ) => {
221+ const sharedRoles = mockRoles ;
222+ const previousUser = { ...mockUser , roles : sharedRoles } ;
223+ const nextUser = { ...mockUser , roles : sharedRoles } ;
224+
225+ const result = preserveRolesReference ( previousUser , nextUser ) ;
226+
227+ expect ( result ) . toBe ( nextUser ) ;
228+ } ) ;
229+
230+ it ( 'preserves roles while updating other user fields' , ( ) => {
231+ const sharedRoles : FamRole [ ] = [ { role : Role . SUBMITTER , clients : [ '300' ] } ] ;
232+ const previousUser = {
233+ ...mockUser ,
234+ roles : sharedRoles ,
235+ email : 'old@example.com' ,
236+ } ;
237+ const nextUser = {
238+ ...mockUser ,
239+ roles : sharedRoles ,
240+ email : 'new@example.com' ,
241+ } ;
242+
243+ const result = preserveRolesReference ( previousUser , nextUser ) ;
244+
245+ expect ( result ?. roles ) . toBe ( sharedRoles ) ;
246+ expect ( result ?. email ) . toBe ( 'new@example.com' ) ;
247+ } ) ;
248+ } ) ;
0 commit comments