123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- import { createVue, destroyVM } from '../util.js';
- import ajax from 'packages/upload/src/ajax';
- const noop = () => {
- };
- const option = {
- onSuccess: noop,
- onProgress: 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('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', () => {
- 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);
- }
- },
- beforeUpload(file) {
- if (handlers.beforeUpload) {
- return handlers.beforeUpload(file);
- } else {
- return true;
- }
- },
- beforeRemove(file, fileList) {
- if (handlers.beforeRemove) {
- return handlers.beforeRemove(file);
- } else {
- return true;
- }
- }
- }
- };
- 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('beforeUpload return promise', done => {
- const spy = sinon.spy();
- const file = new Blob([JSON.stringify({}, null, 2)], {
- type: 'application/json'
- });
- const files = [file];
- handlers.onSuccess = () => {
- expect(spy.calledOnce).to.equal(true);
- done();
- };
- handlers.beforeUpload = (file) => {
- return new window.Promise((resolve) => {
- spy();
- resolve(file);
- });
- };
- uploader.$refs['upload-inner'].handleChange({ target: { files }});
- setTimeout(() => {
- requests[0].respond(200, {}, `${files[0].name}`);
- }, 100);
- });
- it('beforeRemove return rejected promise', done => {
- const spy = sinon.spy();
- handlers.beforeRemove = (file) => {
- return new window.Promise((resolve, reject) => {
- spy();
- reject();
- });
- };
- 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();
- setTimeout(() => {
- expect(spy.calledOnce).to.equal(true);
- expect(uploader.uploadFiles.length).to.equal(1);
- done();
- }, 200);
- };
- 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 }}));
- });
- });
- });
|