upload.spec.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import { createVue, destroyVM } from '../util.js';
  2. import ajax from 'packages/upload/src/ajax';
  3. const noop = () => {
  4. };
  5. const option = {
  6. onSuccess: noop,
  7. data: { a: 'abc', b: 'bcd' },
  8. filename: 'file.png',
  9. file: 'foo',
  10. action: '/upload',
  11. headers: { region: 'shanghai' }
  12. };
  13. let requests, xhr;
  14. describe('ajax', () => {
  15. beforeEach(() => {
  16. xhr = sinon.useFakeXMLHttpRequest();
  17. requests = [];
  18. xhr.onCreate = req => requests.push(req);
  19. option.onError = noop;
  20. option.onSuccess = noop;
  21. });
  22. afterEach(() => {
  23. xhr.restore();
  24. });
  25. it('request success', done => {
  26. option.onError = done;
  27. option.onSuccess = ret => {
  28. expect(ret).to.eql({ success: true });
  29. done();
  30. };
  31. ajax(option);
  32. requests[0].respond(200, {}, '{"success": true}');
  33. });
  34. it('request width header', done => {
  35. ajax(option);
  36. expect(requests[0].requestHeaders).to.eql({
  37. // 'X-Requested-With': 'XMLHttpRequest',
  38. region: 'shanghai'
  39. });
  40. done();
  41. });
  42. it('40x code should be error', done => {
  43. option.onError = e => {
  44. expect(e.toString()).to.contain('404 Not found');
  45. done();
  46. };
  47. option.onSuccess = () => done('404 should throw error');
  48. ajax(option);
  49. requests[0].respond(404, {}, 'Not found');
  50. });
  51. it('2xx code should be success', done => {
  52. option.onError = done;
  53. option.onSuccess = ret => {
  54. expect(ret).to.equal('');
  55. done();
  56. };
  57. ajax(option);
  58. requests[0].respond(204, {});
  59. });
  60. });
  61. describe('Upload', () => {
  62. let requests;
  63. let xhr;
  64. beforeEach(() => {
  65. xhr = sinon.useFakeXMLHttpRequest();
  66. requests = [];
  67. xhr.onCreate = req => requests.push(req);
  68. });
  69. afterEach(() => {
  70. xhr.restore();
  71. });
  72. describe('ajax upload', () => {
  73. if (typeof FormData === 'undefined') {
  74. return;
  75. }
  76. let uploader;
  77. let handlers = {};
  78. const props = {
  79. props: {
  80. action: '/upload',
  81. onSuccess(res, file, fileList) {
  82. console.log('onSuccess', res);
  83. if (handlers.onSuccess) {
  84. handlers.onSuccess(res, file, fileList);
  85. }
  86. },
  87. onError(err, file, fileList) {
  88. console.log('onError', err, file, fileList);
  89. if (handlers.onError) {
  90. handlers.onError(err, file, fileList);
  91. }
  92. },
  93. onPreview(file) {
  94. console.log('onPreview', file);
  95. if (handlers.onPreview) {
  96. handlers.onPreview(file);
  97. }
  98. },
  99. limit: 2,
  100. onExceed(files, fileList) {
  101. console.log('onExceed', files, fileList);
  102. if (handlers.onExceed) {
  103. handlers.onExceed(files, fileList);
  104. }
  105. }
  106. }
  107. };
  108. beforeEach(() => {
  109. uploader = createVue({
  110. render(h) {
  111. return (
  112. <el-upload {...props} ref="upload">
  113. <el-button size="small" type="primary">点击上传</el-button>
  114. </el-upload>
  115. );
  116. }
  117. }, true).$refs.upload;
  118. });
  119. afterEach(() => {
  120. destroyVM(uploader);
  121. handlers = {};
  122. });
  123. it('upload success', done => {
  124. const files = [{
  125. name: 'success.png',
  126. type: 'xml'
  127. }];
  128. handlers.onSuccess = (res, file, fileList) => {
  129. expect(file.name).to.equal('success.png');
  130. expect(fileList.length).to.equal(1);
  131. expect(res).to.equal('success.png');
  132. done();
  133. };
  134. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  135. setTimeout(() => {
  136. requests[0].respond(200, {}, `${files[0].name}`);
  137. }, 100);
  138. });
  139. it('upload fail', done => {
  140. const files = [{
  141. name: 'fail.png',
  142. type: 'xml'
  143. }];
  144. handlers.onError = (err, file, fileList) => {
  145. expect(err instanceof Error).to.equal(true);
  146. expect(file.name).to.equal('fail.png');
  147. done();
  148. };
  149. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  150. setTimeout(() => {
  151. requests[0].respond(400, {}, 'error 400');
  152. }, 100);
  153. });
  154. it('preview file', done => {
  155. const files = [{
  156. name: 'success.png',
  157. type: 'xml'
  158. }];
  159. handlers.onPreview = (file) => {
  160. expect(file.response).to.equal('success.png');
  161. done();
  162. };
  163. handlers.onSuccess = (res, file, fileList) => {
  164. uploader.$nextTick(_ => {
  165. uploader.$el.querySelector('.el-upload-list .is-success a').click();
  166. });
  167. };
  168. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  169. setTimeout(() => {
  170. requests[0].respond(200, {}, `${files[0].name}`);
  171. }, 100);
  172. });
  173. it('file remove', done => {
  174. const files = [{
  175. name: 'success.png',
  176. type: 'xml'
  177. }];
  178. handlers.onSuccess = (res, file, fileList) => {
  179. uploader.$el.querySelector('.el-upload-list .el-icon-close').click();
  180. uploader.$nextTick(_ => {
  181. expect(uploader.fileList.length).to.equal(0);
  182. done();
  183. });
  184. };
  185. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  186. setTimeout(() => {
  187. requests[0].respond(200, {}, `${files[0].name}`);
  188. }, 100);
  189. });
  190. it('clear files', done => {
  191. const files = [{
  192. name: 'success.png',
  193. type: 'xml'
  194. }];
  195. handlers.onSuccess = (res, file, fileList) => {
  196. uploader.clearFiles();
  197. uploader.$nextTick(_ => {
  198. expect(uploader.fileList.length).to.equal(0);
  199. done();
  200. });
  201. };
  202. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  203. setTimeout(() => {
  204. requests[0].respond(200, {}, `${files[0].name}`);
  205. }, 100);
  206. });
  207. it('limit files', done => {
  208. const files = [{
  209. name: 'exceed2.png',
  210. type: 'xml'
  211. }, {
  212. name: 'exceed3.png',
  213. type: 'xml'
  214. }];
  215. uploader.uploadFiles = [{
  216. name: 'exceed1.png',
  217. type: 'xml'
  218. }];
  219. handlers.onExceed = (files, fileList) => {
  220. uploader.$nextTick(_ => {
  221. expect(uploader.uploadFiles.length).to.equal(1);
  222. done();
  223. });
  224. };
  225. console.log(uploader.$refs['upload-inner'].limit, uploader.$refs['upload-inner'].fileList, uploader.$refs['upload-inner'].onExceed);
  226. uploader.$nextTick(_ => uploader.$refs['upload-inner'].handleChange({ target: { files }}));
  227. });
  228. });
  229. });