Skip to content
Snippets Groups Projects
ChallengeCardDone.spec.tsx 3.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { act, render, screen } from '@testing-library/react'
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
    import { userEvent } from '@testing-library/user-event'
    
    import ChallengeCardDone from 'components/Challenge/ChallengeCardDone/ChallengeCardDone'
    
    import React from 'react'
    
    import { Provider } from 'react-redux'
    import configureStore from 'redux-mock-store'
    
    import * as storeHooks from 'store/hooks'
    
    import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
    
    Yoan VALLET's avatar
    Yoan VALLET committed
    
    
    const mockUpdateUserChallenge = jest.fn()
    jest.mock('services/challenge.service', () => {
    
      return jest.fn(() => ({
        updateUserChallenge: mockUpdateUserChallenge,
      }))
    
    })
    
    const mockStore = configureStore([])
    const mockDispatch = jest.fn()
    
    const mockAppDispatch = jest.spyOn(storeHooks, 'useAppDispatch')
    
    Yoan VALLET's avatar
    Yoan VALLET committed
    describe('ChallengeCardDone component', () => {
    
      const storeNoCurrentChallenge = mockStore({
        ecolyo: {
          challenge: { currentChallenge: null },
        },
      })
    
      it('should be rendered correctly', () => {
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
        const { container } = render(
    
          <Provider store={storeNoCurrentChallenge}>
            <ChallengeCardDone userChallenge={userChallengeData[0]} />
          </Provider>
        )
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
        expect(container).toMatchSnapshot()
    
      })
    
      describe('Reset final challenge', () => {
        beforeEach(() => {
    
          jest.clearAllMocks()
    
        })
        it('should reset challenge if no other challenge is on going', async () => {
    
          mockAppDispatch.mockImplementationOnce(() => mockDispatch)
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
          render(
    
            <Provider store={storeNoCurrentChallenge}>
              <ChallengeCardDone userChallenge={userChallengeData[0]} />
            </Provider>
          )
    
          const resetButton = screen.getByText('challenge.card_done.reset_defi')
          await act(async () => {
            await userEvent.click(resetButton)
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
          })
    
          expect(mockDispatch).toHaveBeenCalledWith({
    
            type: 'challenge/updateUserChallengeList',
          })
    
          expect(mockUpdateUserChallenge).toHaveBeenCalledTimes(1)
    
        it('should not reset challenge if another challenge is on going', () => {
    
          mockAppDispatch.mockImplementationOnce(() => mockDispatch)
    
          const store = mockStore({
            ecolyo: {
              challenge: { currentChallenge: userChallengeData[1] },
            },
          })
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
          render(
    
            <Provider store={store}>
              <ChallengeCardDone userChallenge={userChallengeData[0]} />
            </Provider>
          )
    
          const resetBtn = screen.getByRole('button', {
            name: 'challenge.card_done.reset_defi',
          })
    
          expect(resetBtn).toHaveProperty('disabled')
    
          expect(mockDispatch).toHaveBeenCalledTimes(0)
          expect(mockUpdateUserChallenge).toHaveBeenCalledTimes(0)
    
        it('should be primary button is challenge is lost', () => {
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
          render(
    
            <Provider store={storeNoCurrentChallenge}>
              <ChallengeCardDone userChallenge={userChallengeData[1]} />
            </Provider>
          )
    
          const resetBtn = screen.getByRole('button', {
            name: 'challenge.card_done.reset_defi',
          })
    
          expect(resetBtn).toHaveClass('btnPrimaryNegative')
    
        it('should be secondary button is challenge is won', () => {
    
    Bastien DUMONT's avatar
    Bastien DUMONT committed
          render(
    
            <Provider store={storeNoCurrentChallenge}>
              <ChallengeCardDone userChallenge={userChallengeData[0]} />
            </Provider>
          )
    
          const resetBtn = screen.getByRole('button', {
            name: 'challenge.card_done.reset_defi',
          })
    
          expect(resetBtn).toHaveClass('btnSecondary')
    
    Yoan VALLET's avatar
    Yoan VALLET committed
      })
    })