import { nextTick, ref } from 'vue'
import { flushPromises, mount } from '@vue/test-utils'
import { afterEach, describe, expect, test, vi } from 'vitest'
import { EVENT_CODE } from '@element-plus/constants'
import Upload from '../src/upload.vue'
import UploadContent from '../src/upload-content.vue'
const AXIOM = 'Rem is the best girl'
const mockGetFile = (element: HTMLInputElement, files: File[]) =>
vi.spyOn(element, 'files', 'get').mockImplementation((): any => files)
describe('', () => {
afterEach(() => {
vi.restoreAllMocks()
})
describe('render test', () => {
test('basic rendering', async () => {
const drag = ref(false)
const wrapper = mount(() => {AXIOM})
expect(wrapper.text()).toEqual(AXIOM)
drag.value = true
await nextTick()
expect(wrapper.find('.el-upload-dragger').exists()).toBe(true)
})
})
describe('functionality', () => {
test('works with keydown & click', async () => {
const wrapper = mount(() => )
const onClick = vi.fn()
wrapper.find('input').element.addEventListener('click', onClick)
await wrapper.trigger('click')
expect(onClick).toHaveBeenCalled()
await wrapper.trigger('keydown', {
key: EVENT_CODE.enter,
})
expect(onClick).toHaveBeenCalledTimes(2)
await wrapper.trigger('keydown', {
key: EVENT_CODE.space,
})
expect(onClick).toHaveBeenCalledTimes(3)
})
test('works when upload file exceeds the limit', async () => {
const onExceed = vi.fn()
const wrapper = mount(() => (
))
const fileList = [
new File(['content'], 'test-file.txt'),
new File(['content'], 'test-file.txt'),
]
mockGetFile(wrapper.find('input').element, fileList)
await wrapper.find('input').trigger('change')
expect(onExceed).toHaveBeenCalled()
})
test('onStart works', async () => {
const onStart = vi.fn()
const wrapper = mount(() => (
))
const fileList = [new File(['content'], 'test-file.txt')]
mockGetFile(wrapper.find('input').element, fileList)
await wrapper.find('input').trigger('change')
expect(onStart).toHaveBeenCalled()
})
test('beforeUpload works for rejecting upload', async () => {
const beforeUpload = vi.fn(() => Promise.reject())
const onRemove = vi.fn()
const wrapper = mount(() => (
))
const fileList = [new File(['content'], 'test-file.txt')]
mockGetFile(wrapper.find('input').element, fileList)
await wrapper.find('input').trigger('change')
expect(beforeUpload).toHaveBeenCalled()
await nextTick()
expect(onRemove).toHaveBeenCalled()
})
test('beforeUpload works for resolving upload', async () => {
const beforeUpload = vi.fn(() => Promise.resolve())
const httpRequest = ref(vi.fn(() => Promise.resolve()))
const onSuccess = vi.fn()
const onError = vi.fn()
const wrapper = mount(() => (
))
const fileList = [new File(['content'], 'test-file.txt')]
mockGetFile(wrapper.find('input').element, fileList)
await wrapper.find('input').trigger('change')
expect(beforeUpload).toHaveBeenCalled()
await flushPromises()
expect(onSuccess).toHaveBeenCalled()
expect(onError).not.toHaveBeenCalled()
vi.clearAllMocks()
httpRequest.value = vi.fn(() => Promise.reject())
await nextTick()
await wrapper.find('input').trigger('change')
expect(beforeUpload).toHaveBeenCalled()
await flushPromises()
expect(onSuccess).not.toHaveBeenCalled()
expect(onError).toHaveBeenCalled()
})
test('onProgress should work', async () => {
const onProgress = vi.fn()
const httpRequest = vi.fn(({ onProgress }) => {
onProgress()
return Promise.resolve()
})
const wrapper = mount(
)
const fileList = [new File(['content'], 'test-file.txt')]
mockGetFile(wrapper.find('input').element, fileList)
await wrapper.find('input').trigger('change')
await nextTick()
expect(onProgress).toHaveBeenCalled()
})
})
})