import Vue from 'vue'
import { mount } from '@vue/test-utils'
import createStore from '../createStore'
import SelectionBox from '../SelectionBox'

const getDefaultStore = (selectedRowKeys) => {
  return createStore({
    selectedRowKeys: selectedRowKeys || [],
    selectionDirty: false,
  })
}

describe('SelectionBox', () => {
  it('unchecked by selectedRowKeys ', () => {
    const wrapper = mount(SelectionBox, {
      propsData: {
        store: getDefaultStore(),
        rowIndex: '1',
        disabled: false,
        onChange: () => {},
        defaultSelection: [],
      },
      listeners: {
        change: () => {},
      },
      sync: false,
    })

    expect(wrapper.vm.$data).toEqual({ checked: false })
  })

  it('checked by selectedRowKeys ', () => {
    const wrapper = mount(SelectionBox, {
      propsData: {
        store: getDefaultStore(['1']),
        rowIndex: '1',
        disabled: false,
        onChange: () => {},
        defaultSelection: [],
      },
      listeners: {
        change: () => {},
      },
      sync: false,
    })

    expect(wrapper.vm.$data).toEqual({ checked: true })
  })

  it('checked by defaultSelection', () => {
    const wrapper = mount(SelectionBox, {
      propsData: {
        store: getDefaultStore(),
        rowIndex: '1',
        disabled: false,
        onChange: () => {},
        defaultSelection: ['1'],
      },
      listeners: {
        change: () => {},
      },
      sync: false,
    })

    expect(wrapper.vm.$data).toEqual({ checked: true })
  })

  it('checked when store change', () => {
    const store = getDefaultStore()
    const wrapper = mount(SelectionBox, {
      propsData: {
        store: store,
        rowIndex: '1',
        disabled: false,
        defaultSelection: [],
      },
      listeners: {
        change: () => {},
      },
      sync: false,
    })

    store.setState({
      selectedRowKeys: ['1'],
      selectionDirty: true,
    })

    expect(wrapper.vm.$data).toEqual({ checked: true })
  })

  it('passes props to Checkbox', (done) => {
    const checkboxProps = {
      name: 'testName',
      id: 'testId',
    }
    const wrapper = mount(SelectionBox, {
      propsData: {
        store: getDefaultStore(),
        rowIndex: '1',
        disabled: false,
        defaultSelection: ['1'],
        ...checkboxProps,
      },
      listeners: {
        change: () => {},
      },
      sync: false,
    })
    Vue.nextTick(() => {
      wrapper.findAll({ name: 'ACheckbox' }).wrappers.forEach((box) => {
        expect(box.props().name).toEqual(checkboxProps.name)
        expect(box.props().id).toEqual(checkboxProps.id)
      })
      done()
    })
  })

  it('passes props to Radios', (done) => {
    const radioProps = {
      name: 'testName',
      id: 'testId',
    }
    const wrapper = mount(SelectionBox, {
      propsData: {
        store: getDefaultStore(),
        rowIndex: '1',
        disabled: false,
        defaultSelection: ['1'],
        type: 'radio',
        ...radioProps,
      },
      listeners: {
        change: () => {},
      },
      sync: false,
    })
    Vue.nextTick(() => {
      wrapper.findAll({ name: 'ARadio' }).wrappers.forEach((radio) => {
        expect(radio.props().name).toEqual(radioProps.name)
        expect(radio.props().id).toEqual(radioProps.id)
      })
      done()
    })
  })
})