import { mount, RouterLinkStub } from '@vue/test-utils'
import App from './App'

const localVue = global.localVue
const mockStoreCommit = jest.fn()

const stubs = {
  RouterLink: RouterLinkStub,
  RouterView: true,
}

describe('App', () => {
  const mocks = {
    $i18n: {
      locale: 'en',
    },
    $t: jest.fn((t) => t),
    $store: {
      commit: mockStoreCommit,
      state: {
        token: null,
      },
    },
    $route: {
      meta: {
        requiresAuth: false,
      },
      params: {},
    },
  }

  let wrapper

  const Wrapper = () => {
    return mount(App, { localVue, mocks, stubs })
  }

  describe('mount', () => {
    beforeEach(() => {
      wrapper = Wrapper()
    })

    it('renders the App', () => {
      expect(wrapper.find('#app').exists()).toBe(true)
    })

    it('has a component AuthLayout', () => {
      expect(wrapper.findComponent({ name: 'AuthLayout' }).exists()).toBe(true)
    })

    describe('route requires authorization', () => {
      beforeEach(() => {
        mocks.$route.meta.requiresAuth = true
        wrapper = Wrapper()
      })

      it('has a component DashboardLayout', () => {
        expect(wrapper.findComponent({ name: 'DashboardLayout' }).exists()).toBe(true)
      })
    })
  })
})
