| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| import { flushPromises } from '@vue/test-utils' | |
| import { ref } from 'vue' | |
| import mockAxios from '../../mock/mockAxios' | |
| import AutogenView from '@/views/AutogenView' | |
| import user from '@/store/modules/user' | |
| import common from '../../common' | |
| import mockData from '../../mockData/AutogenView.mock.json' | |
| jest.mock('axios', () => mockAxios) | |
| jest.mock('@/vue-app', () => ({ | |
| vueProps: { | |
| $localStorage: { | |
| set: jest.fn((key, value) => {}), | |
| get: jest.fn((key) => { | |
| switch (key) { | |
| case 'HEADER_NOTICES': | |
| return [] | |
| default: | |
| return null | |
| } | |
| }) | |
| } | |
| } | |
| })) | |
| user.state.apis = mockData.apis | |
| let router = null | |
| let store = null | |
| let i18n = null | |
| let mocks = null | |
| let wrapper = null | |
| let originalFunc = {} | |
| const spyConsole = { | |
| log: null, | |
| warn: null | |
| } | |
| const state = { | |
| user: { | |
| apis: mockData.apis, | |
| info: mockData.info, | |
| defaultListViewPageSize: 20, | |
| headerNotices: [], | |
| customColumns: [] | |
| } | |
| } | |
| const mutations = { | |
| SET_HEADER_NOTICES: (state, jobsJsonArray) => { | |
| state.user.headerNotices = jobsJsonArray | |
| }, | |
| SET_CUSTOM_COLUMNS: (state, customColumns) => { | |
| state.user.customColumns = customColumns | |
| } | |
| } | |
| const actions = { | |
| SetProject: jest.fn(({ commit }, project) => {}), | |
| ToggleTheme: jest.fn(({ commit }, theme) => {}), | |
| SetCustomColumns: jest.fn(({ commit }, columns) => {}) | |
| } | |
| mockData.routes.push({ | |
| name: 'testRouter15', | |
| path: '/test-router-15', | |
| meta: { | |
| title: 'label.title', | |
| icon: 'play-circle-outlined', | |
| permission: ['testApiNameCase1'], | |
| columns: [ | |
| 'id', | |
| 'name', | |
| { | |
| column1: (record) => { | |
| return record.name | |
| } | |
| } | |
| ] | |
| }, | |
| component: {}, | |
| children: [{ | |
| name: 'testRouter15-1', | |
| path: '/test-router-15/:id', | |
| meta: { | |
| title: 'label.title', | |
| icon: 'play-circle-outlined' | |
| }, | |
| component: {} | |
| }] | |
| }) | |
| router = common.createMockRouter(mockData.routes) | |
| store = common.createMockStore(state, actions, mutations) | |
| i18n = common.createMockI18n('en', mockData.messages) | |
| mocks = { | |
| $config: { | |
| showSearchFilters: true, | |
| docBase: 'http://docs.cloudstack.apache.org/en/latest' | |
| }, | |
| $notifyError: jest.fn((error) => { | |
| return error | |
| }), | |
| $notification: { | |
| error: jest.fn((option) => { | |
| return { | |
| message: option.message, | |
| description: 'test-description-error', | |
| duration: option.duration | |
| } | |
| }), | |
| info: jest.fn((option) => { | |
| return { | |
| message: option.message, | |
| description: 'test-description-info', | |
| duration: option.duration | |
| } | |
| }), | |
| success: jest.fn((option) => { | |
| return { | |
| message: option.message, | |
| description: 'test-description-success', | |
| duration: option.duration | |
| } | |
| }), | |
| warning: jest.fn((option) => { | |
| return { | |
| message: option.message, | |
| description: 'test-description-warning', | |
| duration: option.duration | |
| } | |
| }) | |
| }, | |
| $message: { | |
| success: jest.fn((obj) => { | |
| return obj | |
| }), | |
| error: jest.fn((obj) => { | |
| return obj | |
| }), | |
| info: jest.fn((obj) => { | |
| return obj | |
| }) | |
| } | |
| } | |
| const factory = (opts = {}) => { | |
| router = opts.router || router | |
| i18n = opts.i18n || i18n | |
| store = opts.store || store | |
| mocks = opts.mocks || mocks | |
| return common.createFactory(AutogenView, { | |
| router, | |
| i18n, | |
| store, | |
| mocks, | |
| props: opts.props || {}, | |
| data: opts.data || {} | |
| }) | |
| } | |
| const { ResizeObserver, ls } = window | |
| router.push('/') | |
| describe('Views > AutogenView.vue', () => { | |
| beforeEach(async () => { | |
| jest.clearAllMocks() | |
| jest.spyOn(console, 'warn').mockImplementation(() => {}) | |
| delete window.ResizeObserver | |
| delete window.ls | |
| if (!wrapper) { | |
| await router.isReady() | |
| wrapper = factory() | |
| } | |
| window.ResizeObserver = jest.fn().mockImplementation(() => ({ | |
| observe: jest.fn(), | |
| unobserve: jest.fn(), | |
| disconnect: jest.fn() | |
| })) | |
| window.ls = { | |
| get: jest.fn((key) => []), | |
| set: jest.fn() | |
| } | |
| state.user.info.roletype = 'Normal' | |
| if (i18n.global.locale !== 'en') i18n.global.locale = 'en' | |
| }) | |
| afterEach(() => { | |
| window.ResizeObserver = ResizeObserver | |
| window.ResizeObserver = ls | |
| if (wrapper) { | |
| wrapper.vm.currentAction = {} | |
| wrapper.vm.resource = {} | |
| wrapper.vm.searchParams = {} | |
| wrapper.vm.actionData = {} | |
| wrapper.vm.dataView = false | |
| wrapper.vm.showAction = false | |
| wrapper.vm.selectedRowKeys = [] | |
| wrapper.vm.selectedRowKeys = [] | |
| wrapper.vm.items = [] | |
| wrapper.vm.promises = [] | |
| wrapper.vm.form = {} | |
| wrapper.vm.rules = {} | |
| } | |
| if (Object.keys(originalFunc).length > 0) { | |
| Object.keys(originalFunc).forEach(key => { | |
| switch (key) { | |
| case 'fetchData': | |
| wrapper.vm.fetchData = originalFunc[key] | |
| break | |
| case 'listUuidOpts': | |
| wrapper.vm.listUuidOpts = originalFunc[key] | |
| break | |
| case 'fillEditFormFieldValues': | |
| wrapper.vm.fillEditFormFieldValues = originalFunc[key] | |
| break | |
| case 'validateTwoPassword': | |
| wrapper.vm.validateTwoPassword = originalFunc[key] | |
| break | |
| case 'handleResponse': | |
| wrapper.vm.handleResponse = originalFunc[key] | |
| break | |
| case 'closeAction': | |
| wrapper.vm.closeAction = originalFunc[key] | |
| break | |
| case 'getFirstIndexFocus': | |
| wrapper.vm.getFirstIndexFocus = originalFunc[key] | |
| break | |
| case 'setRules': | |
| wrapper.vm.setRules = originalFunc[key] | |
| break | |
| case 'RefValidateFields': | |
| wrapper.vm.formRef.value.validateFields = originalFunc[key] | |
| break | |
| case 'formRef': | |
| wrapper.vm.formRef = originalFunc[key] | |
| break | |
| case 'switchProject': | |
| wrapper.vm.switchProject = originalFunc[key] | |
| break | |
| case 'execSubmit': | |
| wrapper.vm.execSubmit = originalFunc[key] | |
| break | |
| case 'shouldNavigateBack': | |
| wrapper.vm.shouldNavigateBack = originalFunc[key] | |
| break | |
| case 'routerGo': | |
| wrapper.vm.$router.go = originalFunc[key] | |
| break | |
| } | |
| }) | |
| originalFunc = {} | |
| } | |
| if (spyConsole.log) { | |
| spyConsole.log.mockClear() | |
| spyConsole.log.mockRestore() | |
| } | |
| if (spyConsole.warn) { | |
| spyConsole.warn.mockClear() | |
| spyConsole.warn.mockRestore() | |
| } | |
| }) | |
| describe('Navigation Guard', () => { | |
| it('beforeRouteUpdate() should be called', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const nextFun = jest.fn() | |
| const beforeRouteUpdate = wrapper.vm.$options.beforeRouteUpdate | |
| await router.push({ name: 'testRouter1' }) | |
| await beforeRouteUpdate.call(wrapper.vm, {}, {}, nextFun) | |
| await flushPromises() | |
| expect(wrapper.vm.currentPath).toEqual('/test-router-1') | |
| expect(nextFun).toHaveBeenCalled() | |
| done() | |
| }) | |
| it('beforeRouteLeave() should be called', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const nextFun = jest.fn() | |
| const beforeRouteLeave = wrapper.vm.$options.beforeRouteLeave | |
| await router.push({ name: 'testRouter2' }) | |
| await beforeRouteLeave.call(wrapper.vm, {}, {}, nextFun) | |
| await flushPromises() | |
| expect(wrapper.vm.currentPath).toEqual('/test-router-2') | |
| expect(nextFun).toHaveBeenCalled() | |
| done() | |
| }) | |
| }) | |
| describe('Watchers', () => { | |
| describe('$route', () => { | |
| it('The wrapper data does not change when $router do not change', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await wrapper.setData({ page: 2, itemCount: 10 }) | |
| await flushPromises() | |
| expect(wrapper.vm.page).toEqual(2) | |
| expect(wrapper.vm.itemCount).toEqual(10) | |
| expect(fetchData).not.toBeCalled() | |
| done() | |
| }) | |
| it('The wrapper data changes when $router changes', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await wrapper.setData({ page: 2, itemCount: 10 }) | |
| await router.push({ name: 'testRouter3' }) | |
| await flushPromises() | |
| expect(wrapper.vm.page).toEqual(1) | |
| expect(wrapper.vm.itemCount).toEqual(0) | |
| expect(fetchData).toBeCalled() | |
| done() | |
| }) | |
| it('switchProject() should be called when $route changes with projectid in query', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| originalFunc.switchProject = wrapper.vm.switchProject | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.switchProject = jest.fn((projectid) => {}) | |
| const switchProject = jest.spyOn(wrapper.vm, 'switchProject') | |
| await router.push({ name: 'testRouter30', query: { projectid: 'test-project-id' } }) | |
| await flushPromises() | |
| expect(switchProject).toHaveBeenCalledTimes(1) | |
| expect(switchProject).toHaveBeenCalledWith('test-project-id') | |
| done() | |
| }) | |
| }) | |
| describe('$i18n.locale', () => { | |
| it('Check language and fetchData() when not changing locale', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| expect(wrapper.vm.$t('labelname')).toEqual('test-name-en') | |
| expect(fetchData).not.toBeCalled() | |
| done() | |
| }) | |
| it('Check languages and fetchData() when changing locale', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| i18n.global.locale = 'de' | |
| await flushPromises() | |
| expect(wrapper.vm.$t('labelname')).toEqual('test-name-de') | |
| expect(fetchData).toBeCalled() | |
| done() | |
| }) | |
| }) | |
| }) | |
| describe('Methods', () => { | |
| describe('switchProject', () => { | |
| it('API not called when switchProject() is called with not have projectId', async (done) => { | |
| await wrapper.vm.switchProject() | |
| await flushPromises() | |
| expect(mockAxios).not.toBeCalled() | |
| done() | |
| }) | |
| it('API not called when switchProject() is called with projectId empty', async (done) => { | |
| await wrapper.vm.switchProject('') | |
| await flushPromises() | |
| expect(mockAxios).not.toBeCalled() | |
| done() | |
| }) | |
| it('API not called when switchProject() is called with projectId length not equal 36', async (done) => { | |
| await wrapper.vm.switchProject('test-project-id') | |
| await flushPromises() | |
| expect(mockAxios).not.toBeCalled() | |
| done() | |
| }) | |
| it('API will be called when switchProject() is called with projectId satisfying the condition', async (done) => { | |
| mockAxios.mockResolvedValue({}) | |
| await router.push({ name: 'testRouter31' }) | |
| await wrapper.vm.switchProject('111111111111111111111111111111111111') | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'listProjects', | |
| id: '111111111111111111111111111111111111', | |
| listall: true, | |
| details: 'min', | |
| response: 'json' | |
| } | |
| }) | |
| done() | |
| }) | |
| it('check $router not changes when API response with result empty', async (done) => { | |
| mockAxios.mockResolvedValue({ listprojectsresponse: {} }) | |
| await router.push({ name: 'testRouter32' }) | |
| await wrapper.vm.switchProject('111111111111111111111111111111111111') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-32') | |
| expect(router.currentRoute.value.query).toEqual({}) | |
| done() | |
| }) | |
| it('check $router, $store event when API response with result not empty', async (done) => { | |
| mockAxios.mockResolvedValue({ listprojectsresponse: { project: [{ id: 'project-id' }] } }) | |
| await router.push({ name: 'testRouter33' }) | |
| await wrapper.vm.switchProject('111111111111111111111111111111111111') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-33') | |
| expect(router.currentRoute.value.query).toEqual({}) | |
| done() | |
| }) | |
| }) | |
| describe('fetchData()', () => { | |
| it('fetchData() should be return empty when $route.name equal `deployVirtualMachine`', async (done) => { | |
| await router.push({ name: 'deployVirtualMachine' }) | |
| await wrapper.vm.fetchData() | |
| expect(wrapper.vm.items).toEqual([]) | |
| done() | |
| }) | |
| it('check routeName when fetchData() is called with $route.name is not empty', async (done) => { | |
| await router.push({ name: 'testRouter4' }) | |
| await flushPromises() | |
| expect(wrapper.vm.routeName).toEqual('testRouter4') | |
| expect(wrapper.vm.items).toEqual([]) | |
| done() | |
| }) | |
| it('check routeName when fetchData() is called with $route.name is empty', async (done) => { | |
| await router.replace('/test-router-5') | |
| await flushPromises() | |
| expect(wrapper.vm.routeName).toEqual('testRouter5') | |
| done() | |
| }) | |
| it('check resource, dataView when fetchData() is called with $route.meta.params is not empty', async (done) => { | |
| await router.push({ name: 'testRouter6', params: { id: 'test-id' } }) | |
| await flushPromises() | |
| expect(wrapper.vm.resource).toEqual({}) | |
| expect(wrapper.vm.dataView).toBeTruthy() | |
| done() | |
| }) | |
| it('check columnKeys, actions when fetchData() is called with $route.meta.actions, route.meta.columns is not empty', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 0, | |
| testapinamecase1: [] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter7' }) | |
| await flushPromises() | |
| expect(wrapper.vm.columnKeys.length).toEqual(3) | |
| expect(wrapper.vm.actions.length).toEqual(1) | |
| expect(wrapper.vm.columnKeys).toEqual(['column1', 'column2', 'column3']) | |
| expect(wrapper.vm.actions).toEqual([{ | |
| label: 'labelname', | |
| api: 'testApiNameCase1', | |
| icon: 'plus-outlined', | |
| listView: true | |
| }]) | |
| done() | |
| }) | |
| it('check columnKeys assign by store.getters.apis when fetchData() is called', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase4response: { | |
| count: 0, | |
| testapinamecase4: [] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter8' }) | |
| await flushPromises() | |
| expect(wrapper.vm.columnKeys.length).toEqual(3) | |
| expect(wrapper.vm.columnKeys).toEqual(['column1', 'column2', 'column3']) | |
| done() | |
| }) | |
| it('check columnKeys assign by $route.meta.columns when fetchData() is called', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 0, | |
| testapinamecase1: [] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter9' }) | |
| await flushPromises() | |
| expect(wrapper.vm.columns.length).toEqual(2) | |
| expect(wrapper.vm.columns[0].key).toEqual('name') | |
| expect(wrapper.vm.columns[0].title).toEqual('name-en') | |
| expect(wrapper.vm.columns[0].dataIndex).toEqual('name') | |
| expect(typeof wrapper.vm.columns[0].sorter).toBe('function') | |
| expect(wrapper.vm.columns[1].key).toEqual('filtercolumn') | |
| expect(wrapper.vm.columns[1].dataIndex).toEqual('filtercolumn') | |
| expect(wrapper.vm.columns[1].customFilterDropdown).toBeTruthy() | |
| done(0) | |
| }) | |
| it('API should be called with params assign by $route.query', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase2response: { | |
| count: 0, | |
| testapinamecase2: [] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter10', query: { key: 'test-value' } }) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase2', | |
| response: 'json', | |
| listall: true, | |
| key: 'test-value', | |
| page: 1, | |
| pagesize: 20 | |
| }), | |
| method: 'POST', | |
| url: '/' | |
| }) | |
| done() | |
| }) | |
| it('API should be called with params assign by $route.meta.params', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase3response: { | |
| count: 0, | |
| testapinamecase3: [] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter11' }) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase3', | |
| response: 'json', | |
| listall: true, | |
| key: 'test-value', | |
| page: 1, | |
| pagesize: 20 | |
| }), | |
| method: 'POST', | |
| url: '/' | |
| }) | |
| done() | |
| }) | |
| // it('API should be called with params has item id, name when $route.path startWith /ssh/', async (done) => { | |
| // await mockAxios.mockResolvedValue({ | |
| // testapinamecase1response: { | |
| // count: 0, | |
| // testapinamecase1: [{ | |
| // id: 'test-id-1', | |
| // name: 'test-name-1' | |
| // }] | |
| // } | |
| // }) | |
| // await router.push({ name: 'testRouter12', params: { id: 'test-id' } }) | |
| // await flushPromises() | |
| // expect(mockAxios).toHaveBeenCalled() | |
| // expect(mockAxios).toHaveBeenLastCalledWith({ | |
| // url: '/', | |
| // method: 'GET', | |
| // data: new URLSearchParams(), | |
| // params: { | |
| // command: 'testApiNameCase1', | |
| // listall: true, | |
| // id: 'test-id', | |
| // name: 'test-id', | |
| // page: 1, | |
| // pagesize: 20, | |
| // response: 'json' | |
| // } | |
| // }) | |
| // done() | |
| // }) | |
| it('API should be called with params has item id, hostname when $route.path startWith /ldapsetting/', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 0, | |
| testapinamecase1: [{ | |
| id: 'uuid1', | |
| name: 'test-name-1' | |
| }] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter13', params: { id: 'uuid1' } }) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| listall: true, | |
| id: 'uuid1', | |
| page: 1, | |
| pagesize: 20 | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('check items, resource when api is called with result is not empty', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| listtemplatesresponse: { | |
| count: 2, | |
| templates: [{ | |
| id: 'uuid1', | |
| templateid: 'templateid-1', | |
| name: 'template-test-1' | |
| }, { | |
| id: 'uuid2', | |
| templateid: 'templateid-2', | |
| name: 'template-test-2' | |
| }] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter14' }) | |
| await flushPromises() | |
| expect(wrapper.vm.items.length).toEqual(2) | |
| expect(wrapper.vm.items).toEqual([ | |
| { | |
| id: 'uuid1', | |
| templateid: 'templateid-1', | |
| name: 'template-test-1', | |
| key: 0 | |
| }, | |
| { | |
| id: 'uuid2', | |
| templateid: 'templateid-2', | |
| name: 'template-test-2', | |
| key: 1 | |
| } | |
| ]) | |
| expect(wrapper.vm.resource).toEqual({ | |
| id: 'uuid1', | |
| templateid: 'templateid-1', | |
| name: 'template-test-1', | |
| key: 0 | |
| }) | |
| done() | |
| }) | |
| it('check items, resource when api is called and $route.meta.columns has function', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 1, | |
| testapinamecase1: [{ | |
| id: 'test-id', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter15' }) | |
| await flushPromises() | |
| expect(wrapper.vm.items).toEqual([{ | |
| id: 'test-id', | |
| name: 'test-name-value', | |
| key: 0, | |
| column1: 'test-name-value' | |
| }]) | |
| expect(wrapper.vm.resource).toEqual({ | |
| id: 'test-id', | |
| name: 'test-name-value', | |
| key: 0, | |
| column1: 'test-name-value' | |
| }) | |
| done() | |
| }) | |
| // it('check items, resource when api is called and $route.path startWith /ssh', async (done) => { | |
| // await mockAxios.mockResolvedValue({ | |
| // testapinamecase1response: { | |
| // count: 1, | |
| // testapinamecase1: [{ | |
| // name: 'test-name-value' | |
| // }] | |
| // } | |
| // }) | |
| // await router.push({ name: 'testRouter16' }) | |
| // await flushPromises() | |
| // | |
| // expect(wrapper.vm.items).toEqual([{ | |
| // id: 'test-name-value', | |
| // name: 'test-name-value', | |
| // key: 0 | |
| // }]) | |
| // expect(wrapper.vm.resource).toEqual({ | |
| // id: 'test-name-value', | |
| // name: 'test-name-value', | |
| // key: 0 | |
| // }) | |
| // done() | |
| // }) | |
| it('check items, resource when api is called and $route.path startWith /ldapsetting', async (done) => { | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 1, | |
| testapinamecase1: [{ | |
| id: 'uuid1', | |
| name: 'test-name-value', | |
| hostname: 'test-hostname-value' | |
| }] | |
| } | |
| }) | |
| await router.push({ name: 'testRouter17' }) | |
| await flushPromises() | |
| expect(wrapper.vm.items).toEqual([{ | |
| id: 'uuid1', | |
| name: 'test-name-value', | |
| hostname: 'test-hostname-value', | |
| key: 0 | |
| }]) | |
| expect(wrapper.vm.resource).toEqual({ | |
| id: 'uuid1', | |
| name: 'test-name-value', | |
| hostname: 'test-hostname-value', | |
| key: 0 | |
| }) | |
| done() | |
| }) | |
| it('check $notifyError is called when api is called with throw error', async (done) => { | |
| const errorMock = { | |
| response: {}, | |
| message: 'Error: throw exception error' | |
| } | |
| await mockAxios.mockRejectedValue(errorMock) | |
| await router.push({ name: 'testRouter18' }) | |
| await flushPromises() | |
| expect(mocks.$notifyError).toHaveBeenCalledTimes(1) | |
| expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock) | |
| done() | |
| }) | |
| it('check $notifyError is called and router path = /exception/403 when api is called with throw error', async (done) => { | |
| const errorMock = { | |
| response: { | |
| status: 405 | |
| }, | |
| message: 'Error: Method Not Allowed' | |
| } | |
| await mockAxios.mockRejectedValue(errorMock) | |
| await router.push({ name: 'testRouter19' }) | |
| await flushPromises() | |
| expect(mocks.$notifyError).toHaveBeenCalledTimes(1) | |
| expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock) | |
| expect(router.currentRoute.value.path).toEqual('/exception/403') | |
| done() | |
| }) | |
| it('check $notifyError is called and router path = /exception/404 when api is called with throw error', async (done) => { | |
| const errorMock = { | |
| response: { | |
| status: 430 | |
| }, | |
| message: 'Error: Request Header Fields Too Large' | |
| } | |
| await mockAxios.mockRejectedValue(errorMock) | |
| await router.push({ name: 'testRouter19' }) | |
| await flushPromises() | |
| expect(mocks.$notifyError).toHaveBeenCalledTimes(1) | |
| expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock) | |
| expect(router.currentRoute.value.path).toEqual('/exception/404') | |
| done() | |
| }) | |
| it('check $notifyError is called and router path = /exception/500 when api is called with throw error', async (done) => { | |
| const errorMock = { | |
| response: { | |
| status: 530 | |
| }, | |
| message: 'Error: Site is frozen' | |
| } | |
| await mockAxios.mockRejectedValue(errorMock) | |
| await router.push({ name: 'testRouter19' }) | |
| await flushPromises() | |
| expect(mocks.$notifyError).toHaveBeenCalledTimes(1) | |
| expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock) | |
| expect(router.currentRoute.value.path).toEqual('/exception/500') | |
| done() | |
| }) | |
| }) | |
| describe('onSearch()', () => { | |
| it('check router when onSearch() is called with args empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter20', query: { page: 1, pagesize: 20 } }) | |
| await wrapper.vm.onSearch() | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-20') | |
| expect(router.currentRoute.value.query).toEqual({ page: '1', pagesize: '20' }) | |
| done() | |
| }) | |
| it('check router when onSearch() is called with args not empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter21', query: { page: 1, pagesize: 20 } }) | |
| await wrapper.vm.onSearch({ value: 'test-value' }) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-21') | |
| expect(router.currentRoute.value.query).toEqual({ page: '1', pagesize: '20', value: 'test-value' }) | |
| done() | |
| }) | |
| it('check router when onSearch() is called with args have searchQuery', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter22', query: { page: 1, pagesize: 20 } }) | |
| await wrapper.vm.onSearch({ searchQuery: 'test-value' }) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-22') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| page: '1', | |
| pagesize: '20', | |
| keyword: 'test-value', | |
| q: 'test-value' | |
| }) | |
| done() | |
| }) | |
| it('check router when onSearch() is called with args have searchQuery and route.name equal `role`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'role' }) | |
| await wrapper.vm.onSearch({ searchQuery: 'test-value' }) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/role') | |
| expect(router.currentRoute.value.query).toEqual({ keyword: 'test-value', q: 'test-value', page: '1', pagesize: '20' }) | |
| done() | |
| }) | |
| it('check router when onSearch() is called with args have searchQuery and route.name equal `quotaemailtemplate`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'quotaemailtemplate' }) | |
| await wrapper.vm.onSearch({ searchQuery: 'test-value' }) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/quotaemailtemplate') | |
| expect(router.currentRoute.value.query).toEqual({ templatetype: 'test-value', q: 'test-value', page: '1', pagesize: '20' }) | |
| done() | |
| }) | |
| it('check router when onSearch() is called with args have searchQuery and route.name equal `quotaemailtemplate`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'globalsetting' }) | |
| await wrapper.vm.onSearch({ searchQuery: 'test-value' }) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/globalsetting') | |
| expect(router.currentRoute.value.query).toEqual({ name: 'test-value', q: 'test-value', page: '1', pagesize: '20' }) | |
| done() | |
| }) | |
| it('fetchData() should be called when onSearch() is called', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await router.push({ name: 'testRouter23', query: { page: 1, pagesize: 20, value: 'test-value' } }) | |
| await wrapper.vm.onSearch({ page: '1', pagesize: '20', value: 'test-value' }) | |
| await flushPromises() | |
| expect(fetchData).toHaveBeenLastCalledWith({ page: '1', pagesize: '20', value: 'test-value' }) | |
| done() | |
| }) | |
| }) | |
| describe('closeAction()', () => { | |
| it('check currentAction, showAction when closeAction() is called', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| label: 'label.name', | |
| loading: true, | |
| paramFields: [] | |
| }, | |
| showAction: true | |
| }) | |
| await wrapper.vm.closeAction() | |
| await flushPromises() | |
| expect(wrapper.vm.currentAction).toEqual({}) | |
| expect(wrapper.vm.showAction).toBeFalsy() | |
| done() | |
| }) | |
| }) | |
| describe('execAction()', () => { | |
| it('check showAction, actionData and router name when execAction() is called', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| await wrapper.setData({ actionData: { name: 'test-add-action' } }) | |
| await wrapper.vm.execAction({ | |
| label: 'labelname', | |
| icon: 'plus-outlined', | |
| component: {}, | |
| api: 'testRouter24', | |
| popup: false | |
| }) | |
| await flushPromises() | |
| expect(wrapper.vm.showAction).toBeFalsy() | |
| expect(router.currentRoute.value.name).toEqual('testRouter24') | |
| done() | |
| }) | |
| it('check currentAction params and paramsField when execAction() is called', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| await wrapper.vm.execAction({ | |
| label: 'label.name', | |
| api: 'testApiNameCase5', | |
| paramFields: [] | |
| }) | |
| await flushPromises() | |
| expect(wrapper.vm.currentAction.params).toEqual([ | |
| { name: 'id', type: 'string' }, | |
| { name: 'name', type: 'string' }, | |
| { name: 'column1', type: 'string' }, | |
| { name: 'column2', type: 'string' }, | |
| { name: 'column3', type: 'string' } | |
| ]) | |
| expect(wrapper.vm.currentAction.paramFields).toEqual([]) | |
| expect(wrapper.vm.showAction).toBeTruthy() | |
| done() | |
| }) | |
| it('check currentAction params and paramsField when execAction() is called with args is exists', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| await wrapper.vm.execAction({ | |
| api: 'testApiNameCase5', | |
| args: ['column1', 'column2', 'column3'] | |
| }) | |
| await flushPromises() | |
| expect(wrapper.vm.currentAction.params).toEqual([ | |
| { name: 'column1', type: 'string' }, | |
| { name: 'column2', type: 'string' }, | |
| { name: 'column3', type: 'string' }, | |
| { name: 'name', type: 'string' }, | |
| { name: 'id', type: 'string' } | |
| ]) | |
| expect(wrapper.vm.currentAction.paramFields).toEqual([ | |
| { name: 'column1', type: 'string' }, | |
| { name: 'column2', type: 'string' }, | |
| { name: 'column3', type: 'string' } | |
| ]) | |
| expect(wrapper.vm.showAction).toBeTruthy() | |
| done() | |
| }) | |
| it('check currentAction params and paramsField when execAction() is called with args is function', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| await wrapper.vm.execAction({ | |
| api: 'testApiNameCase5', | |
| resource: { id: 'test-id-value', name: 'test-name-value' }, | |
| args: (record, store) => { | |
| return ['Admin'].includes(store.userInfo.roletype) ? ['column1', 'column2', 'column3'] : ['id', 'name'] | |
| } | |
| }) | |
| await flushPromises() | |
| expect(wrapper.vm.currentAction.params).toEqual([ | |
| { name: 'id', type: 'string' }, | |
| { name: 'name', type: 'string' }, | |
| { name: 'column1', type: 'string' }, | |
| { name: 'column2', type: 'string' }, | |
| { name: 'column3', type: 'string' } | |
| ]) | |
| expect(wrapper.vm.currentAction.paramFields).toEqual([ | |
| { name: 'id', type: 'string' }, | |
| { name: 'name', type: 'string' } | |
| ]) | |
| expect(wrapper.vm.showAction).toBeTruthy() | |
| done() | |
| }) | |
| it('check currentAction paramsField and listUuidOpts() is called when execAction() is called', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| const listUuidOpts = jest.spyOn(wrapper.vm, 'listUuidOpts') | |
| await wrapper.vm.execAction({ | |
| api: 'testApiNameCase6', | |
| args: ['id', 'tags', 'column1', 'column2', 'account'], | |
| mapping: { | |
| column2: () => { | |
| return 'test-value' | |
| } | |
| } | |
| }) | |
| await flushPromises() | |
| expect(wrapper.vm.currentAction.paramFields).toEqual([ | |
| { name: 'id', type: 'uuid' }, | |
| { name: 'tags', type: 'string' }, | |
| { name: 'column1', type: 'list' }, | |
| { name: 'column2', type: 'string' }, | |
| { name: 'account', type: 'string' } | |
| ]) | |
| expect(wrapper.vm.showAction).toBeTruthy() | |
| expect(listUuidOpts).toHaveBeenCalledTimes(4) | |
| expect(listUuidOpts).toHaveBeenCalledWith({ name: 'id', type: 'uuid' }, undefined) | |
| expect(listUuidOpts).toHaveBeenCalledWith({ name: 'column1', type: 'list' }, undefined) | |
| expect(listUuidOpts).toHaveBeenCalledWith({ name: 'column2', type: 'string' }, undefined) | |
| done() | |
| }) | |
| it('check fillEditFormFieldValues() is called when execAction() is called', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| const fillEditFormFieldValues = jest.spyOn(wrapper.vm, 'fillEditFormFieldValues') | |
| await wrapper.vm.execAction({ | |
| api: 'testApiNameCase6', | |
| dataView: true, | |
| icon: 'edit-outlined' | |
| }) | |
| await flushPromises() | |
| expect(fillEditFormFieldValues).toHaveBeenCalled() | |
| done() | |
| }) | |
| it('check currentAction paramFields when execAction() is called args has confirmpassword field', async (done) => { | |
| originalFunc.getFirstIndexFocus = wrapper.vm.getFirstIndexFocus | |
| originalFunc.setRules = wrapper.vm.setRules | |
| originalFunc.listUuidOpts = wrapper.vm.listUuidOpts | |
| originalFunc.fillEditFormFieldValues = wrapper.vm.fillEditFormFieldValues | |
| wrapper.vm.getFirstIndexFocus = jest.fn() | |
| wrapper.vm.setRules = jest.fn((param) => {}) | |
| wrapper.vm.listUuidOpts = jest.fn((param) => {}) | |
| wrapper.vm.fillEditFormFieldValues = jest.fn() | |
| await wrapper.vm.execAction({ | |
| api: 'testApiNameCase6', | |
| args: ['confirmpassword'], | |
| mapping: {} | |
| }) | |
| await flushPromises() | |
| expect(wrapper.vm.currentAction.paramFields).toEqual([ | |
| { name: 'confirmpassword', type: 'password', required: true, description: 'confirmpassword-description-en' } | |
| ]) | |
| done() | |
| }) | |
| }) | |
| describe('listUuidOpts()', () => { | |
| it('API not called when listUuidOpts() is called with currentAction.mapping.id is null', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| mapping: { | |
| id: () => { return '' } | |
| } | |
| } | |
| }) | |
| await wrapper.vm.listUuidOpts({ name: 'id', type: 'uuid' }) | |
| await flushPromises() | |
| expect(mockAxios).not.toHaveBeenCalled() | |
| done() | |
| }) | |
| it('API not called when listUuidOpts() is called with currentAction.mapping is empty', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| mapping: {} | |
| } | |
| }) | |
| await wrapper.vm.listUuidOpts({ name: 'test-name', type: 'uuid' }) | |
| await flushPromises() | |
| expect(mockAxios).not.toHaveBeenCalled() | |
| done() | |
| }) | |
| it('API should be called and param.opts when listUuidOpts() is called with currentAction.mapping[param.name].api', async (done) => { | |
| const param = { name: 'template', type: 'uuid' } | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 1, | |
| testapinamecase1: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await wrapper.setData({ | |
| currentAction: { | |
| mapping: { | |
| template: { | |
| api: 'testApiNameCase1' | |
| } | |
| } | |
| } | |
| }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| listall: true, | |
| showicon: true | |
| }) | |
| }) | |
| expect(param).toEqual({ | |
| name: 'template', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| }) | |
| done() | |
| }) | |
| it('API should be called when listUuidOpts() is called with store apis has api startWith param.name', async (done) => { | |
| const param = { name: 'testapiname', type: 'uuid' } | |
| await mockAxios.mockResolvedValue({ | |
| listtestapinamesresponse: { | |
| count: 1, | |
| testapiname: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'listTestApiNames', | |
| response: 'json', | |
| listall: true | |
| } | |
| }) | |
| expect(param).toEqual({ | |
| name: 'testapiname', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| }) | |
| done() | |
| }) | |
| it('API should be called with params has item name and value assign by resource', async (done) => { | |
| const param = { name: 'template', type: 'uuid' } | |
| await mockAxios.mockResolvedValue({ | |
| testapinamecase1response: { | |
| count: 0, | |
| testapinamecase1: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await wrapper.setData({ | |
| currentAction: { | |
| mapping: { | |
| template: { | |
| api: 'testApiNameCase1', | |
| params: (record) => { | |
| return { | |
| name: record.name | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| resource: { | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| } | |
| }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| listall: true, | |
| name: 'test-name-value', | |
| showicon: true | |
| }) | |
| }) | |
| expect(param).toEqual({ | |
| name: 'template', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| }) | |
| done() | |
| }) | |
| it('API should be called with params has item templatefilter when apiName is listTemplates', async (done) => { | |
| const param = { name: 'id', type: 'uuid' } | |
| await mockAxios.mockResolvedValue({ | |
| listtemplateresponse: { | |
| count: 1, | |
| templates: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await wrapper.setData({ | |
| apiName: 'listTemplates' | |
| }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'listTemplates', | |
| response: 'json', | |
| listall: true, | |
| templatefilter: 'executable' | |
| } | |
| }) | |
| expect(param).toEqual({ | |
| name: 'id', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| }) | |
| done() | |
| }) | |
| it('API should be called with params has item isofilter when apiName is listIsos', async (done) => { | |
| const param = { name: 'id', type: 'uuid' } | |
| await mockAxios.mockResolvedValue({ | |
| listisosresponse: { | |
| count: 1, | |
| iso: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await wrapper.setData({ apiName: 'listIsos' }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'listIsos', | |
| response: 'json', | |
| listall: true, | |
| isofilter: 'executable' | |
| } | |
| }) | |
| expect(param).toEqual({ | |
| name: 'id', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| }) | |
| done() | |
| }) | |
| it('API should be called with params has item type = routing when apiName is listHosts', async (done) => { | |
| const param = { name: 'id', type: 'uuid' } | |
| await mockAxios.mockResolvedValue({ | |
| listhostresponse: { | |
| count: 1, | |
| hosts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| } | |
| }) | |
| await wrapper.setData({ apiName: 'listHosts' }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'listHosts', | |
| response: 'json', | |
| listall: true, | |
| type: 'routing' | |
| } | |
| }) | |
| expect(param).toEqual({ | |
| name: 'id', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [{ | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| }] | |
| }) | |
| done() | |
| }) | |
| it('API should be called and param.opts is empty when api throw error', async (done) => { | |
| const param = { name: 'id', type: 'uuid', loading: true } | |
| spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {}) | |
| await mockAxios.mockRejectedValue({ | |
| response: {}, | |
| stack: 'Error: throw exception error' | |
| }) | |
| await wrapper.setData({ apiName: 'testApiNameCase1' }) | |
| await wrapper.vm.listUuidOpts(param) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| listall: true | |
| }) | |
| }) | |
| expect(param).toEqual({ | |
| name: 'id', | |
| type: 'uuid', | |
| loading: false, | |
| opts: [] | |
| }) | |
| done() | |
| }) | |
| }) | |
| describe('pollActionCompletion()', () => { | |
| it('check $notification when pollActionCompletion() is called with action is empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await mockAxios.mockResolvedValue({ | |
| queryasyncjobresultresponse: { | |
| jobstatus: 1, | |
| jobresult: { | |
| name: 'test-name-value' | |
| } | |
| } | |
| }) | |
| await wrapper.vm.pollActionCompletion('test-job-id', { label: 'label.name' }) | |
| await flushPromises() | |
| expect(fetchData).toHaveBeenCalled() | |
| expect(mocks.$notification.info).not.toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'queryAsyncJobResult', | |
| response: 'json', | |
| jobId: 'test-job-id' | |
| } | |
| }) | |
| done() | |
| }) | |
| it('check $notification when pollActionCompletion() is called with action is not empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await mockAxios.mockResolvedValue({ | |
| queryasyncjobresultresponse: { | |
| jobstatus: 1, | |
| jobresult: { | |
| name: 'test-name-value' | |
| } | |
| } | |
| }) | |
| await wrapper.vm.pollActionCompletion('test-job-id', { | |
| label: 'labelname', | |
| response: (jobResult) => { | |
| return jobResult.name | |
| } | |
| }) | |
| await flushPromises() | |
| expect(fetchData).toHaveBeenCalled() | |
| expect(mocks.$notification.info).toHaveBeenCalled() | |
| expect(mocks.$notification.info).toHaveLastReturnedWith({ | |
| message: 'test-name-en', | |
| description: 'test-description-info', | |
| duration: 0 | |
| }) | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'queryAsyncJobResult', | |
| response: 'json', | |
| jobId: 'test-job-id' | |
| } | |
| }) | |
| done() | |
| }) | |
| it('fetchData() should be called when $pollJob error response', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await mockAxios.mockResolvedValue({ | |
| queryasyncjobresultresponse: { | |
| jobstatus: 2, | |
| jobresult: { | |
| errortext: 'test-error-message' | |
| } | |
| } | |
| }) | |
| await wrapper.vm.pollActionCompletion('test-job-id', { | |
| label: 'labelname', | |
| response: (jobResult) => { | |
| return jobResult.name | |
| } | |
| }) | |
| await flushPromises() | |
| expect(fetchData).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'GET', | |
| params: { | |
| command: 'queryAsyncJobResult', | |
| response: 'json', | |
| jobId: 'test-job-id' | |
| } | |
| }) | |
| done() | |
| }) | |
| }) | |
| describe('fillEditFormFieldValues()', () => { | |
| it('form data should be empty when currentAction.paramFields empty', async (done) => { | |
| await wrapper.setData({ currentAction: { paramFields: [] } }) | |
| await wrapper.vm.fillEditFormFieldValues() | |
| await flushPromises() | |
| expect(wrapper.vm.form).toEqual({}) | |
| done() | |
| }) | |
| it('form data should not empty when currentAction.paramFields has item type equal `list`', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| paramFields: [ | |
| { name: 'domainids', type: 'list' } | |
| ] | |
| }, | |
| resource: { | |
| domainname: ['test-domain-value-1', 'test-domain-value-2'] | |
| } | |
| }) | |
| await wrapper.vm.fillEditFormFieldValues() | |
| await flushPromises() | |
| expect(wrapper.vm.form).toEqual({ domainids: ['test-domain-value-1', 'test-domain-value-2'] }) | |
| done() | |
| }) | |
| it('form data should not empty when currentAction.paramFields has item type equal `account`', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| paramFields: [ | |
| { name: 'account', type: 'string' } | |
| ] | |
| }, | |
| resource: { | |
| account: 'test-account-value' | |
| } | |
| }) | |
| await wrapper.vm.fillEditFormFieldValues() | |
| await flushPromises() | |
| expect(wrapper.vm.form).toEqual({ account: 'test-account-value' }) | |
| done() | |
| }) | |
| it('form data should not empty when currentAction.paramFields has item type not in [`list`, `account`]', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| paramFields: [ | |
| { name: 'name', type: 'string' } | |
| ] | |
| }, | |
| resource: { | |
| name: 'test-name-value' | |
| } | |
| }) | |
| await wrapper.vm.fillEditFormFieldValues() | |
| await flushPromises() | |
| expect(wrapper.vm.form).toEqual({ name: 'test-name-value' }) | |
| done() | |
| }) | |
| it('form data should be empty when currentAction.paramFields has item not exist in resource', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| paramFields: [ | |
| { name: 'templatename', type: 'string' } | |
| ] | |
| }, | |
| resource: { | |
| name: 'test-name-value' | |
| } | |
| }) | |
| await wrapper.vm.fillEditFormFieldValues() | |
| await flushPromises() | |
| expect(wrapper.vm.form).toEqual({}) | |
| done() | |
| }) | |
| }) | |
| describe('changeFilter()', () => { | |
| it('check `route.query` when changeFilter() is called with empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter25' }) | |
| await wrapper.vm.changeFilter() | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-25') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| filter: undefined, | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with $route has query', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter25', query: { templatefilter: 'template', account: 'test-account' } }) | |
| await wrapper.vm.changeFilter('filter') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-25') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| filter: 'filter', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with filter not empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter25' }) | |
| await wrapper.vm.changeFilter('filter') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-25') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| filter: 'filter', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with $route.name equal `template`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'template' }) | |
| await wrapper.vm.changeFilter('filter') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/template') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| filter: 'filter', | |
| templatefilter: 'filter', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with $route.name equal `iso`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'iso' }) | |
| await wrapper.vm.changeFilter('filter') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/iso') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| filter: 'filter', | |
| isofilter: 'filter', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with $route.name equal `guestnetwork`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'guestnetwork' }) | |
| await wrapper.vm.changeFilter('filter') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/guestnetwork') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| filter: 'filter', | |
| networkfilter: 'filter', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with filter equal `self` and $route.name equal `vm`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'vm' }) | |
| await wrapper.vm.changeFilter('self') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/vm') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| account: 'test-account', | |
| domainid: 'test-domain-id', | |
| filter: 'self', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| it('check `route.query` when changeFilter() is called with filter equal `running` and $route.name equal `vm`', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'vm' }) | |
| await wrapper.vm.changeFilter('running') | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/vm') | |
| expect(router.currentRoute.value.query).toEqual({ | |
| state: 'running', | |
| filter: 'running', | |
| page: '1', | |
| pagesize: '20' | |
| }) | |
| done() | |
| }) | |
| }) | |
| describe('changePage()', () => { | |
| it('check $route query when changePage() is called with args not empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter26' }) | |
| await wrapper.vm.changePage(2, 10) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-26') | |
| expect(router.currentRoute.value.query).toEqual({ page: '2', pagesize: '10' }) | |
| done() | |
| }) | |
| it('check $route query when changePage() is called with args empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter26', query: { page: 1, pagesize: 10 } }) | |
| await wrapper.vm.changePage() | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-26') | |
| expect(router.currentRoute.value.query).toEqual({ page: undefined, pagesize: undefined }) | |
| done() | |
| }) | |
| }) | |
| describe('changePageSize()', () => { | |
| it('check $route query when changePageSize() is called with args empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter27' }) | |
| await wrapper.vm.changePageSize() | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-27') | |
| expect(router.currentRoute.value.query).toEqual({ page: undefined, pagesize: undefined }) | |
| done() | |
| }) | |
| it('check $route query when changePageSize() is called with args not empty', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| await router.push({ name: 'testRouter27' }) | |
| await wrapper.vm.changePageSize(2, 10) | |
| await flushPromises() | |
| expect(router.currentRoute.value.path).toEqual('/test-router-27') | |
| expect(router.currentRoute.value.query).toEqual({ page: '2', pagesize: '10' }) | |
| done() | |
| }) | |
| }) | |
| describe('start()', () => { | |
| it('check loading, selectedRowKeys, fetchData() when start() is called', async (done) => { | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.fetchData = jest.fn((args) => {}) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| await wrapper.setData({ selectedRowKeys: [{ id: 'test-id' }] }) | |
| await wrapper.vm.start() | |
| await flushPromises() | |
| expect(fetchData).toHaveBeenCalledTimes(1) | |
| setTimeout(() => { | |
| expect(wrapper.vm.loading).toBeFalsy() | |
| expect(wrapper.vm.selectedRowKeys).toEqual([]) | |
| done() | |
| }, 1000) | |
| }) | |
| }) | |
| describe('toggleLoading()', () => { | |
| it('check loading when toggleLoading() is called', async (done) => { | |
| await wrapper.setData({ loading: false }) | |
| await wrapper.vm.toggleLoading() | |
| await flushPromises() | |
| expect(wrapper.vm.loading).toBeTruthy() | |
| done() | |
| }) | |
| }) | |
| describe('startLoading()', () => { | |
| it('check loading when startLoading() is called', async (done) => { | |
| await wrapper.setData({ loading: false }) | |
| await wrapper.vm.startLoading() | |
| await flushPromises() | |
| expect(wrapper.vm.loading).toBeTruthy() | |
| done() | |
| }) | |
| }) | |
| describe('finishLoading()', () => { | |
| it('check loading when finishLoading() is called', async (done) => { | |
| await wrapper.setData({ loading: true }) | |
| await wrapper.vm.finishLoading() | |
| await flushPromises() | |
| expect(wrapper.vm.loading).toBeFalsy() | |
| done() | |
| }) | |
| }) | |
| describe('handleConfirmBlur()', () => { | |
| it('check confirmDirty value when handleConfirmBlur() is called with args empty', async (done) => { | |
| await wrapper.setData({ confirmDirty: undefined }) | |
| await wrapper.vm.handleConfirmBlur() | |
| await flushPromises() | |
| expect(wrapper.vm.confirmDirty).toBeUndefined() | |
| done() | |
| }) | |
| it('check confirmDirty value when handleConfirmBlur() is called with args name not equal `confirmpassword`', async (done) => { | |
| const event = document.createEvent('Event') | |
| await wrapper.setData({ confirmDirty: undefined }) | |
| await wrapper.vm.handleConfirmBlur(event, 'test') | |
| await flushPromises() | |
| expect(wrapper.vm.confirmDirty).toBeUndefined() | |
| done() | |
| }) | |
| it('check confirmDirty value when handleConfirmBlur() is called with args name equal `confirmpassword`', async (done) => { | |
| await wrapper.setData({ confirmDirty: false }) | |
| await wrapper.vm.handleConfirmBlur({ target: { value: true } }, 'confirmpassword') | |
| await flushPromises() | |
| expect(wrapper.vm.confirmDirty).toBeTruthy() | |
| done() | |
| }) | |
| }) | |
| describe('validateTwoPassword()', () => { | |
| it('validate password result is empty when validateTwoPassword() calling with value empty', async (done) => { | |
| wrapper.vm.form = {} | |
| const result = await wrapper.vm.validateTwoPassword({}, null) | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| done() | |
| }) | |
| it('validate field `confirmpassword` not valid when validateTwoPassword() is called with `password` not empty', async (done) => { | |
| let result = null | |
| wrapper.vm.form = { password: 'abc123' } | |
| try { | |
| result = await wrapper.vm.validateTwoPassword({ field: 'confirmpassword' }, '123abc') | |
| await flushPromises() | |
| } catch (e) { | |
| result = e | |
| } | |
| expect(result).not.toBeUndefined() | |
| expect(result).toEqual('message validate password') | |
| done() | |
| }) | |
| it('validate field `confirmpassword` valid and result empty when validateTwoPassword() is called with `password` not empty', async (done) => { | |
| wrapper.vm.form = { password: 'abc123' } | |
| const result = await wrapper.vm.validateTwoPassword({ field: 'confirmpassword' }, 'abc123') | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| done() | |
| }) | |
| it('validate field `password` valid when validateTwoPassword() is called with `confirmpassword` is empty', async (done) => { | |
| wrapper.vm.form = { confirmpassword: '' } | |
| const result = await wrapper.vm.validateTwoPassword({ field: 'password' }, 'abc123') | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| done() | |
| }) | |
| it('validate field `password` valid when validateTwoPassword() is called with `confirmpassword` not empty', async (done) => { | |
| wrapper.vm.form = { confirmpassword: 'abc123' } | |
| const result = await wrapper.vm.validateTwoPassword({ field: 'password' }, 'abc123') | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| done() | |
| }) | |
| it('validate field `confirmpassword` a when validateTwoPassword() is called with confirmDirty equal true', async (done) => { | |
| wrapper.vm.form = { confirmpassword: '123abc' } | |
| originalFunc.RefValidateFields = wrapper.vm.formRef.value.validateFields | |
| wrapper.vm.formRef.value.validateFields = jest.fn((field) => {}) | |
| const formRefValidate = jest.spyOn(wrapper.vm.formRef.value, 'validateFields') | |
| await wrapper.setData({ confirmDirty: true }) | |
| const result = await wrapper.vm.validateTwoPassword({ field: 'password' }, 'abc123') | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| expect(formRefValidate).toHaveBeenCalledTimes(1) | |
| expect(formRefValidate).toHaveBeenLastCalledWith('confirmpassword') | |
| done() | |
| }) | |
| it('validate field `password` valid when validateTwoPassword() is called with confirmDirty equal false', async (done) => { | |
| wrapper.vm.form = { confirmpassword: 'abc123' } | |
| await wrapper.setData({ confirmDirty: false }) | |
| const result = await wrapper.vm.validateTwoPassword({ field: 'password' }, 'abc123') | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| done() | |
| }) | |
| it('validate result empty when validateTwoPassword() is called with rules.field not equals `password` or `confirmpassword`', async (done) => { | |
| wrapper.vm.form = {} | |
| const result = await wrapper.vm.validateTwoPassword({ field: 'name' }, 'abc123') | |
| await flushPromises() | |
| expect(result).toBeUndefined() | |
| done() | |
| }) | |
| }) | |
| describe('setRules()', () => { | |
| it('check rules when setRules() is called with args empty', async (done) => { | |
| await wrapper.vm.setRules() | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({}) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with args not empty', async (done) => { | |
| await wrapper.vm.setRules({ name: 'field', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ field: [{ required: true, message: 'required-input' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with args field.type equal `boolean`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'field', required: true, type: 'boolean' }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ field: [{ required: true, message: 'required-input' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with currentAction.mapping not empty', async (done) => { | |
| await wrapper.setData({ | |
| currentAction: { | |
| mapping: { | |
| field: { | |
| options: [] | |
| } | |
| } | |
| } | |
| }) | |
| await wrapper.vm.setRules({ name: 'field', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ field: [{ required: true, message: 'required-select' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `keypair`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'keypair', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ keypair: [{ required: true, message: 'required-select' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `account`', async (done) => { | |
| await wrapper.setData({ currentAction: { api: 'testApiNameCase1' } }) | |
| await wrapper.vm.setRules({ name: 'account', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ account: [{ required: true, message: 'required-select' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.type equal `uuid`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'field', required: true, type: 'uuid' }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ field: [{ required: true, message: 'required-select' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.type equal `list`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'field', required: true, type: 'list' }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ field: [{ type: 'array', required: true, message: 'required-select' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.type equal `long`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'field', required: true, type: 'long' }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ field: [{ type: 'number', required: true, message: 'required-number' }] }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `password`', async (done) => { | |
| originalFunc.validateTwoPassword = wrapper.vm.validateTwoPassword | |
| wrapper.vm.validateTwoPassword = jest.fn() | |
| await wrapper.vm.setRules({ name: 'password', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ | |
| password: [ | |
| { required: true, message: 'required-input' }, | |
| { validator: wrapper.vm.validateTwoPassword } | |
| ] | |
| }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `currentpassword`', async (done) => { | |
| originalFunc.validateTwoPassword = wrapper.vm.validateTwoPassword | |
| wrapper.vm.validateTwoPassword = jest.fn() | |
| await wrapper.vm.setRules({ name: 'currentpassword', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ | |
| currentpassword: [ | |
| { required: true, message: 'required-input' }, | |
| { validator: wrapper.vm.validateTwoPassword } | |
| ] | |
| }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `confirmpassword`', async (done) => { | |
| originalFunc.validateTwoPassword = wrapper.vm.validateTwoPassword | |
| wrapper.vm.validateTwoPassword = jest.fn() | |
| await wrapper.vm.setRules({ name: 'confirmpassword', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ | |
| confirmpassword: [ | |
| { required: true, message: 'required-input' }, | |
| { validator: wrapper.vm.validateTwoPassword } | |
| ] | |
| }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `certificate`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'certificate', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ | |
| certificate: [ | |
| { required: true, message: 'required-input' } | |
| ] | |
| }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `privatekey`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'privatekey', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ | |
| privatekey: [ | |
| { required: true, message: 'required-input' } | |
| ] | |
| }) | |
| done() | |
| }) | |
| it('check rules when setRules() is called with field.name equal `certchain`', async (done) => { | |
| await wrapper.vm.setRules({ name: 'certchain', required: true }) | |
| await flushPromises() | |
| expect(wrapper.vm.rules).toEqual({ | |
| certchain: [ | |
| { required: true, message: 'required-input' } | |
| ] | |
| }) | |
| done() | |
| }) | |
| }) | |
| describe('handleSubmit', () => { | |
| it('execSubmit() should be called when handleSubmit() is called in resource view', async (done) => { | |
| originalFunc.execSubmit = wrapper.vm.execSubmit | |
| wrapper.vm.execSubmit = jest.fn((event) => {}) | |
| const execSubmit = jest.spyOn(wrapper.vm, 'execSubmit') | |
| const event = document.createEvent('Event') | |
| await wrapper.setData({ dataView: true }) | |
| await wrapper.vm.handleSubmit(event) | |
| await flushPromises() | |
| expect(execSubmit).toHaveBeenCalledTimes(1) | |
| expect(execSubmit).toHaveBeenCalledWith(event) | |
| done() | |
| }) | |
| it('formRef makes validation calls when handleSubmit() is called in list view', async (done) => { | |
| originalFunc.callGroupApi = wrapper.vm.callGroupApi | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| originalFunc.formRef = wrapper.vm.formRef | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.callGroupApi = jest.fn((params, resourceName) => { | |
| return new Promise(resolve => { | |
| resolve() | |
| }) | |
| }) | |
| if (!wrapper.vm.formRef) { | |
| wrapper.vm.formRef = ref() | |
| } | |
| wrapper.vm.formRef.value.validate = jest.fn((params, resourceName) => { | |
| return new Promise(resolve => { | |
| resolve() | |
| }) | |
| }) | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| const callGroupApi = jest.spyOn(wrapper.vm, 'callGroupApi') | |
| const event = document.createEvent('Event') | |
| await wrapper.setData({ | |
| dataView: false, | |
| currentAction: { | |
| label: 'label.name', | |
| groupAction: true, | |
| groupMap: (selection) => { | |
| return selection.map(x => { return { id: x } }) | |
| } | |
| }, | |
| selectedRowKeys: ['test-id-value-1'], | |
| items: [{ | |
| id: 'test-id-value-1', | |
| name: 'test-name-value-1' | |
| }], | |
| columns: [{ | |
| key: 'column1', | |
| dataIndex: 'column1', | |
| title: 'column1' | |
| }] | |
| }) | |
| await wrapper.vm.handleSubmit(event) | |
| await flushPromises() | |
| expect(wrapper.vm.promises).toHaveLength(1) | |
| expect(callGroupApi).toHaveBeenCalledTimes(1) | |
| expect(callGroupApi).toHaveBeenCalledWith({ id: 'test-id-value-1' }, 'test-name-value-1') | |
| expect(fetchData).toHaveBeenCalledTimes(1) | |
| expect(mocks.$message.info).toHaveBeenCalledTimes(1) | |
| expect(mocks.$message.info).toHaveBeenCalledWith({ | |
| content: 'name-en', | |
| key: 'label.name', | |
| duration: 3 | |
| }) | |
| done() | |
| }) | |
| }) | |
| describe('execSubmit()', () => { | |
| it('API should be called with params has item id equal resource.id', async (done) => { | |
| mockAxios.mockResolvedValue({}) | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| const event = document.createEvent('Event') | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| icon: 'plus-outlined', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-resource-id' | |
| } | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| id: 'test-resource-id' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key not exist in currentAction.params', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-resource-id' | |
| } | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| id: 'test-resource-id' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key exist in currentAction.params, type is boolean and value is undefined', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: undefined } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'boolean' }], | |
| paramFields: [{ name: 'column1', type: 'boolean' }] | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: false | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key exist in currentAction.params, type is boolean and value is null', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: null } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'boolean' }], | |
| paramFields: [{ name: 'column1', type: 'boolean' }] | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: false | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key exist in currentAction.params, type is boolean and value is empty', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: '' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'boolean' }], | |
| paramFields: [{ name: 'column1', type: 'boolean' }] | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: false | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has not input tag', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: '' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'string' }], | |
| paramFields: [{ name: 'column1', type: 'string' }] | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key exist in currentAction.mapping', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: 1 } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'list' }], | |
| paramFields: [{ name: 'column1', type: 'list' }], | |
| mapping: { | |
| column1: { | |
| options: ['column-value1', 'column-value2'] | |
| } | |
| } | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: 'column-value2' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key not exist in currentAction.mapping, type is list and currentAction.params[input] has id', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: [1, 2] } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [ | |
| { | |
| name: 'column1', | |
| type: 'list', | |
| opts: [ | |
| { id: 'test-id-1', value: 'test-value-1' }, | |
| { id: 'test-id-2', value: 'test-value-2' }, | |
| { id: 'test-id-3', value: 'test-value-3' } | |
| ] | |
| } | |
| ], | |
| paramFields: [ | |
| { | |
| name: 'column1', | |
| type: 'list', | |
| opts: [ | |
| { id: 'test-id-1', value: 'test-value-1' }, | |
| { id: 'test-id-2', value: 'test-value-2' }, | |
| { id: 'test-id-3', value: 'test-value-3' } | |
| ] | |
| } | |
| ], | |
| mapping: {} | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: 'test-id-2,test-id-3' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key has name = account, currentAction.api = createAccount', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { account: 'test-account-value' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'createAccount', | |
| label: 'label.name', | |
| params: [{ name: 'account', type: 'string' }], | |
| paramFields: [{ name: 'account', type: 'string' }], | |
| mapping: {} | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'createAccount', | |
| response: 'json', | |
| account: 'test-account-value' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key has name = keypair, currentAction.api = addAccountToProject', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { keypair: 'test-keypair-value' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'addAccountToProject', | |
| label: 'label.name', | |
| params: [{ name: 'keypair', type: 'string' }], | |
| paramFields: [{ name: 'keypair', type: 'string' }], | |
| mapping: {} | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'addAccountToProject', | |
| response: 'json', | |
| keypair: 'test-keypair-value' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key name = (account | keypair), currentAction.api != (addAccountToProject | createAccount)', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { keypair: 1 } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [ | |
| { | |
| name: 'keypair', | |
| type: 'string', | |
| opts: [ | |
| { id: 'test-id-1', name: 'test-name-1' }, | |
| { id: 'test-id-2', name: 'test-name-2' } | |
| ] | |
| } | |
| ], | |
| paramFields: [ | |
| { | |
| name: 'keypair', | |
| type: 'string', | |
| opts: [ | |
| { id: 'test-id-1', name: 'test-name-1' }, | |
| { id: 'test-id-2', name: 'test-name-2' } | |
| ] | |
| } | |
| ], | |
| mapping: {} | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| keypair: 'test-name-2' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when form has input key do not fall under special condition.', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: 'test-column-value' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'string' }], | |
| paramFields: [{ name: 'column1', type: 'string' }], | |
| mapping: {} | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: 'test-column-value' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when currentAction has defaultArgs', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: 'test-column1-value' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'string' }], | |
| paramFields: [{ name: 'column1', type: 'string' }], | |
| mapping: {}, | |
| defaultArgs: { | |
| column2: 'test-column2-value' | |
| } | |
| }, | |
| resource: {} | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: 'test-column1-value', | |
| column2: 'test-column2-value' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called when currentAction.mapping has value and value is function', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.form = { column1: 'test-column1-value' } | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'column1', type: 'string' }], | |
| paramFields: [{ name: 'column1', type: 'string' }], | |
| mapping: { | |
| column2: { | |
| value: (record, params) => { | |
| return record.name | |
| } | |
| } | |
| } | |
| }, | |
| resource: { | |
| id: 'test-id-value', | |
| name: 'test-name-value' | |
| } | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: common.createDataParams({ | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| column1: 'test-column1-value', | |
| column2: 'test-name-value' | |
| }) | |
| }) | |
| done() | |
| }) | |
| it('API should be called with post method', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| originalFunc.closeAction = wrapper.vm.closeAction | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.fetchData = jest.fn() | |
| wrapper.vm.closeAction = jest.fn() | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| command: 'testApiNameCase1', | |
| response: 'json', | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }], | |
| post: true | |
| }, | |
| resource: { | |
| id: 'test-id-value' | |
| } | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| const postData = new URLSearchParams() | |
| postData.append('command', 'testApiNameCase1') | |
| postData.append('response', 'json') | |
| postData.append('id', 'test-id-value') | |
| expect(mockAxios).toHaveBeenCalled() | |
| expect(mockAxios).toHaveBeenLastCalledWith({ | |
| url: '/', | |
| method: 'POST', | |
| data: postData | |
| }) | |
| done() | |
| }) | |
| it('handleResponse() & closeAction() should be called when API response success', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.closeAction = wrapper.vm.closeAction | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, params, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.closeAction = jest.fn() | |
| wrapper.vm.fetchData = jest.fn() | |
| const handleResponse = jest.spyOn(wrapper.vm, 'handleResponse') | |
| const closeAction = jest.spyOn(wrapper.vm, 'closeAction') | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-id-value' | |
| } | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(handleResponse).toHaveBeenCalledTimes(1) | |
| expect(handleResponse).toHaveBeenLastCalledWith( | |
| {}, | |
| 'test-id-value', | |
| 'test-id-value', | |
| { | |
| api: 'testApiNameCase1', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| } | |
| ) | |
| expect(closeAction).toHaveBeenCalledTimes(1) | |
| done() | |
| }) | |
| it('$router should go back when API response success with shouldNavigateBack() return true', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.closeAction = wrapper.vm.closeAction | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| originalFunc.routerGo = wrapper.vm.$router.go | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return true }) | |
| wrapper.vm.$router.go = jest.fn((number) => {}) | |
| wrapper.vm.closeAction = jest.fn() | |
| wrapper.vm.fetchData = jest.fn() | |
| const routerGo = jest.spyOn(wrapper.vm.$router, 'go') | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| icon: 'delete-outlined', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-id-value' | |
| }, | |
| dataView: true | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(routerGo).toHaveBeenCalledTimes(1) | |
| expect(routerGo).toHaveBeenLastCalledWith(-1) | |
| done() | |
| }) | |
| it('$router should go back when API response success with action.api equal `archiveEvents`', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.closeAction = wrapper.vm.closeAction | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| originalFunc.routerGo = wrapper.vm.$router.go | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return true }) | |
| wrapper.vm.$router.go = jest.fn((number) => {}) | |
| wrapper.vm.closeAction = jest.fn() | |
| wrapper.vm.fetchData = jest.fn() | |
| const routerGo = jest.spyOn(wrapper.vm.$router, 'go') | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'archiveEvents', | |
| icon: 'plus-outlined', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-id-value' | |
| }, | |
| dataView: true | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(routerGo).toHaveBeenCalledTimes(1) | |
| expect(routerGo).toHaveBeenLastCalledWith(-1) | |
| done() | |
| }) | |
| it('fetchData() should be called when API response success with jobId empty', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.closeAction = wrapper.vm.closeAction | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve() }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.closeAction = jest.fn() | |
| wrapper.vm.fetchData = jest.fn() | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| icon: 'plus-outlined', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-id-value' | |
| }, | |
| dataView: true | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(fetchData).toHaveBeenCalled() | |
| done() | |
| }) | |
| it('fetchData() not called when API response success with jobId not empty', async (done) => { | |
| originalFunc.handleResponse = wrapper.vm.handleResponse | |
| originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack | |
| originalFunc.closeAction = wrapper.vm.closeAction | |
| originalFunc.fetchData = wrapper.vm.fetchData | |
| wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) => { return Promise.resolve('test-job-id') }) | |
| wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false }) | |
| wrapper.vm.closeAction = jest.fn() | |
| wrapper.vm.fetchData = jest.fn() | |
| const fetchData = jest.spyOn(wrapper.vm, 'fetchData') | |
| const event = document.createEvent('Event') | |
| await mockAxios.mockResolvedValue({}) | |
| await wrapper.setData({ | |
| showAction: true, | |
| currentAction: { | |
| api: 'testApiNameCase1', | |
| icon: 'plus-outlined', | |
| label: 'label.name', | |
| params: [{ name: 'id', type: 'uuid' }], | |
| paramFields: [{ name: 'id', type: 'uuid' }] | |
| }, | |
| resource: { | |
| id: 'test-id-value' | |
| }, | |
| dataView: true | |
| }) | |
| await wrapper.vm.execSubmit(event) | |
| await flushPromises() | |
| expect(fetchData).not.toHaveBeenCalled() | |
| done() | |
| }) | |
| }) | |
| }) | |
| }) |