blessing-skin-server/resources/assets/tests/views/admin/Plugins.test.ts

188 lines
5.2 KiB
TypeScript
Raw Normal View History

2019-03-15 11:42:41 +08:00
import Vue from 'vue'
import { mount } from '@vue/test-utils'
import { flushPromises } from '../../utils'
import { showModal, toast } from '@/scripts/notify'
import Plugins from '@/views/admin/Plugins.vue'
2018-08-19 17:39:33 +08:00
2019-03-28 16:37:01 +08:00
jest.mock('@/scripts/notify')
2018-08-19 17:39:33 +08:00
test('render dependencies', async () => {
2019-03-15 11:42:41 +08:00
Vue.prototype.$http.get.mockResolvedValue([
2019-08-13 18:42:17 +08:00
{ name: 'a', dependencies: { all: {}, unsatisfied: {} } },
2019-03-15 11:42:41 +08:00
{
name: 'b',
dependencies: {
2019-08-13 18:42:17 +08:00
all: { a: '^1.0.0', c: '^2.0.0' }, unsatisfied: { c: '' },
2019-03-15 11:42:41 +08:00
},
},
])
const wrapper = mount(Plugins)
await flushPromises()
expect(wrapper.text()).toContain('admin.noDependencies')
2019-11-24 14:32:58 +08:00
expect(wrapper.find('span.badge.bg-green').text()).toBe('a: ^1.0.0')
expect(wrapper.find('span.badge.bg-red').text()).toBe('c: ^2.0.0')
2019-03-15 11:42:41 +08:00
})
2019-03-17 10:21:18 +08:00
2018-08-19 17:39:33 +08:00
test('render operation buttons', async () => {
2019-03-15 11:42:41 +08:00
Vue.prototype.$http.get.mockResolvedValue([
{
2019-08-13 18:42:17 +08:00
name: 'a', dependencies: { all: {}, unsatisfied: {} }, enabled: true, config: true,
2019-03-15 11:42:41 +08:00
},
{
2019-08-13 18:42:17 +08:00
name: 'b', dependencies: { all: {}, unsatisfied: {} }, enabled: true, config: false,
2019-03-15 11:42:41 +08:00
},
{
2019-08-13 18:42:17 +08:00
name: 'c', dependencies: { all: {}, unsatisfied: {} }, enabled: false,
2019-03-15 11:42:41 +08:00
},
])
const wrapper = mount(Plugins)
await flushPromises()
const tbody = wrapper.find('tbody')
expect(tbody.find('tr:nth-child(1)').text()).toContain('admin.disablePlugin')
expect(tbody.find('tr:nth-child(1)').text()).toContain('admin.configurePlugin')
expect(tbody.find('tr:nth-child(2)').text()).not.toContain('admin.configurePlugin')
expect(tbody.find('tr:nth-child(3)').text()).toContain('admin.enablePlugin')
expect(tbody.find('tr:nth-child(3)').text()).toContain('admin.deletePlugin')
})
2019-03-17 10:21:18 +08:00
2018-08-19 17:39:33 +08:00
test('enable plugin', async () => {
2019-03-15 11:42:41 +08:00
Vue.prototype.$http.get.mockResolvedValue([
{
2019-08-13 18:42:17 +08:00
name: 'a', dependencies: { all: {}, unsatisfied: {} }, enabled: false,
2019-03-15 11:42:41 +08:00
},
{
2019-08-15 11:57:55 +08:00
name: 'b', dependencies: { all: { c: '' }, unsatisfied: {} }, enabled: false,
2019-03-15 11:42:41 +08:00
},
])
Vue.prototype.$http.post
.mockResolvedValueOnce({
2019-08-25 15:54:29 +08:00
code: 1, message: '1', data: { reason: ['abc'] },
2019-03-15 11:42:41 +08:00
})
2019-04-23 11:47:45 +08:00
.mockResolvedValue({ code: 0, message: '0' })
showModal
.mockRejectedValueOnce(null)
.mockResolvedValue({ value: '' })
2019-03-15 11:42:41 +08:00
const wrapper = mount(Plugins)
await flushPromises()
wrapper
.findAll('.actions')
.at(0)
2019-03-15 11:42:41 +08:00
.find('a')
.trigger('click')
await flushPromises()
expect(showModal).toBeCalledWith({
text: 'admin.noDependenciesNotice',
okButtonType: 'warning',
2019-03-15 11:42:41 +08:00
})
expect(Vue.prototype.$http.post).not.toBeCalled()
wrapper
.findAll('.actions')
.at(0)
2019-03-15 11:42:41 +08:00
.find('a')
.trigger('click')
await flushPromises()
expect(Vue.prototype.$http.post).toBeCalledWith(
'/admin/plugins/manage',
2019-11-25 23:30:51 +08:00
{ action: 'enable', name: 'a' },
2019-03-15 11:42:41 +08:00
)
expect(showModal).toBeCalledWith({
mode: 'alert',
dangerousHTML: expect.stringContaining('<li>abc</li>'),
})
2019-03-15 11:42:41 +08:00
wrapper
.findAll('.actions')
.at(1)
2019-03-15 11:42:41 +08:00
.find('a')
.trigger('click')
await flushPromises()
expect(wrapper.text()).toContain('admin.disablePlugin')
})
2019-03-17 10:21:18 +08:00
2018-08-19 17:39:33 +08:00
test('disable plugin', async () => {
2019-03-15 11:42:41 +08:00
Vue.prototype.$http.get.mockResolvedValue([
{
2019-08-13 18:42:17 +08:00
name: 'a', dependencies: { all: {}, unsatisfied: {} }, enabled: true, config: false,
2019-03-15 11:42:41 +08:00
},
])
Vue.prototype.$http.post
2019-04-23 11:47:45 +08:00
.mockResolvedValueOnce({ code: 1, message: '1' })
.mockResolvedValue({ code: 0, message: '0' })
2019-03-15 11:42:41 +08:00
const wrapper = mount(Plugins)
await flushPromises()
const button = wrapper.find('.actions').find('a')
button.trigger('click')
await flushPromises()
expect(Vue.prototype.$http.post).toBeCalledWith(
'/admin/plugins/manage',
2019-11-25 23:30:51 +08:00
{ action: 'disable', name: 'a' },
2019-03-15 11:42:41 +08:00
)
button.trigger('click')
await flushPromises()
expect(toast.success).toBeCalledWith('0')
2019-03-15 11:42:41 +08:00
expect(wrapper.text()).toContain('admin.enablePlugin')
})
2019-03-17 10:21:18 +08:00
2018-08-19 17:39:33 +08:00
test('delete plugin', async () => {
2019-03-15 11:42:41 +08:00
Vue.prototype.$http.get.mockResolvedValue([
{
name: 'a',
title: 'My Plugin',
dependencies: { all: {}, unsatisfied: {} },
enabled: false,
2019-03-15 11:42:41 +08:00
},
])
Vue.prototype.$http.post
2019-04-23 11:47:45 +08:00
.mockResolvedValueOnce({ code: 1, message: '1' })
.mockResolvedValue({ code: 0, message: '0' })
showModal
.mockRejectedValueOnce(null)
.mockResolvedValue({ value: '' })
2019-03-15 11:42:41 +08:00
const wrapper = mount(Plugins)
await flushPromises()
const button = wrapper.find('.actions').findAll('a')
.at(1)
button.trigger('click')
await flushPromises()
expect(showModal).toBeCalledWith({
title: 'My Plugin',
text: 'admin.confirmDeletion',
okButtonType: 'danger',
2019-03-15 11:42:41 +08:00
})
expect(Vue.prototype.$http.post).not.toBeCalled()
button.trigger('click')
await flushPromises()
expect(Vue.prototype.$http.post).toBeCalledWith(
'/admin/plugins/manage',
2019-11-25 23:30:51 +08:00
{ action: 'delete', name: 'a' },
2019-03-15 11:42:41 +08:00
)
expect(toast.error).toBeCalledWith('1')
2019-03-15 11:42:41 +08:00
button.trigger('click')
await flushPromises()
expect(wrapper.text()).toContain('No data')
})
2019-12-08 23:58:44 +08:00
test('readme link', async () => {
Vue.prototype.$http.get.mockResolvedValue([
{
name: 'a',
readme: true,
dependencies: { all: {}, unsatisfied: {} },
},
])
const wrapper = mount(Plugins)
await flushPromises()
const link = wrapper.find('.actions > a:nth-child(1)')
expect(link.text()).toContain('admin.pluginReadme')
expect(link.attributes('href')).toBe('/admin/plugins/readme/a')
})