import { shallowMount, createLocalVue, createWrapper } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import AppHeader from '@/components/AppHeader';

// Silencing warnings about undefined Bootsrap-vue components
Vue.config.silent = true;
const localVue = createLocalVue();
localVue.use(Vuex);

describe('AppHeader.vue', () => {
  const actions = {
    'global/getHostStatus': sinon.spy(),
    'eventLog/getEventLogData': sinon.spy()
  };

  const store = new Vuex.Store({ actions });
  const wrapper = shallowMount(AppHeader, {
    store,
    localVue,
    mocks: {
      $t: key => key
    }
  });

  // Reset spy for each test. Otherwise mutiple actions
  // are dispatched in each test
  beforeEach(() => {
    store.dispatch = sinon.spy();
  });

  describe('UI', () => {
    it('should check if AppHeader exists', () => {
      expect(wrapper.exists()).to.be.true;
    });

    it('should check if the skip navigation link exists', () => {
      expect(wrapper.get('.link-skip-nav').exists()).to.be.true;
    });

    it('refresh button click should emit refresh event', async () => {
      wrapper.get('#app-header-refresh').trigger('click');
      await wrapper.vm.$nextTick();
      expect(wrapper.emitted().refresh).to.exist;
    });

    it('nav-trigger button click should emit toggle:navigation event', async () => {
      const rootWrapper = createWrapper(wrapper.vm.$root);
      wrapper.get('#app-header-trigger').trigger('click');
      await wrapper.vm.$nextTick();
      expect(rootWrapper.emitted()['toggle:navigation']).to.exist;
    });

    it('logout button should dispatch authentication/logout', async () => {
      wrapper.get('#app-header-logout').trigger('click');
      await wrapper.vm.$nextTick();
      expect(store.dispatch).calledWith('authentication/logout');
    });
  });

  describe('Methods', () => {
    it('getHostInfo should dispatch global/getHostStatus', () => {
      wrapper.vm.getHostInfo();
      expect(store.dispatch).calledWith('global/getHostStatus');
    });

    it('getEvents should dispatch eventLog/getEventLogData', () => {
      wrapper.vm.getEvents();
      expect(store.dispatch).calledWith('eventLog/getEventLogData');
    });
  });
});
