2017-01-24 14:59:39 +08:00
|
|
|
import React from 'react';
|
|
|
|
import { mount } from 'enzyme';
|
|
|
|
import Upload from '..';
|
2017-11-29 20:28:19 +08:00
|
|
|
import Form from '../../form';
|
2017-10-15 17:30:50 +08:00
|
|
|
import { errorRequest, successRequest } from './requests';
|
2018-05-31 22:37:09 +08:00
|
|
|
import { setup, teardown } from './mock';
|
2017-01-24 14:59:39 +08:00
|
|
|
|
2017-08-20 15:39:02 +08:00
|
|
|
const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));
|
|
|
|
|
2017-01-24 14:59:39 +08:00
|
|
|
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', () => {
|
2018-05-31 22:37:09 +08:00
|
|
|
beforeEach(() => setup());
|
|
|
|
afterEach(() => teardown());
|
|
|
|
|
2017-01-24 14:59:39 +08:00
|
|
|
// https://github.com/ant-design/ant-design/issues/4653
|
|
|
|
it('should use file.thumbUrl for <img /> in priority', () => {
|
|
|
|
const wrapper = mount(
|
|
|
|
<Upload defaultFileList={fileList} listType="picture">
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
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);
|
|
|
|
});
|
|
|
|
});
|
2017-08-20 15:39:02 +08:00
|
|
|
|
|
|
|
// 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(
|
|
|
|
<Upload defaultFileList={list}>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
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);
|
2017-09-20 16:26:18 +08:00
|
|
|
wrapper.update();
|
|
|
|
expect(wrapper.find('.ant-upload-list-item').hostNodes().length).toBe(1);
|
2017-08-20 15:39:02 +08:00
|
|
|
});
|
2017-10-10 15:59:13 +08:00
|
|
|
|
2017-10-12 14:09:17 +08:00
|
|
|
it('should be uploading when upload a file', (done) => {
|
|
|
|
let wrapper;
|
|
|
|
const onChange = ({ file }) => {
|
|
|
|
if (file.status === 'uploading') {
|
|
|
|
expect(wrapper.render()).toMatchSnapshot();
|
|
|
|
}
|
2017-10-15 17:30:50 +08:00
|
|
|
if (file.status === 'done') {
|
|
|
|
expect(wrapper.render()).toMatchSnapshot();
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
wrapper = mount(
|
|
|
|
<Upload
|
|
|
|
action="http://jsonplaceholder.typicode.com/posts/"
|
|
|
|
onChange={onChange}
|
|
|
|
customRequest={successRequest}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
wrapper.find('input').simulate('change', {
|
|
|
|
target: {
|
|
|
|
files: [
|
2018-04-19 11:54:28 +08:00
|
|
|
{ name: 'foo.png' },
|
2017-10-15 17:30:50 +08:00
|
|
|
],
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('handle error', (done) => {
|
|
|
|
let wrapper;
|
|
|
|
const onChange = ({ file }) => {
|
|
|
|
if (file.status !== 'uploading') {
|
2017-10-12 14:09:17 +08:00
|
|
|
expect(wrapper.render()).toMatchSnapshot();
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
wrapper = mount(
|
2017-10-15 17:30:50 +08:00
|
|
|
<Upload
|
|
|
|
action="http://jsonplaceholder.typicode.com/posts/"
|
|
|
|
onChange={onChange}
|
|
|
|
customRequest={errorRequest}
|
|
|
|
>
|
2017-10-10 15:59:13 +08:00
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
wrapper.find('input').simulate('change', {
|
|
|
|
target: {
|
|
|
|
files: [
|
2018-04-19 11:54:28 +08:00
|
|
|
{ name: 'foo.png' },
|
2017-10-10 15:59:13 +08:00
|
|
|
],
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
2017-11-29 20:28:19 +08:00
|
|
|
|
2018-02-11 16:11:13 +08:00
|
|
|
it('does concat filelist when beforeUpload returns false', () => {
|
2017-11-29 20:28:19 +08:00
|
|
|
const handleChange = jest.fn();
|
|
|
|
const wrapper = mount(
|
|
|
|
<Upload
|
|
|
|
listType="picture"
|
|
|
|
defaultFileList={fileList}
|
|
|
|
onChange={handleChange}
|
|
|
|
beforeUpload={() => false}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
|
|
|
|
wrapper.find('input').simulate('change', {
|
|
|
|
target: {
|
|
|
|
files: [
|
2018-04-19 11:54:28 +08:00
|
|
|
{ name: 'foo.png' },
|
2017-11-29 20:28:19 +08:00
|
|
|
],
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2018-02-11 16:11:13 +08:00
|
|
|
expect(wrapper.state().fileList.length).toBe(fileList.length + 1);
|
|
|
|
expect(handleChange.mock.calls[0][0].fileList).toHaveLength(3);
|
2017-11-29 20:28:19 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
// 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 (
|
|
|
|
<Form onSubmit={this.handleSubmit}>
|
|
|
|
<Form.Item>
|
|
|
|
{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();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
})(
|
|
|
|
<Upload
|
|
|
|
beforeUpload={() => false}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
)}
|
|
|
|
</Form.Item>
|
|
|
|
</Form>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const App = Form.create()(TestForm);
|
|
|
|
const wrapper = mount(<App />);
|
|
|
|
wrapper.find(Form).simulate('submit');
|
|
|
|
expect(errors.file.errors).toEqual([{ message: 'file required', field: 'file' }]);
|
|
|
|
|
|
|
|
wrapper.find('input').simulate('change', {
|
|
|
|
target: {
|
|
|
|
files: [
|
2018-04-19 11:54:28 +08:00
|
|
|
{ name: 'foo.png' },
|
2017-11-29 20:28:19 +08:00
|
|
|
],
|
|
|
|
},
|
|
|
|
});
|
|
|
|
wrapper.find(Form).simulate('submit');
|
|
|
|
expect(errors).toBeNull();
|
|
|
|
});
|
2017-12-04 15:59:23 +08:00
|
|
|
|
|
|
|
it('should support onPreview', () => {
|
|
|
|
const handlePreview = jest.fn();
|
|
|
|
const wrapper = mount(
|
|
|
|
<Upload
|
|
|
|
listType="picture-card"
|
|
|
|
defaultFileList={fileList}
|
|
|
|
onPreview={handlePreview}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
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(
|
|
|
|
<Upload
|
|
|
|
listType="picture-card"
|
|
|
|
defaultFileList={fileList}
|
|
|
|
onRemove={handleRemove}
|
|
|
|
onChange={handleChange}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
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(
|
|
|
|
<Upload
|
|
|
|
listType="picture-card"
|
|
|
|
defaultFileList={newFileList}
|
|
|
|
onPreview={handlePreview}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
wrapper.setState({});
|
2018-04-04 15:07:51 +08:00
|
|
|
await delay(200);
|
2017-12-04 15:59:23 +08:00
|
|
|
expect(wrapper.state().fileList[2].thumbUrl).not.toBeFalsy();
|
|
|
|
});
|
2018-03-11 22:24:09 +08:00
|
|
|
|
|
|
|
it('should non-image format file preview', () => {
|
|
|
|
const list = [
|
|
|
|
{
|
2018-04-04 17:17:01 +08:00
|
|
|
name: 'not-image',
|
|
|
|
status: 'done',
|
2018-03-11 22:24:09 +08:00
|
|
|
uid: -3,
|
|
|
|
url: 'https://cdn.xxx.com/aaa.zip',
|
|
|
|
thumbUrl: 'data:application/zip;base64,UEsDBAoAAAAAADYZYkwAAAAAAAAAAAAAAAAdAAk',
|
|
|
|
originFileObj: new File([], 'aaa.zip'),
|
|
|
|
},
|
2018-04-04 17:17:01 +08:00
|
|
|
{
|
|
|
|
name: 'image',
|
|
|
|
status: 'done',
|
|
|
|
uid: -4,
|
|
|
|
url: 'https://cdn.xxx.com/aaa',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'not-image',
|
|
|
|
status: 'done',
|
|
|
|
uid: -5,
|
|
|
|
url: 'https://cdn.xxx.com/aaa.xx',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'not-image',
|
|
|
|
status: 'done',
|
|
|
|
uid: -6,
|
|
|
|
url: 'https://cdn.xxx.com/aaa.png/xx.xx',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'image',
|
|
|
|
status: 'done',
|
2018-04-15 15:10:25 +08:00
|
|
|
uid: -7,
|
2018-04-04 17:17:01 +08:00
|
|
|
url: 'https://cdn.xxx.com/xx.xx/aaa.png',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'image',
|
|
|
|
status: 'done',
|
2018-04-15 15:10:25 +08:00
|
|
|
uid: -8,
|
2018-04-04 17:17:01 +08:00
|
|
|
url: 'https://cdn.xxx.com/xx.xx/aaa.png',
|
|
|
|
thumbUrl: 'data:image/png;base64,UEsDBAoAAAAAADYZYkwAAAAAAAAAAAAAAAAdAAk',
|
|
|
|
},
|
2018-04-17 13:49:03 +08:00
|
|
|
{
|
|
|
|
name: 'image',
|
|
|
|
status: 'done',
|
|
|
|
uid: -9,
|
|
|
|
url: 'https://cdn.xxx.com/xx.xx/aaa.png?query=123',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'image',
|
|
|
|
status: 'done',
|
|
|
|
uid: -10,
|
|
|
|
url: 'https://cdn.xxx.com/xx.xx/aaa.png#anchor',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'image',
|
|
|
|
status: 'done',
|
|
|
|
uid: -11,
|
|
|
|
url: 'https://cdn.xxx.com/xx.xx/aaa.png?query=some.query.with.dot',
|
|
|
|
},
|
2018-03-11 22:24:09 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
const wrapper = mount(
|
|
|
|
<Upload
|
|
|
|
listType="picture"
|
|
|
|
defaultFileList={list}
|
|
|
|
>
|
|
|
|
<button>upload</button>
|
|
|
|
</Upload>
|
|
|
|
);
|
|
|
|
expect(wrapper.render()).toMatchSnapshot();
|
|
|
|
});
|
2017-01-24 14:59:39 +08:00
|
|
|
});
|