Files
workavia-calendar-front/__test__/features/user/HandleLogin.test.tsx
T
lethemanh cadfa70e60 #708 apply strictier linting rules (#717)
* #708 apply strictier linting rules and fix simple eslint bugs

* #708 fix eslint errors relate to promise

* #708 fix eslint import/no-extraneous-dependencies

* #708 fix eslint errors of react-hook

* #708 enable eslint check for typescript

---------

Co-authored-by: lethemanh <lethemanh@lethemanhs-MacBook-Pro.local>
2026-04-01 17:15:10 +02:00

168 lines
4.8 KiB
TypeScript

import * as appHooks from '@/app/hooks'
import { AppDispatch, setupStore } from '@/app/store'
import HandleLogin from '@/features/User/HandleLogin'
import * as oidcAuth from '@/features/User/oidcAuth'
import { clientConfig } from '@/features/User/oidcAuth'
import { useInitializeApp } from '@/features/User/useInitializeApp'
import * as apiUtils from '@/utils/apiUtils'
import { renderHook, screen, waitFor } from '@testing-library/react'
import { Provider } from 'react-redux'
import { push } from 'redux-first-history'
import { renderWithProviders } from '../../utils/Renderwithproviders'
clientConfig.url = 'https://example.com'
describe('HandleLogin', () => {
beforeEach(() => {
jest.clearAllMocks()
jest.spyOn(apiUtils, 'redirectTo').mockImplementation(() => {})
const dispatch = jest.fn() as AppDispatch
jest.spyOn(appHooks, 'useAppDispatch').mockReturnValue(dispatch)
sessionStorage.clear()
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn()
}))
})
})
test('redirects and sets sessionStorage when no userData', async () => {
const loginUrlMock = {
code_verifier: 'verifier123',
state: 'state123',
redirectTo: new URL('http://login.url')
}
jest.spyOn(oidcAuth, 'Auth').mockResolvedValue(loginUrlMock)
const { result } = renderHook(() => useInitializeApp(), {
wrapper: ({ children }) => (
<Provider
store={setupStore({
user: {
userData: null,
tokens: null,
loading: false,
error: null,
coreConfig: { language: 'en' }
},
calendars: { list: {}, pending: false, error: null }
})}
>
{children}
</Provider>
)
})
await waitFor(
() => {
expect(oidcAuth.Auth).toHaveBeenCalled()
},
{ timeout: 3000 }
)
await waitFor(
() => {
expect(sessionStorage.getItem('redirectState')).toEqual(
JSON.stringify({
code_verifier: 'verifier123',
state: 'state123'
})
)
},
{ timeout: 3000 }
)
await waitFor(
() => {
expect(apiUtils.redirectTo).toHaveBeenCalledWith(
loginUrlMock.redirectTo
)
},
{ timeout: 3000 }
)
})
test('does not render loading element when userData exists and calendars pending is true', () => {
const preloadedState = {
user: {
userData: {
sub: 'test',
email: 'test@test.com',
sid: 'aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro',
openpaasId: '667037022b752d0026472254'
},
tokens: { access_token: 'test' },
loading: false
},
calendars: { list: {}, pending: true },
loading: { isLoading: true }
}
renderWithProviders(<HandleLogin />, preloadedState)
// HandleLogin now returns null, loading is shown at App level via appLoading state
expect(screen.queryByTestId('loading')).not.toBeInTheDocument()
})
test('does not render loading element when userData exists and calendars pending is false', () => {
const preloadedState = {
user: {
userData: {
sub: 'cmoussu',
email: 'cmoussu@linagora.com',
sid: 'aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro',
openpaasId: '667037022b752d0026472254'
},
tokens: { access_token: 'test' },
loading: false
},
calendars: { list: {}, pending: false },
loading: { isLoading: false }
}
renderWithProviders(<HandleLogin />, preloadedState)
// HandleLogin now returns null, loading is shown at App level via appLoading state
expect(screen.queryByTestId('loading')).not.toBeInTheDocument()
})
test('goes to error page when there is error in user data', async () => {
const mockDispatch = jest.fn()
jest.spyOn(appHooks, 'useAppDispatch').mockReturnValue(mockDispatch)
jest.spyOn(oidcAuth, 'Auth').mockResolvedValue({
code_verifier: 'verifier123',
state: 'state123',
redirectTo: new URL('http://login.url')
})
renderWithProviders(<HandleLogin />, {
user: {
error: true,
loading: false,
userData: {
sub: 'test',
email: 'test@test.com',
sid: 'testSid',
openpaasId: 'testId'
},
tokens: { access_token: 'test' }
},
calendars: {
list: {},
pending: false,
error: null
}
})
await waitFor(
() => {
expect(mockDispatch).toHaveBeenCalledWith(push('/error'))
},
{ timeout: 3000 }
)
})
})