cloudstack/ui/tests/unit/views/AutogenView.spec.js
Daan Hoogland 7ee697fcc5 Merge release branch 4.18 to main
* 4.18:
  UI: allow new keys for VM details (#7793)
  Refactoring StorPool's smoke tests (#7392)
  UI: decode userdata in EditVM dialog (#7796)
  packaging: unalias cp before package upgrade (#7722)
  make NoopDbUpgrade do a systemvm template check (#7564)
  UI unit test: fix expected values (#7792)
2023-08-03 15:59:01 +02:00

3185 lines
106 KiB
JavaScript

// 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 = {
$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',
data: new URLSearchParams(),
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: new URLSearchParams(),
method: 'GET',
params: {
command: 'testApiNameCase2',
listall: true,
key: 'test-value',
page: 1,
pagesize: 20,
response: 'json'
},
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: new URLSearchParams(),
method: 'GET',
params: {
command: 'testApiNameCase3',
listall: true,
key: 'test-value',
page: 1,
pagesize: 20,
response: 'json'
},
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: 'test-id-1',
name: 'test-name-1'
}]
}
})
await router.push({ name: 'testRouter13', 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',
hostname: 'test-id',
page: 1,
pagesize: 20,
response: 'json'
}
})
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
}])
expect(wrapper.vm.resource).toEqual({
id: 'test-id',
name: 'test-name-value',
key: 0
})
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: [{
name: 'test-name-value',
hostname: 'test-hostname-value'
}]
}
})
await router.push({ name: 'testRouter17' })
await flushPromises()
expect(wrapper.vm.items).toEqual([{
id: 'test-hostname-value',
name: 'test-name-value',
hostname: 'test-hostname-value',
key: 0
}])
expect(wrapper.vm.resource).toEqual({
id: 'test-hostname-value',
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
listall: true,
showicon: true,
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'listTestApiNames',
listall: true,
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
listall: true,
name: 'test-name-value',
showicon: true,
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'listTemplates',
listall: true,
templatefilter: 'executable',
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'listIsos',
listall: true,
isofilter: 'executable',
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'listHosts',
listall: true,
type: 'routing',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
listall: true,
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'queryAsyncJobResult',
jobId: 'test-job-id',
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'queryAsyncJobResult',
jobId: 'test-job-id',
response: 'json'
}
})
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',
data: new URLSearchParams(),
params: {
command: 'queryAsyncJobResult',
jobId: 'test-job-id',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
id: 'test-resource-id',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
id: 'test-resource-id',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: false,
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: false,
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: false,
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: 'column-value2',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: 'test-id-2,test-id-3',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'createAccount',
account: 'test-account-value',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'addAccountToProject',
keypair: 'test-keypair-value',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
keypair: 'test-name-2',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: 'test-column-value',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: 'test-column1-value',
column2: 'test-column2-value',
response: 'json'
}
})
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: 'GET',
data: new URLSearchParams(),
params: {
command: 'testApiNameCase1',
column1: 'test-column1-value',
column2: 'test-name-value',
response: 'json'
}
})
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: {
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('id', 'test-id-value')
expect(mockAxios).toHaveBeenCalled()
expect(mockAxios).toHaveBeenLastCalledWith({
url: '/',
method: 'POST',
data: postData,
params: {
command: 'testApiNameCase1',
response: 'json'
}
})
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()
})
})
})
})