11import { renderHook } from '@testing-library/react' ;
22import { useSelector , useDispatch } from 'react-redux' ;
3+ import type { K8sResourceKind } from '@console/dynamic-plugin-sdk/src' ;
34import { useK8sGet } from '@console/internal/components/utils/k8s-get-hook' ;
45import { useUser } from '../useUser' ;
56
@@ -19,6 +20,11 @@ jest.mock('@console/internal/components/utils/k8s-get-hook', () => ({
1920 useK8sGet : jest . fn ( ) ,
2021} ) ) ;
2122
23+ const baseUserResource : K8sResourceKind = {
24+ apiVersion : 'user.openshift.io/v1' ,
25+ kind : 'User' ,
26+ } ;
27+
2228const mockSetUserResource = jest . fn ( ( userResource ) => ( {
2329 type : 'setUserResource' ,
2430 payload : { userResource } ,
@@ -31,26 +37,30 @@ jest.mock('@console/dynamic-plugin-sdk', () => ({
3137 setUserResource : ( userResource : unknown ) => mockSetUserResource ( userResource ) ,
3238} ) ) ;
3339
34- const mockDispatch = jest . fn ( ) ;
35- const mockUseSelector = useSelector as jest . Mock ;
36- const mockUseK8sGet = useK8sGet as jest . Mock ;
37- const mockUseDispatch = useDispatch as jest . Mock ;
40+ const dispatchMock = jest . fn ( ) ;
41+ const useSelectorMock = useSelector as jest . MockedFunction < typeof useSelector > ;
42+ const useDispatchMock = useDispatch as jest . MockedFunction < typeof useDispatch > ;
43+ const useK8sGetMock = useK8sGet as jest . MockedFunction < typeof useK8sGet > ;
3844
3945describe ( 'useUser' , ( ) => {
4046 beforeEach ( ( ) => {
4147 jest . clearAllMocks ( ) ;
42- mockUseDispatch . mockReturnValue ( mockDispatch ) ;
48+ useDispatchMock . mockReturnValue ( dispatchMock ) ;
4349 } ) ;
4450
4551 it ( 'should return user data with displayName from fullName when available' , ( ) => {
4652 const mockUser = { username : 'testuser@example.com' , uid : '123' } ;
47- const mockUserResource = { fullName : 'Test User' , identities : [ 'testuser' ] } ;
53+ const mockUserResource = {
54+ ...baseUserResource ,
55+ fullName : 'Test User' ,
56+ identities : [ 'testuser' ] ,
57+ } ;
4858
49- mockUseSelector
59+ useSelectorMock
5060 . mockReturnValueOnce ( mockUser ) // for getUser
5161 . mockReturnValueOnce ( mockUserResource ) ; // for getUserResource
5262
53- mockUseK8sGet . mockReturnValue ( [ mockUserResource , true , null ] ) ;
63+ useK8sGetMock . mockReturnValue ( [ mockUserResource , true , null ] ) ;
5464
5565 const { result } = renderHook ( ( ) => useUser ( ) ) ;
5666
@@ -63,11 +73,11 @@ describe('useUser', () => {
6373
6474 it ( 'should fallback to username when fullName is not available' , ( ) => {
6575 const mockUser = { username : 'testuser@example.com' , uid : '123' } ;
66- const mockUserResource = { identities : [ 'testuser' ] } ; // No fullName
76+ const mockUserResource = { ... baseUserResource , identities : [ 'testuser' ] } ; // No fullName
6777
68- mockUseSelector . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( mockUserResource ) ;
78+ useSelectorMock . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( mockUserResource ) ;
6979
70- mockUseK8sGet . mockReturnValue ( [ mockUserResource , true , null ] ) ;
80+ useK8sGetMock . mockReturnValue ( [ mockUserResource , true , null ] ) ;
7181
7282 const { result } = renderHook ( ( ) => useUser ( ) ) ;
7383
@@ -77,27 +87,27 @@ describe('useUser', () => {
7787
7888 it ( 'should dispatch setUserResource when user resource is loaded' , ( ) => {
7989 const mockUser = { username : 'testuser@example.com' } ;
80- const mockUserResource = { fullName : 'Test User' } ;
90+ const mockUserResource = { ... baseUserResource , fullName : 'Test User' } ;
8191
82- mockUseSelector . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( null ) ; // No userResource in Redux yet
92+ useSelectorMock . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( null ) ; // No userResource in Redux yet
8393
84- mockUseK8sGet . mockReturnValue ( [ mockUserResource , true , null ] ) ;
94+ useK8sGetMock . mockReturnValue ( [ mockUserResource , true , null ] ) ;
8595
8696 renderHook ( ( ) => useUser ( ) ) ;
8797
88- expect ( mockDispatch ) . toHaveBeenCalledWith ( {
98+ expect ( dispatchMock ) . toHaveBeenCalledWith ( {
8999 type : 'setUserResource' ,
90100 payload : { userResource : mockUserResource } ,
91101 } ) ;
92102 } ) ;
93103
94104 it ( 'should handle edge cases with empty strings and fallback to "Unknown user"' , ( ) => {
95105 const mockUser = { username : '' } ; // Empty username
96- const mockUserResource = { fullName : ' ' } ; // Whitespace-only fullName
106+ const mockUserResource = { ... baseUserResource , fullName : ' ' } ; // Whitespace-only fullName
97107
98- mockUseSelector . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( mockUserResource ) ;
108+ useSelectorMock . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( mockUserResource ) ;
99109
100- mockUseK8sGet . mockReturnValue ( [ mockUserResource , true , null ] ) ;
110+ useK8sGetMock . mockReturnValue ( [ mockUserResource , true , null ] ) ;
101111
102112 const { result } = renderHook ( ( ) => useUser ( ) ) ;
103113
@@ -106,11 +116,11 @@ describe('useUser', () => {
106116
107117 it ( 'should trim whitespace from fullName and username' , ( ) => {
108118 const mockUser = { username : ' testuser@example.com ' } ;
109- const mockUserResource = { fullName : ' Test User ' } ;
119+ const mockUserResource = { ... baseUserResource , fullName : ' Test User ' } ;
110120
111- mockUseSelector . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( mockUserResource ) ;
121+ useSelectorMock . mockReturnValueOnce ( mockUser ) . mockReturnValueOnce ( mockUserResource ) ;
112122
113- mockUseK8sGet . mockReturnValue ( [ mockUserResource , true , null ] ) ;
123+ useK8sGetMock . mockReturnValue ( [ mockUserResource , true , null ] ) ;
114124
115125 const { result } = renderHook ( ( ) => useUser ( ) ) ;
116126
0 commit comments