github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/web/src/components/__tests__/RepoListItem.spec.ts (about)

     1  import Vue from 'vue';
     2  import { createLocalVue, shallowMount } from '@vue/test-utils';
     3  import Vuetify from 'vuetify';
     4  import flushPromises from 'flush-promises';
     5  import RepoListItem from '@/components/RepoListItem.vue';
     6  import '@testing-library/jest-dom';
     7  import axios, { AxiosError } from 'axios';
     8  import Vuex, { Store } from 'vuex';
     9  import { RootState, storeConfig } from '@/store';
    10  import { cloneDeep } from 'lodash';
    11  import { AxiosPlugin } from '@/plugins/http';
    12  
    13  Vue.use(Vuetify);
    14  
    15  describe('RepoListItem.vue', () => {
    16    console.warn = jest.fn();
    17    const localVue = createLocalVue();
    18    let vuetify: typeof Vuetify;
    19    let store: Store<RootState>;
    20    beforeEach(() => {
    21      vuetify = new Vuetify();
    22      store = new Vuex.Store(cloneDeep(storeConfig));
    23    });
    24    localVue.use(Vuetify);
    25    localVue.use(Vuex);
    26    localVue.use(AxiosPlugin);
    27  
    28    it('render source repository with unknown SCM', () => {
    29      const wrapper = shallowMount(RepoListItem, {
    30        localVue,
    31        vuetify,
    32        propsData: {
    33          repo: {
    34            SCM: 'unknown'
    35          }
    36        },
    37        stubs: ['router-link']
    38      });
    39      const icons = wrapper.findAll('v-icon-stub');
    40      expect(icons.length).toBeGreaterThan(0);
    41      expect(icons.at(0).text()).toBe('mdi-source-repository');
    42    });
    43  
    44    it('route to root if repository undefined', async () => {
    45      const wrapper = shallowMount(RepoListItem, {
    46        localVue,
    47        vuetify,
    48        propsData: {
    49          repo: {
    50            ReportID: 'abc'
    51          } as Repository
    52        }
    53      });
    54      await wrapper.vm.$nextTick();
    55      const button = wrapper.findComponent({
    56        ref: 'goto'
    57      });
    58      expect(button.attributes('to')).toBe('/');
    59    });
    60  
    61    it('route to root if repository has no name', async () => {
    62      const wrapper = shallowMount(RepoListItem, {
    63        localVue,
    64        vuetify,
    65        propsData: {
    66          repo: {
    67            SCM: 'gitea',
    68            ReportID: 'abc'
    69          } as Repository
    70        }
    71      });
    72      await wrapper.vm.$nextTick();
    73      const button = wrapper.findComponent({
    74        ref: 'goto'
    75      });
    76      expect(button.attributes('to')).toBe('/');
    77    });
    78  
    79    it('show activate button according to repository state', async () => {
    80      const wrapper = shallowMount(RepoListItem, {
    81        localVue,
    82        vuetify
    83      });
    84      let activateBtn = wrapper.findComponent({
    85        ref: 'activate'
    86      });
    87      expect(activateBtn.element).toBeVisible();
    88      await wrapper.setProps({
    89        repo: {
    90          ReportID: '1234'
    91        } as Repository
    92      });
    93      await wrapper.vm.$nextTick();
    94      activateBtn = wrapper.findComponent({
    95        ref: 'activate'
    96      });
    97      expect(activateBtn.element).not.toBeDefined();
    98    });
    99  
   100    it('handle repository activation fails', async () => {
   101      const wrapper = shallowMount(RepoListItem, {
   102        localVue,
   103        vuetify,
   104        store,
   105        propsData: {
   106          repo: {
   107            SCM: 'github',
   108            NameSpace: 'org',
   109            Name: 'repo'
   110          } as Repository
   111        }
   112      });
   113      const activateBtn = wrapper.findComponent({ ref: 'activate' });
   114      const snackBar = wrapper.find('v-snackbar-stub');
   115      const mockGet = jest.spyOn(axios, 'get');
   116      const mockPost = jest.spyOn(axios, 'post');
   117      mockGet.mockImplementationOnce(() => {
   118        expect(wrapper.vm.$data.loading).toBeTruthy();
   119        const err: Error = {
   120          response: {
   121            status: 404
   122          }
   123        } as AxiosError;
   124        return Promise.reject(err);
   125      });
   126      mockPost.mockRejectedValueOnce({
   127        response: {
   128          status: 500
   129        }
   130      } as AxiosError);
   131      expect(activateBtn.element).toBeVisible();
   132      activateBtn.vm.$emit('click');
   133      await flushPromises();
   134      expect(mockGet).toHaveBeenCalled();
   135      expect(mockPost).toHaveBeenCalled();
   136      expect(activateBtn.element).toBeVisible();
   137      expect(wrapper.vm.$data.loading).toBeFalsy();
   138      expect(snackBar.element).toHaveTextContent(/500/);
   139    });
   140  
   141    it('show route link button when activate successfully', async () => {
   142      const wrapper = shallowMount(RepoListItem, {
   143        localVue,
   144        vuetify,
   145        store,
   146        propsData: {
   147          repo: {
   148            SCM: 'github',
   149            NameSpace: 'org',
   150            Name: 'repo'
   151          } as Repository
   152        }
   153      });
   154      await wrapper.vm.$nextTick();
   155      const mockGet = jest.spyOn(axios, 'get');
   156      const mockPatch = jest.spyOn(axios, 'patch');
   157      mockGet.mockResolvedValueOnce({});
   158      mockPatch.mockResolvedValueOnce({});
   159  
   160      let activateBtn = wrapper.findComponent({ ref: 'activate' });
   161      let routeBtn = wrapper.findComponent({ ref: 'goto' });
   162      expect(routeBtn.element).not.toBeDefined();
   163      activateBtn.vm.$emit('click');
   164      return flushPromises().then(() => {
   165        routeBtn = wrapper.findComponent({ ref: 'goto' });
   166        activateBtn = wrapper.findComponent({ ref: 'activate' });
   167        expect(mockGet).toHaveBeenCalled();
   168        expect(mockPatch).toHaveBeenCalled();
   169        expect(routeBtn.element).toBeVisible();
   170        expect(activateBtn.element).not.toBeDefined();
   171      });
   172    });
   173  });