upload.spec.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. if (handlers.onSuccess) {
  83. handlers.onSuccess(res, file, fileList);
  84. }
  85. },
  86. onError(err, file, fileList) {
  87. if (handlers.onError) {
  88. handlers.onError(err, file, fileList);
  89. }
  90. },
  91. onPreview(file) {
  92. if (handlers.onPreview) {
  93. handlers.onPreview(file);
  94. }
  95. },
  96. limit: 2,
  97. onExceed(files, fileList) {
  98. if (handlers.onExceed) {
  99. handlers.onExceed(files, fileList);
  100. }
  101. }
  102. }
  103. };
  104. beforeEach(() => {
  105. uploader = createVue({
  106. render(h) {
  107. return (
  108. <el-upload {...props} ref="upload">
  109. <el-button size="small" type="primary">点击上传</el-button>
  110. </el-upload>
  111. );
  112. }
  113. }, true).$refs.upload;
  114. });
  115. afterEach(() => {
  116. destroyVM(uploader);
  117. handlers = {};
  118. });
  119. it('upload success', done => {
  120. const file = new Blob([JSON.stringify({}, null, 2)], {
  121. type: 'application/json'
  122. });
  123. file.name = 'success.png';
  124. const files = [file];
  125. handlers.onSuccess = (res, file, fileList) => {
  126. expect(file.name).to.equal('success.png');
  127. expect(fileList.length).to.equal(1);
  128. expect(res).to.equal('success.png');
  129. done();
  130. };
  131. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  132. setTimeout(() => {
  133. requests[0].respond(200, {}, `${files[0].name}`);
  134. }, 100);
  135. });
  136. it('upload fail', done => {
  137. const file = new Blob([JSON.stringify({}, null, 2)], {
  138. type: 'application/json'
  139. });
  140. file.name = 'fail.png';
  141. const files = [file];
  142. handlers.onError = (err, file, fileList) => {
  143. expect(err instanceof Error).to.equal(true);
  144. expect(file.name).to.equal('fail.png');
  145. done();
  146. };
  147. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  148. setTimeout(() => {
  149. requests[0].respond(400, {}, 'error 400');
  150. }, 100);
  151. });
  152. it('preview file', done => {
  153. const file = new Blob([JSON.stringify({}, null, 2)], {
  154. type: 'application/json'
  155. });
  156. file.name = 'success.png';
  157. const files = [file];
  158. handlers.onPreview = (file) => {
  159. expect(file.response).to.equal('success.png');
  160. done();
  161. };
  162. handlers.onSuccess = (res, file, fileList) => {
  163. uploader.$nextTick(_ => {
  164. uploader.$el.querySelector('.el-upload-list .is-success a').click();
  165. });
  166. };
  167. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  168. setTimeout(() => {
  169. requests[0].respond(200, {}, `${files[0].name}`);
  170. }, 100);
  171. });
  172. it('file remove', done => {
  173. const file = new Blob([JSON.stringify({}, null, 2)], {
  174. type: 'application/json'
  175. });
  176. file.name = 'success.png';
  177. const files = [file];
  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 file = new Blob([JSON.stringify({}, null, 2)], {
  192. type: 'application/json'
  193. });
  194. file.name = 'success.png';
  195. const files = [file];
  196. handlers.onSuccess = (res, file, fileList) => {
  197. uploader.clearFiles();
  198. uploader.$nextTick(_ => {
  199. expect(uploader.fileList.length).to.equal(0);
  200. done();
  201. });
  202. };
  203. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  204. setTimeout(() => {
  205. requests[0].respond(200, {}, `${files[0].name}`);
  206. }, 100);
  207. });
  208. it('limit files', done => {
  209. const files = [{
  210. name: 'exceed2.png',
  211. type: 'xml'
  212. }, {
  213. name: 'exceed3.png',
  214. type: 'xml'
  215. }];
  216. uploader.uploadFiles = [{
  217. name: 'exceed1.png',
  218. type: 'xml'
  219. }];
  220. handlers.onExceed = (files, fileList) => {
  221. uploader.$nextTick(_ => {
  222. expect(uploader.uploadFiles.length).to.equal(1);
  223. done();
  224. });
  225. };
  226. uploader.$nextTick(_ => uploader.$refs['upload-inner'].handleChange({ target: { files }}));
  227. });
  228. });
  229. });