import React from 'react'; import { mount } from 'enzyme'; import Upload from '..'; import Form from '../../form'; import { errorRequest, successRequest } from './requests'; const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout)); const fileList = [{ uid: -1, name: 'xxx.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', thumbUrl: 'https://zos.alipayobjects.com/rmsportal/IQKRngzUuFzJzGzRJXUs.png', }, { uid: -2, name: 'yyy.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/IQKRngzUuFzJzGzRJXUs.png', thumbUrl: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', }]; describe('Upload List', () => { // https://github.com/ant-design/ant-design/issues/4653 it('should use file.thumbUrl for in priority', () => { const wrapper = mount( ); fileList.forEach((file, i) => { const linkNode = wrapper.find('.ant-upload-list-item-thumbnail').at(i); const imgNode = wrapper.find('.ant-upload-list-item-thumbnail img').at(i); expect(linkNode.prop('href')).toBe(file.url); expect(imgNode.prop('src')).toBe(file.thumbUrl); }); }); // https://github.com/ant-design/ant-design/issues/7269 it('should remove correct item when uid is 0', async () => { const list = [{ uid: 0, name: 'xxx.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', thumbUrl: 'https://zos.alipayobjects.com/rmsportal/IQKRngzUuFzJzGzRJXUs.png', }, { uid: 1, name: 'xxx.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', thumbUrl: 'https://zos.alipayobjects.com/rmsportal/IQKRngzUuFzJzGzRJXUs.png', }]; const wrapper = mount( ); expect(wrapper.find('.ant-upload-list-item').length).toBe(2); wrapper.find('.ant-upload-list-item').at(0).find('.anticon-cross').simulate('click'); await delay(400); wrapper.update(); expect(wrapper.find('.ant-upload-list-item').hostNodes().length).toBe(1); }); it('should be uploading when upload a file', (done) => { let wrapper; const onChange = ({ file }) => { if (file.status === 'uploading') { expect(wrapper.render()).toMatchSnapshot(); } if (file.status === 'done') { expect(wrapper.render()).toMatchSnapshot(); done(); } }; wrapper = mount( ); wrapper.find('input').simulate('change', { target: { files: [ { filename: 'foo.png' }, ], }, }); }); it('handle error', (done) => { let wrapper; const onChange = ({ file }) => { if (file.status !== 'uploading') { expect(wrapper.render()).toMatchSnapshot(); done(); } }; wrapper = mount( ); wrapper.find('input').simulate('change', { target: { files: [ { filename: 'foo.png' }, ], }, }); }); it('does concat filelist when beforeUpload returns false', () => { const handleChange = jest.fn(); const wrapper = mount( false} > ); wrapper.find('input').simulate('change', { target: { files: [ { filename: 'foo.png' }, ], }, }); expect(wrapper.state().fileList.length).toBe(fileList.length + 1); expect(handleChange.mock.calls[0][0].fileList).toHaveLength(3); }); // https://github.com/ant-design/ant-design/issues/7762 it('work with form validation', () => { let errors; class TestForm extends React.Component { handleSubmit = () => { const { validateFields } = this.props.form; validateFields((err) => { errors = err; }); } render() { const { getFieldDecorator } = this.props.form; return (
{getFieldDecorator('file', { valuePropname: 'fileList', getValueFromEvent: e => e.fileList, rules: [ { required: true, validator: (rule, value, callback) => { if (!value || value.length === 0) { callback('file required'); } else { callback(); } }, }, ], })( false} > )}
); } } const App = Form.create()(TestForm); const wrapper = mount(); wrapper.find(Form).simulate('submit'); expect(errors.file.errors).toEqual([{ message: 'file required', field: 'file' }]); wrapper.find('input').simulate('change', { target: { files: [ { filename: 'foo.png' }, ], }, }); wrapper.find(Form).simulate('submit'); expect(errors).toBeNull(); }); it('should support onPreview', () => { const handlePreview = jest.fn(); const wrapper = mount( ); wrapper.find('.anticon-eye-o').at(0).simulate('click'); expect(handlePreview).toBeCalledWith(fileList[0]); wrapper.find('.anticon-eye-o').at(1).simulate('click'); expect(handlePreview).toBeCalledWith(fileList[1]); }); it('should support onRemove', async () => { const handleRemove = jest.fn(); const handleChange = jest.fn(); const wrapper = mount( ); wrapper.find('.anticon-delete').at(0).simulate('click'); expect(handleRemove).toBeCalledWith(fileList[0]); wrapper.find('.anticon-delete').at(1).simulate('click'); expect(handleRemove).toBeCalledWith(fileList[1]); await delay(0); expect(handleChange.mock.calls.length).toBe(2); }); it('should generate thumbUrl from file', async () => { const handlePreview = jest.fn(); const newFileList = [...fileList]; const newFile = { ...fileList[0], uid: -3, originFileObj: new File([], 'xxx.png') }; delete newFile.thumbUrl; newFileList.push(newFile); const wrapper = mount( ); wrapper.setState({}); await delay(200); expect(wrapper.state().fileList[2].thumbUrl).not.toBeFalsy(); }); it('should non-image format file preview', () => { const list = [ { ...fileList[0], uid: -3, url: 'https://cdn.xxx.com/aaa.zip', thumbUrl: 'data:application/zip;base64,UEsDBAoAAAAAADYZYkwAAAAAAAAAAAAAAAAdAAk', originFileObj: new File([], 'aaa.zip'), }, ]; const wrapper = mount( ); expect(wrapper.render()).toMatchSnapshot(); }); });