import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import FeedbackModal from 'components/Feedback/FeedbackModal'
import { mount } from 'enzyme'
import toJson from 'enzyme-to-json'
import React from 'react'
import { Provider } from 'react-redux'
import * as storeHooks from 'store/hooks'
import { createMockEcolyoStore } from 'tests/__mocks__/store'

// Value coming from jest.config
declare let __SAU_LINK__: string

jest.mock('services/environment.service', () => {
  return jest.fn(() => ({
    isProduction: () => true,
  }))
})

jest.mock('components/Hooks/useExploration', () => () => ['', jest.fn()])

const mockAppDispatch = jest.spyOn(storeHooks, 'useAppDispatch')

describe('FeedbackModal component', () => {
  const store = createMockEcolyoStore({ modal: { isFeedbacksOpen: true } })
  beforeEach(() => {
    jest.clearAllMocks()
  })
  it('should render the component', () => {
    const component = mount(
      <Provider store={store}>
        <FeedbackModal />
      </Provider>
    )
    expect(toJson(component)).toMatchSnapshot()
  })

  describe('FeedbackModal functionalities', () => {
    it('should close modal with the "x" button', async () => {
      render(
        <Provider store={store}>
          <FeedbackModal />
        </Provider>
      )
      await userEvent.click(screen.getAllByRole('button')[0])
      expect(mockAppDispatch).toHaveBeenCalledTimes(1)
    })

    it('should close modal with the "later" button', async () => {
      render(
        <Provider store={store}>
          <FeedbackModal />
        </Provider>
      )
      await userEvent.click(screen.getAllByRole('button')[1])
      expect(mockAppDispatch).toHaveBeenCalledTimes(1)
    })

    it('should open the SAU link', async () => {
      global.open = jest.fn()
      render(
        <Provider store={store}>
          <FeedbackModal />
        </Provider>
      )
      await userEvent.click(screen.getAllByRole('button')[2])
      expect(window.open).toHaveBeenCalledTimes(1)
      expect(global.open).toHaveBeenCalledWith(`${__SAU_LINK__}?version=0.0.0`)
    })
  })
})