upload.spec.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. }
  100. };
  101. beforeEach(() => {
  102. uploader = createVue({
  103. render(h) {
  104. return (
  105. <el-upload {...props} ref="upload">
  106. <el-button size="small" type="primary">点击上传</el-button>
  107. </el-upload>
  108. );
  109. }
  110. }, true).$refs.upload;
  111. });
  112. afterEach(() => {
  113. destroyVM(uploader);
  114. handlers = {};
  115. });
  116. it('upload success', done => {
  117. const files = [{
  118. name: 'success.png',
  119. type: 'xml'
  120. }];
  121. handlers.onSuccess = (res, file, fileList) => {
  122. expect(file.name).to.equal('success.png');
  123. expect(fileList.length).to.equal(1);
  124. expect(res).to.equal('success.png');
  125. done();
  126. };
  127. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  128. setTimeout(() => {
  129. requests[0].respond(200, {}, `${files[0].name}`);
  130. }, 100);
  131. });
  132. it('upload fail', done => {
  133. const files = [{
  134. name: 'fail.png',
  135. type: 'xml'
  136. }];
  137. handlers.onError = (err, file, fileList) => {
  138. expect(err instanceof Error).to.equal(true);
  139. expect(file.name).to.equal('fail.png');
  140. done();
  141. };
  142. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  143. setTimeout(() => {
  144. requests[0].respond(400, {}, 'error 400');
  145. }, 100);
  146. });
  147. it('preview file', done => {
  148. const files = [{
  149. name: 'success.png',
  150. type: 'xml'
  151. }];
  152. handlers.onPreview = (file) => {
  153. expect(file.response).to.equal('success.png');
  154. done();
  155. };
  156. handlers.onSuccess = (res, file, fileList) => {
  157. uploader.$nextTick(_ => {
  158. uploader.$el.querySelector('.el-upload-list .is-success a').click();
  159. });
  160. };
  161. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  162. setTimeout(() => {
  163. requests[0].respond(200, {}, `${files[0].name}`);
  164. }, 100);
  165. });
  166. it('file remove', done => {
  167. const files = [{
  168. name: 'success.png',
  169. type: 'xml'
  170. }];
  171. handlers.onSuccess = (res, file, fileList) => {
  172. uploader.$el.querySelector('.el-upload-list .el-icon-close').click();
  173. uploader.$nextTick(_ => {
  174. expect(uploader.fileList.length).to.equal(0);
  175. done();
  176. });
  177. };
  178. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  179. setTimeout(() => {
  180. requests[0].respond(200, {}, `${files[0].name}`);
  181. }, 100);
  182. });
  183. it('clear files', done => {
  184. const files = [{
  185. name: 'success.png',
  186. type: 'xml'
  187. }];
  188. handlers.onSuccess = (res, file, fileList) => {
  189. uploader.clearFiles();
  190. uploader.$nextTick(_ => {
  191. expect(uploader.fileList.length).to.equal(0);
  192. done();
  193. });
  194. };
  195. uploader.$refs['upload-inner'].handleChange({ target: { files }});
  196. setTimeout(() => {
  197. requests[0].respond(200, {}, `${files[0].name}`);
  198. }, 100);
  199. });
  200. });
  201. });