import { Button } from '@material-ui/core'
import { mount } from 'enzyme'
import toJson from 'enzyme-to-json'
import React from 'react'
import { Provider } from 'react-redux'
import UsageEventService from 'services/usageEvent.service'
import * as challengeActions from 'store/challenge/challenge.slice'
import { defaultEcogestureData } from 'tests/__mocks__/actionData.mock'
import { createMockEcolyoStore } from 'tests/__mocks__/store'
import { waitForComponentToPaint } from 'tests/__mocks__/testUtils'
import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
import ActionModal from './ActionModal'

const mockUpdateUserChallenge = jest.fn()
jest.mock('services/challenge.service', () => {
  return jest.fn(() => ({
    updateUserChallenge: mockUpdateUserChallenge,
  }))
})
jest.mock('services/usageEvent.service')
const mockAddEvent = jest.fn()
UsageEventService.addEvent = mockAddEvent

describe('ActionModal component', () => {
  const store = createMockEcolyoStore()
  it('should render correctly', async () => {
    const wrapper = mount(
      <Provider store={store}>
        <ActionModal
          open={true}
          handleCloseClick={jest.fn()}
          action={defaultEcogestureData[1]}
          userChallenge={userChallengeData[1]}
        />
      </Provider>
    )
    await waitForComponentToPaint(wrapper)
    expect(toJson(wrapper)).toMatchSnapshot()
  })
  it('should click on button and update action to ongoing', async () => {
    const updateChallengeSpy = jest.spyOn(
      challengeActions,
      'updateUserChallengeList'
    )
    mockUpdateUserChallenge.mockResolvedValueOnce(userChallengeData[1])

    const wrapper = mount(
      <Provider store={store}>
        <ActionModal
          open={true}
          handleCloseClick={jest.fn()}
          action={defaultEcogestureData[1]}
          userChallenge={userChallengeData[1]}
        />
      </Provider>
    )
    wrapper.find(Button).first().simulate('click')
    await waitForComponentToPaint(wrapper)
    expect(updateChallengeSpy).toHaveBeenCalledTimes(1)
  })
})