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 });