123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- import { createVue, destroyVM } from '../util.js';
- import ajax from 'packages/upload/src/ajax';
- const noop = () => {
- };
- const option = {
- onSuccess: noop,
- data: { a: 'abc', b: 'bcd' },
- filename: 'file.png',
- file: 'foo',
- action: '/upload',
- headers: { region: 'shanghai' }
- };
- let requests, xhr;
- describe('ajax', () => {
- beforeEach(() => {
- xhr = sinon.useFakeXMLHttpRequest();
- requests = [];
- xhr.onCreate = req => requests.push(req);
- option.onError = noop;
- option.onSuccess = noop;
- });
- afterEach(() => {
- xhr.restore();
- });
- it('request success', done => {
- option.onError = done;
- option.onSuccess = ret => {
- expect(ret).to.eql({ success: true });
- done();
- };
- ajax(option);
- requests[0].respond(200, {}, '{"success": true}');
- });
- it('request width header', done => {
- ajax(option);
- expect(requests[0].requestHeaders).to.eql({
- // 'X-Requested-With': 'XMLHttpRequest',
- region: 'shanghai'
- });
- done();
- });
- it('40x code should be error', done => {
- option.onError = e => {
- expect(e.toString()).to.contain('404 Not found');
- done();
- };
- option.onSuccess = () => done('404 should throw error');
- ajax(option);
- requests[0].respond(404, {}, 'Not found');
- });
- it('2xx code should be success', done => {
- option.onError = done;
- option.onSuccess = ret => {
- expect(ret).to.equal('');
- done();
- };
- ajax(option);
- requests[0].respond(204, {});
- });
- });
- describe('Upload', () => {
- let requests;
- let xhr;
- beforeEach(() => {
- xhr = sinon.useFakeXMLHttpRequest();
- requests = [];
- xhr.onCreate = req => requests.push(req);
- });
- afterEach(() => {
- xhr.restore();
- });
- describe('ajax upload', () => {
- if (typeof FormData === 'undefined') {
- return;
- }
- let uploader;
- let handlers = {};
- const props = {
- props: {
- action: '/upload',
- onSuccess(res, file, fileList) {
- if (handlers.onSuccess) {
- handlers.onSuccess(res, file, fileList);
- }
- },
- onError(err, file, fileList) {
- if (handlers.onError) {
- handlers.onError(err, file, fileList);
- }
- },
- onPreview(file) {
- if (handlers.onPreview) {
- handlers.onPreview(file);
- }
- },
- limit: 2,
- onExceed(files, fileList) {
- if (handlers.onExceed) {
- handlers.onExceed(files, fileList);
- }
- }
- }
- };
- beforeEach(() => {
- uploader = createVue({
- render(h) {
- return (
- <el-upload {...props} ref="upload">
- <el-button size="small" type="primary">点击上传</el-button>
- </el-upload>
- );
- }
- }, true).$refs.upload;
- });
- afterEach(() => {
- destroyVM(uploader);
- handlers = {};
- });
- it('upload success', done => {
- const file = new Blob([JSON.stringify({}, null, 2)], {
- type: 'application/json'
- });
- file.name = 'success.png';
- const files = [file];
- handlers.onSuccess = (res, file, fileList) => {
- expect(file.name).to.equal('success.png');
- expect(fileList.length).to.equal(1);
- expect(res).to.equal('success.png');
- done();
- };
- uploader.$refs['upload-inner'].handleChange({ target: { files }});
- setTimeout(() => {
- requests[0].respond(200, {}, `${files[0].name}`);
- }, 100);
- });
- it('upload fail', done => {
- const file = new Blob([JSON.stringify({}, null, 2)], {
- type: 'application/json'
- });
- file.name = 'fail.png';
- const files = [file];
- handlers.onError = (err, file, fileList) => {
- expect(err instanceof Error).to.equal(true);
- expect(file.name).to.equal('fail.png');
- done();
- };
- uploader.$refs['upload-inner'].handleChange({ target: { files }});
- setTimeout(() => {
- requests[0].respond(400, {}, 'error 400');
- }, 100);
- });
- it('preview file', done => {
- const file = new Blob([JSON.stringify({}, null, 2)], {
- type: 'application/json'
- });
- file.name = 'success.png';
- const files = [file];
- handlers.onPreview = (file) => {
- expect(file.response).to.equal('success.png');
- done();
- };
- handlers.onSuccess = (res, file, fileList) => {
- uploader.$nextTick(_ => {
- uploader.$el.querySelector('.el-upload-list .is-success a').click();
- });
- };
- uploader.$refs['upload-inner'].handleChange({ target: { files }});
- setTimeout(() => {
- requests[0].respond(200, {}, `${files[0].name}`);
- }, 100);
- });
- it('file remove', done => {
- const file = new Blob([JSON.stringify({}, null, 2)], {
- type: 'application/json'
- });
- file.name = 'success.png';
- const files = [file];
- handlers.onSuccess = (res, file, fileList) => {
- uploader.$el.querySelector('.el-upload-list .el-icon-close').click();
- uploader.$nextTick(_ => {
- expect(uploader.fileList.length).to.equal(0);
- done();
- });
- };
- uploader.$refs['upload-inner'].handleChange({ target: { files }});
- setTimeout(() => {
- requests[0].respond(200, {}, `${files[0].name}`);
- }, 100);
- });
- it('clear files', done => {
- const file = new Blob([JSON.stringify({}, null, 2)], {
- type: 'application/json'
- });
- file.name = 'success.png';
- const files = [file];
- handlers.onSuccess = (res, file, fileList) => {
- uploader.clearFiles();
- uploader.$nextTick(_ => {
- expect(uploader.fileList.length).to.equal(0);
- done();
- });
- };
- uploader.$refs['upload-inner'].handleChange({ target: { files }});
- setTimeout(() => {
- requests[0].respond(200, {}, `${files[0].name}`);
- }, 100);
- });
- it('limit files', done => {
- const files = [{
- name: 'exceed2.png',
- type: 'xml'
- }, {
- name: 'exceed3.png',
- type: 'xml'
- }];
- uploader.uploadFiles = [{
- name: 'exceed1.png',
- type: 'xml'
- }];
- handlers.onExceed = (files, fileList) => {
- uploader.$nextTick(_ => {
- expect(uploader.uploadFiles.length).to.equal(1);
- done();
- });
- };
- uploader.$nextTick(_ => uploader.$refs['upload-inner'].handleChange({ target: { files }}));
- });
- });
- });
|