Skip to content
Snippets Groups Projects
Commit a14a1f7e authored by Bastien DUMONT's avatar Bastien DUMONT :angel:
Browse files

Merge branch 'rtl/quiz' into 'dev'

test(rtl): quiz

See merge request !1056
parents 17a46abf 4836cf13
No related branches found
No related tags found
2 merge requests!10622.7 Release,!1056test(rtl): quiz
import Button from '@material-ui/core/Button' import { render, screen } from '@testing-library/react'
import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { userEvent } from '@testing-library/user-event'
import { UserChallengeUpdateFlag } from 'enums' import { UserChallengeUpdateFlag } from 'enums'
import { mount } from 'enzyme'
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { createMockEcolyoStore } from 'tests/__mocks__/store' import { createMockEcolyoStore } from 'tests/__mocks__/store'
...@@ -16,15 +15,15 @@ jest.mock('services/challenge.service', () => { ...@@ -16,15 +15,15 @@ jest.mock('services/challenge.service', () => {
}) })
describe('QuizBegin component', () => { describe('QuizBegin component', () => {
it('should be rendered correctly', () => { it('should be rendered correctly', async () => {
const store = createMockEcolyoStore() const store = createMockEcolyoStore()
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizBegin userChallenge={userChallengeData[0]} /> <QuizBegin userChallenge={userChallengeData[0]} />
</Provider> </Provider>
) )
expect(wrapper.find(StyledIcon).exists()).toBeTruthy() expect(container.getElementsByClassName('quiz-icon')[0]).toBeInTheDocument()
wrapper.find('.button-start').find(Button).simulate('click') await userEvent.click(screen.getByRole('button'))
expect(mockUserChallengeUpdateFlag).toHaveBeenCalledWith( expect(mockUserChallengeUpdateFlag).toHaveBeenCalledWith(
userChallengeData[0], userChallengeData[0],
UserChallengeUpdateFlag.QUIZ_START UserChallengeUpdateFlag.QUIZ_START
......
import Button from '@material-ui/core/Button' import { render, screen } from '@testing-library/react'
import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { userEvent } from '@testing-library/user-event'
import { UserChallengeUpdateFlag } from 'enums'
import { mount } from 'enzyme'
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { createMockEcolyoStore } from 'tests/__mocks__/store' import { createMockEcolyoStore } from 'tests/__mocks__/store'
import { waitForComponentToPaint } from 'tests/__mocks__/testUtils'
import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock' import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
import QuizFinish from './QuizFinish' import QuizFinish from './QuizFinish'
...@@ -25,21 +22,14 @@ jest.mock('react-router-dom', () => ({ ...@@ -25,21 +22,14 @@ jest.mock('react-router-dom', () => ({
describe('QuizFinish', () => { describe('QuizFinish', () => {
it('should be rendered correctly', async () => { it('should be rendered correctly', async () => {
const store = createMockEcolyoStore() const store = createMockEcolyoStore()
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizFinish userChallenge={userChallengeData[0]} /> <QuizFinish userChallenge={userChallengeData[0]} />
</Provider> </Provider>
) )
expect(wrapper.find(StyledIcon).exists()).toBeTruthy() expect(container.getElementsByClassName('quiz-icon')[0]).toBeInTheDocument()
wrapper.find(Button).forEach(node => { await userEvent.click(screen.getAllByRole('button')[0])
node.simulate('click') expect(mockUserChallengeUpdateFlag).toHaveBeenCalled()
})
expect(mockUserChallengeUpdateFlag).toHaveBeenCalledWith(
userChallengeData[0],
UserChallengeUpdateFlag.QUIZ_RESET
)
await waitForComponentToPaint(wrapper)
expect(mockedNavigate).toHaveBeenCalledWith('/challenges') expect(mockedNavigate).toHaveBeenCalledWith('/challenges')
}) })
}) })
...@@ -23,21 +23,19 @@ const QuizFinish = ({ userChallenge }: { userChallenge: UserChallenge }) => { ...@@ -23,21 +23,19 @@ const QuizFinish = ({ userChallenge }: { userChallenge: UserChallenge }) => {
) )
const retryQuiz = useCallback(async () => { const retryQuiz = useCallback(async () => {
const userChallengeUpdated: UserChallenge = const userChallengeUpdated = await challengeService.updateUserChallenge(
await challengeService.updateUserChallenge( userChallenge,
userChallenge, UserChallengeUpdateFlag.QUIZ_RESET
UserChallengeUpdateFlag.QUIZ_RESET )
)
dispatch(updateUserChallengeList(userChallengeUpdated)) dispatch(updateUserChallengeList(userChallengeUpdated))
}, [dispatch, userChallenge, challengeService]) }, [dispatch, userChallenge, challengeService])
const goBack = async () => { const goBack = async () => {
const userChallengeUpdated: UserChallenge = const userChallengeUpdated = await challengeService.updateUserChallenge(
await challengeService.updateUserChallenge( userChallenge,
userChallenge, UserChallengeUpdateFlag.QUIZ_UPDATE,
UserChallengeUpdateFlag.QUIZ_UPDATE, userChallenge.quiz
userChallenge.quiz )
)
dispatch(updateUserChallengeList(userChallengeUpdated)) dispatch(updateUserChallengeList(userChallengeUpdated))
navigate('/challenges') navigate('/challenges')
} }
......
import { render, waitFor } from '@testing-library/react'
import { UserQuestionState } from 'enums' import { UserQuestionState } from 'enums'
import { mount } from 'enzyme'
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { createMockEcolyoStore } from 'tests/__mocks__/store' import { createMockEcolyoStore } from 'tests/__mocks__/store'
import { waitForComponentToPaint } from 'tests/__mocks__/testUtils'
import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock' import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
import QuizQuestion from './QuizQuestion' import QuizQuestion from './QuizQuestion'
const mockGetCustomQuestion = jest.fn()
jest.mock('services/quiz.service', () => { jest.mock('services/quiz.service', () => {
return jest.fn(() => { return jest.fn(() => {
return { return {
getCustomQuestion: mockGetCustomQuestion, getCustomQuestion: jest.fn(),
} }
}) })
}) })
...@@ -27,19 +25,17 @@ jest.mock( ...@@ -27,19 +25,17 @@ jest.mock(
describe('QuizQuestion component', () => { describe('QuizQuestion component', () => {
const store = createMockEcolyoStore() const store = createMockEcolyoStore()
beforeEach(() => {
store.clearActions()
})
it('should be rendered correctly with question', async () => { it('should be rendered correctly with question', async () => {
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizQuestion userChallenge={userChallengeData[0]} /> <QuizQuestion userChallenge={userChallengeData[0]} />
</Provider> </Provider>
) )
await waitForComponentToPaint(wrapper) expect(container.getElementsByTagName('mock-question').length).toBeTruthy()
expect(wrapper.find('mock-question').exists()).toBeTruthy() expect(
expect(wrapper.find('mock-customQuestion').exists()).toBeFalsy() container.getElementsByTagName('mock-customQuestion').length
).toBeFalsy()
}) })
it('should be rendered correctly with customQuestion', async () => { it('should be rendered correctly with customQuestion', async () => {
...@@ -49,13 +45,15 @@ describe('QuizQuestion component', () => { ...@@ -49,13 +45,15 @@ describe('QuizQuestion component', () => {
updateUserChallengeData.quiz.questions.forEach( updateUserChallengeData.quiz.questions.forEach(
answer => (answer.result = UserQuestionState.CORRECT) answer => (answer.result = UserQuestionState.CORRECT)
) )
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizQuestion userChallenge={updateUserChallengeData} /> <QuizQuestion userChallenge={updateUserChallengeData} />
</Provider> </Provider>
) )
await waitForComponentToPaint(wrapper) await waitFor(() => null, { container })
expect(wrapper.find('mock-question').exists()).toBeFalsy() expect(container.getElementsByTagName('mock-question').length).toBeFalsy()
expect(wrapper.find('mock-customQuestion').exists()).toBeTruthy() expect(
container.getElementsByTagName('mock-customQuestion').length
).toBeTruthy()
}) })
}) })
import { mount } from 'enzyme' import { render, screen } from '@testing-library/react'
import { userEvent } from '@testing-library/user-event'
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { createMockEcolyoStore } from 'tests/__mocks__/store' import { createMockEcolyoStore } from 'tests/__mocks__/store'
...@@ -11,24 +12,22 @@ jest.mock('react-router-dom', () => ({ ...@@ -11,24 +12,22 @@ jest.mock('react-router-dom', () => ({
useNavigate: () => mockedNavigate, useNavigate: () => mockedNavigate,
})) }))
const mockUpdateUserQuiz = jest.fn()
jest.mock('services/quiz.service', () => { jest.mock('services/quiz.service', () => {
return jest.fn(() => ({ return jest.fn(() => ({
updateUserQuiz: mockUpdateUserQuiz, updateUserQuiz: jest.fn(),
})) }))
}) })
const mockUserChallengeUpdateFlag = jest.fn()
jest.mock('services/challenge.service', () => { jest.mock('services/challenge.service', () => {
return jest.fn(() => ({ return jest.fn(() => ({
updateUserChallenge: mockUserChallengeUpdateFlag, updateUserChallenge: jest.fn(),
})) }))
}) })
describe('QuizQuestionContent component', () => { describe('QuizQuestionContent component', () => {
const store = createMockEcolyoStore() const store = createMockEcolyoStore()
it('should be rendered correctly', () => { it('should be rendered correctly', () => {
const wrapper = mount( render(
<Provider store={store}> <Provider store={store}>
<QuizQuestionContent <QuizQuestionContent
userChallenge={userChallengeData[0]} userChallenge={userChallengeData[0]}
...@@ -37,13 +36,13 @@ describe('QuizQuestionContent component', () => { ...@@ -37,13 +36,13 @@ describe('QuizQuestionContent component', () => {
/> />
</Provider> </Provider>
) )
expect(wrapper.find('.question').text()).toEqual( expect(
userChallengeData[0].quiz.questions[0].questionLabel screen.getByText(userChallengeData[0].quiz.questions[0].questionLabel)
) ).toBeInTheDocument()
expect(wrapper.find('input')).toHaveLength(3) expect(screen.getAllByRole('radio').length).toBe(3)
}) })
it('should redirect to challenge on click on btn-back', () => { it('should redirect to challenge on click on btn-back', async () => {
const wrapper = mount( render(
<Provider store={store}> <Provider store={store}>
<QuizQuestionContent <QuizQuestionContent
userChallenge={userChallengeData[0]} userChallenge={userChallengeData[0]}
...@@ -52,8 +51,7 @@ describe('QuizQuestionContent component', () => { ...@@ -52,8 +51,7 @@ describe('QuizQuestionContent component', () => {
/> />
</Provider> </Provider>
) )
await userEvent.click(screen.getAllByRole('button')[0])
wrapper.find('.btn-back').first().simulate('click')
expect(mockedNavigate).toHaveBeenCalledWith('/challenges') expect(mockedNavigate).toHaveBeenCalledWith('/challenges')
}) })
}) })
import Button from '@material-ui/core/Button' import { render, screen } from '@testing-library/react'
import Loader from 'components/Loader/Loader' import { userEvent } from '@testing-library/user-event'
import { mount } from 'enzyme'
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { questionEntity } from 'tests/__mocks__/quizData.mock' import { questionEntity } from 'tests/__mocks__/quizData.mock'
import { createMockEcolyoStore } from 'tests/__mocks__/store' import { createMockEcolyoStore } from 'tests/__mocks__/store'
import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock' import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
import QuizExplanationModal from '../QuizExplanationModal/QuizExplanationModal'
import QuizQuestionContentCustom from './QuizQuestionContentCustom' import QuizQuestionContentCustom from './QuizQuestionContentCustom'
const mockHistoryPush = jest.fn() const mockHistoryPush = jest.fn()
...@@ -18,25 +16,23 @@ jest.mock('react-router-dom', () => ({ ...@@ -18,25 +16,23 @@ jest.mock('react-router-dom', () => ({
})) }))
const mockUpdateUserQuiz = jest.fn() const mockUpdateUserQuiz = jest.fn()
const mockGetCustomQuestion = jest.fn()
jest.mock('services/quiz.service', () => { jest.mock('services/quiz.service', () => {
return jest.fn(() => ({ return jest.fn(() => ({
updateUserQuiz: mockUpdateUserQuiz, updateUserQuiz: mockUpdateUserQuiz,
getCustomQuestion: mockGetCustomQuestion, getCustomQuestion: jest.fn(),
})) }))
}) })
const mockUserChallengeUpdateFlag = jest.fn()
jest.mock('services/challenge.service', () => { jest.mock('services/challenge.service', () => {
return jest.fn(() => ({ return jest.fn(() => ({
updateUserChallenge: mockUserChallengeUpdateFlag, updateUserChallenge: jest.fn(),
})) }))
}) })
describe('QuizCustomQuestionContent component', () => { describe('QuizCustomQuestionContent component', () => {
const store = createMockEcolyoStore() const store = createMockEcolyoStore()
it('should be rendered correctly', () => { it('should be rendered correctly', async () => {
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizQuestionContentCustom <QuizQuestionContentCustom
userChallenge={userChallengeData[0]} userChallenge={userChallengeData[0]}
...@@ -46,17 +42,13 @@ describe('QuizCustomQuestionContent component', () => { ...@@ -46,17 +42,13 @@ describe('QuizCustomQuestionContent component', () => {
/> />
</Provider> </Provider>
) )
wrapper.find('.btn-back').forEach(node => { await userEvent.click(screen.getAllByRole('button')[0])
node.simulate('click')
})
expect(mockHistoryPush).toHaveBeenCalledWith('/challenges') expect(mockHistoryPush).toHaveBeenCalledWith('/challenges')
expect(wrapper.find('.question').text()).toEqual( expect(screen.getByText(questionEntity.questionLabel)).toBeInTheDocument()
questionEntity.questionLabel expect(screen.getAllByRole('radio').length).toBe(3)
)
expect(wrapper.find('input')).toHaveLength(3)
}) })
it('should be rendered correctly with loader', () => { it('should be rendered correctly with loader', () => {
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizQuestionContentCustom <QuizQuestionContentCustom
userChallenge={userChallengeData[0]} userChallenge={userChallengeData[0]}
...@@ -66,10 +58,12 @@ describe('QuizCustomQuestionContent component', () => { ...@@ -66,10 +58,12 @@ describe('QuizCustomQuestionContent component', () => {
/> />
</Provider> </Provider>
) )
expect(wrapper.find(Loader).exists()).toBeTruthy() expect(
container.getElementsByClassName('question-loading')[0]
).toBeInTheDocument()
}) })
it('should display QuizExplanationModal when click on Button', () => { it('should display QuizExplanationModal when click on Button', async () => {
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizQuestionContentCustom <QuizQuestionContentCustom
userChallenge={userChallengeData[0]} userChallenge={userChallengeData[0]}
...@@ -79,21 +73,12 @@ describe('QuizCustomQuestionContent component', () => { ...@@ -79,21 +73,12 @@ describe('QuizCustomQuestionContent component', () => {
/> />
</Provider> </Provider>
) )
const answer = questionEntity.answers[0].answerLabel await userEvent.click(screen.getAllByRole('radio')[0])
wrapper await userEvent.click(screen.getAllByRole('button')[1])
.find({ type: 'radio' })
.at(0)
.simulate('change', { target: { value: answer } })
expect(wrapper.find(Button).exists()).toBeTruthy()
wrapper.find('.btnSecondary').forEach(node => {
node.simulate('click')
})
expect(mockUpdateUserQuiz).toHaveBeenCalledWith( expect(mockUpdateUserQuiz).toHaveBeenCalledWith(
userChallengeData[0].quiz, userChallengeData[0].quiz,
questionEntity.answers[0].isTrue questionEntity.answers[0].isTrue
) )
expect(wrapper.find(QuizExplanationModal).exists()).toBeTruthy() expect(screen.getByRole('dialog')).toBeInTheDocument()
expect(wrapper.find(QuizExplanationModal).prop('open')).toBeTruthy()
}) })
}) })
import { render } from '@testing-library/react'
import QuizView from 'components/Quiz/QuizView' import QuizView from 'components/Quiz/QuizView'
import { UserQuizState } from 'enums' import { UserQuizState } from 'enums'
import { mount } from 'enzyme'
import { ChallengeState } from 'models' import { ChallengeState } from 'models'
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { challengeStateData } from 'tests/__mocks__/challengeStateData.mock' import { challengeStateData } from 'tests/__mocks__/challengeStateData.mock'
import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store' import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock' import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
import QuizBegin from './QuizBegin/QuizBegin'
import QuizFinish from './QuizFinish/QuizFinish'
import QuizQuestion from './QuizQuestion/QuizQuestion'
jest.mock('components/Header/CozyBar', () => 'mock-cozybar') jest.mock('components/Header/CozyBar', () => 'mock-cozybar')
jest.mock('components/Header/Header', () => 'mock-header') jest.mock('components/Header/Header', () => 'mock-header')
...@@ -29,12 +26,14 @@ describe('QuizView component', () => { ...@@ -29,12 +26,14 @@ describe('QuizView component', () => {
challenge: updatedChallengeState, challenge: updatedChallengeState,
global: mockGlobalState, global: mockGlobalState,
}) })
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizView /> <QuizView />
</Provider> </Provider>
) )
expect(wrapper.find(QuizBegin).exists()).toBeTruthy() expect(
container.getElementsByClassName('quiz-begin-container')[0]
).toBeInTheDocument()
}) })
it('should be rendered with QuizQuestion component when quiz state = ongoing', () => { it('should be rendered with QuizQuestion component when quiz state = ongoing', () => {
...@@ -50,12 +49,14 @@ describe('QuizView component', () => { ...@@ -50,12 +49,14 @@ describe('QuizView component', () => {
challenge: updatedChallengeState, challenge: updatedChallengeState,
global: mockGlobalState, global: mockGlobalState,
}) })
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizView /> <QuizView />
</Provider> </Provider>
) )
expect(wrapper.find(QuizQuestion).exists()).toBeTruthy() expect(
container.getElementsByClassName('question-container')[0]
).toBeInTheDocument()
}) })
it('should be rendered with QuizFinish component when quiz state = done', () => { it('should be rendered with QuizFinish component when quiz state = done', () => {
...@@ -71,12 +72,14 @@ describe('QuizView component', () => { ...@@ -71,12 +72,14 @@ describe('QuizView component', () => {
challenge: updatedChallengeState, challenge: updatedChallengeState,
global: mockGlobalState, global: mockGlobalState,
}) })
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizView /> <QuizView />
</Provider> </Provider>
) )
expect(wrapper.find(QuizFinish).exists()).toBeTruthy() expect(
container.getElementsByClassName('quiz-finish-container')[0]
).toBeInTheDocument()
}) })
it('should be rendered with QuizBegin component when quiz state = null', () => { it('should be rendered with QuizBegin component when quiz state = null', () => {
...@@ -91,11 +94,13 @@ describe('QuizView component', () => { ...@@ -91,11 +94,13 @@ describe('QuizView component', () => {
challenge: updatedChallengeState, challenge: updatedChallengeState,
global: mockGlobalState, global: mockGlobalState,
}) })
const wrapper = mount( const { container } = render(
<Provider store={store}> <Provider store={store}>
<QuizView /> <QuizView />
</Provider> </Provider>
) )
expect(wrapper.find(QuizBegin).exists()).toBeTruthy() expect(
container.getElementsByClassName('quiz-begin-container')[0]
).toBeInTheDocument()
}) })
}) })
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment