import { mount, createLocalVue } from '@vue/test-utils'
import index from './index.vue'
import Vuex from 'vuex'
import Styleguide from '@human-connection/styleguide'

const localVue = createLocalVue()

localVue.use(Vuex)
localVue.use(Styleguide)

describe('index.vue', () => {
  let store
  let mocks
  let getters

  beforeEach(() => {
    mocks = {
      $t: jest.fn(),
      $apollo: {
        mutate: jest
          .fn()
          .mockRejectedValue({ message: 'Ouch!' })
          .mockResolvedValueOnce({
            data: {
              UpdateUser: {
                id: 'u1',
                name: 'Peter',
                locationName: 'Berlin',
                about: 'Smth',
              },
            },
          }),
      },
      $toast: {
        error: jest.fn(),
        success: jest.fn(),
      },
    }
    getters = {
      'auth/user': () => {
        return {}
      },
    }
  })

  describe('mount', () => {
    const Wrapper = () => {
      store = new Vuex.Store({
        getters,
      })
      return mount(index, { store, mocks, localVue })
    }

    it('renders', () => {
      expect(Wrapper().contains('div')).toBe(true)
    })

    describe('given a new username and hitting submit', () => {
      it('calls updateUser mutation', () => {
        const wrapper = Wrapper()
        const input = wrapper.find('#name')
        const submitForm = wrapper.find('.ds-form')

        input.setValue('Peter')
        submitForm.trigger('submit')

        expect(mocks.$apollo.mutate).toHaveBeenCalled()
      })
    })
  })
})
