// 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()
      })
    })
  })
})
