unit.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. /*
  2. * jQuery File Upload Test
  3. * https://github.com/blueimp/JavaScript-Load-Image
  4. *
  5. * Copyright 2010, Sebastian Tschan
  6. * https://blueimp.net
  7. *
  8. * Licensed under the MIT license:
  9. * https://opensource.org/licenses/MIT
  10. */
  11. /* global beforeEach, afterEach, describe, it */
  12. /* eslint-disable new-cap */
  13. (function (expect, $) {
  14. 'use strict';
  15. var canCreateBlob = !!window.dataURLtoBlob;
  16. // 80x60px GIF image (color black, base64 data):
  17. var b64DataGIF =
  18. 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' +
  19. 'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' +
  20. 'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7';
  21. var imageUrlGIF = 'data:image/gif;base64,' + b64DataGIF;
  22. var blobGIF = canCreateBlob && window.dataURLtoBlob(imageUrlGIF);
  23. // 2x1px JPEG (color white, with the Exif orientation flag set to 6 and the
  24. // IPTC ObjectName (2:5) set to 'objectname'):
  25. var b64DataJPEG =
  26. '/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAA' +
  27. 'BgASAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAA8cAgUACm9iamVj' +
  28. 'dG5hbWUA/9sAQwABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
  29. 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/9sAQwEBAQEBAQEBAQEBAQEBAQEB' +
  30. 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
  31. '/8AAEQgAAQACAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYH' +
  32. 'CAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh' +
  33. 'CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldY' +
  34. 'WVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1' +
  35. 'tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8B' +
  36. 'AAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAEC' +
  37. 'dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBka' +
  38. 'JicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG' +
  39. 'h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ' +
  40. '2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/v4ooooA/9k=';
  41. var imageUrlJPEG = 'data:image/jpeg;base64,' + b64DataJPEG;
  42. var blobJPEG = canCreateBlob && window.dataURLtoBlob(imageUrlJPEG);
  43. var fileGIF, fileJPEG, files, items, eventObject;
  44. var uploadURL = '../server/php/';
  45. /**
  46. * Creates a fileupload form and adds it to the DOM
  47. *
  48. * @returns {object} jQuery node
  49. */
  50. function createFileuploadForm() {
  51. return $('<form><input type="file" name="files[]" multiple></form>')
  52. .prop({
  53. action: uploadURL,
  54. method: 'POST',
  55. enctype: 'multipart/form-data'
  56. })
  57. .css({ display: 'none' })
  58. .appendTo(document.body);
  59. }
  60. /**
  61. * Deletes all files from the upload server
  62. *
  63. * @param {Array} files Response files list
  64. * @param {Function} callback Callback function
  65. */
  66. function deleteFiles(files, callback) {
  67. $.when(
  68. files.map(function (file) {
  69. return $.ajax({
  70. type: file.deleteType,
  71. url: file.deleteUrl
  72. });
  73. })
  74. ).always(function () {
  75. callback();
  76. });
  77. }
  78. beforeEach(function () {
  79. fileGIF = new File([blobGIF], 'example.gif', { type: 'image/gif' });
  80. fileJPEG = new File([blobJPEG], 'example.jpg', { type: 'image/jpeg' });
  81. files = [fileGIF, fileJPEG];
  82. items = [
  83. {
  84. getAsFile: function () {
  85. return files[0];
  86. }
  87. },
  88. {
  89. getAsFile: function () {
  90. return files[1];
  91. }
  92. }
  93. ];
  94. eventObject = {
  95. originalEvent: {
  96. dataTransfer: { files: files, types: ['Files'] },
  97. clipboardData: { items: items }
  98. }
  99. };
  100. });
  101. afterEach(function (done) {
  102. $.getJSON(uploadURL).then(function (result) {
  103. deleteFiles(result.files, done);
  104. });
  105. });
  106. describe('Initialization', function () {
  107. var form;
  108. beforeEach(function () {
  109. form = createFileuploadForm();
  110. });
  111. afterEach(function () {
  112. form.remove();
  113. });
  114. it('widget', function () {
  115. form.fileupload();
  116. expect(form.data('blueimp-fileupload')).to.be.an('object');
  117. });
  118. it('file input', function () {
  119. form.fileupload();
  120. expect(form.fileupload('option', 'fileInput').length).to.equal(1);
  121. });
  122. it('drop zone', function () {
  123. form.fileupload();
  124. expect(form.fileupload('option', 'dropZone').length).to.equal(1);
  125. });
  126. it('paste zone', function () {
  127. form.fileupload({ pasteZone: document });
  128. expect(form.fileupload('option', 'pasteZone').length).to.equal(1);
  129. });
  130. it('data attributes', function () {
  131. form.attr('data-url', 'https://example.org');
  132. form.fileupload();
  133. expect(form.fileupload('option', 'url')).to.equal('https://example.org');
  134. expect(form.data('blueimp-fileupload')).to.be.an('object');
  135. });
  136. it('event listeners', function () {
  137. var eventsData = {};
  138. form.fileupload({
  139. autoUpload: false,
  140. pasteZone: document,
  141. dragover: function () {
  142. eventsData.dragover = true;
  143. },
  144. dragenter: function () {
  145. eventsData.dragenter = true;
  146. },
  147. dragleave: function () {
  148. eventsData.dragleave = true;
  149. },
  150. drop: function (e, data) {
  151. eventsData.drop = data;
  152. },
  153. paste: function (e, data) {
  154. eventsData.paste = data;
  155. },
  156. change: function () {
  157. eventsData.change = true;
  158. }
  159. });
  160. form
  161. .fileupload('option', 'fileInput')
  162. .trigger($.Event('change', eventObject));
  163. expect(eventsData.change).to.equal(true);
  164. form
  165. .fileupload('option', 'dropZone')
  166. .trigger($.Event('dragover', eventObject))
  167. .trigger($.Event('dragenter', eventObject))
  168. .trigger($.Event('dragleave', eventObject))
  169. .trigger($.Event('drop', eventObject));
  170. expect(eventsData.dragover).to.equal(true);
  171. expect(eventsData.dragenter).to.equal(true);
  172. expect(eventsData.dragleave).to.equal(true);
  173. expect(eventsData.drop.files).to.deep.equal(files);
  174. form
  175. .fileupload('option', 'pasteZone')
  176. .trigger($.Event('paste', eventObject));
  177. expect(eventsData.paste.files).to.deep.equal(files);
  178. });
  179. });
  180. describe('API', function () {
  181. var form;
  182. beforeEach(function () {
  183. form = createFileuploadForm().fileupload({
  184. dataType: 'json',
  185. autoUpload: false
  186. });
  187. });
  188. afterEach(function () {
  189. form.remove();
  190. });
  191. it('destroy', function () {
  192. var eventsData = {};
  193. form.fileupload('option', {
  194. pasteZone: document,
  195. dragover: function () {
  196. eventsData.dragover = true;
  197. },
  198. dragenter: function () {
  199. eventsData.dragenter = true;
  200. },
  201. dragleave: function () {
  202. eventsData.dragleave = true;
  203. },
  204. drop: function (e, data) {
  205. eventsData.drop = data;
  206. },
  207. paste: function (e, data) {
  208. eventsData.paste = data;
  209. },
  210. change: function () {
  211. eventsData.change = true;
  212. }
  213. });
  214. var fileInput = form.fileupload('option', 'fileInput');
  215. var dropZone = form.fileupload('option', 'dropZone');
  216. var pasteZone = form.fileupload('option', 'pasteZone');
  217. form.fileupload('destroy');
  218. expect(form.data('blueimp-fileupload')).to.equal();
  219. fileInput.trigger($.Event('change', eventObject));
  220. expect(eventsData.change).to.equal();
  221. dropZone
  222. .trigger($.Event('dragover', eventObject))
  223. .trigger($.Event('dragenter', eventObject))
  224. .trigger($.Event('dragleave', eventObject))
  225. .trigger($.Event('drop', eventObject));
  226. expect(eventsData.dragover).to.equal();
  227. expect(eventsData.dragenter).to.equal();
  228. expect(eventsData.dragleave).to.equal();
  229. expect(eventsData.drop).to.equal();
  230. pasteZone.trigger($.Event('paste', eventObject));
  231. expect(eventsData.paste).to.equal();
  232. });
  233. it('disable', function () {
  234. var eventsData = {};
  235. form.fileupload('option', {
  236. pasteZone: document,
  237. dragover: function () {
  238. eventsData.dragover = true;
  239. },
  240. dragenter: function () {
  241. eventsData.dragenter = true;
  242. },
  243. dragleave: function () {
  244. eventsData.dragleave = true;
  245. },
  246. drop: function (e, data) {
  247. eventsData.drop = data;
  248. },
  249. paste: function (e, data) {
  250. eventsData.paste = data;
  251. },
  252. change: function () {
  253. eventsData.change = true;
  254. }
  255. });
  256. form.fileupload('disable');
  257. form
  258. .fileupload('option', 'fileInput')
  259. .trigger($.Event('change', eventObject));
  260. expect(eventsData.change).to.equal();
  261. form
  262. .fileupload('option', 'dropZone')
  263. .trigger($.Event('dragover', eventObject))
  264. .trigger($.Event('dragenter', eventObject))
  265. .trigger($.Event('dragleave', eventObject))
  266. .trigger($.Event('drop', eventObject));
  267. expect(eventsData.dragover).to.equal();
  268. expect(eventsData.dragenter).to.equal();
  269. expect(eventsData.dragleave).to.equal();
  270. expect(eventsData.drop).to.equal();
  271. form
  272. .fileupload('option', 'pasteZone')
  273. .trigger($.Event('paste', eventObject));
  274. expect(eventsData.paste).to.equal();
  275. });
  276. it('enable', function () {
  277. var eventsData = {};
  278. form.fileupload('option', {
  279. pasteZone: document,
  280. dragover: function () {
  281. eventsData.dragover = true;
  282. },
  283. dragenter: function () {
  284. eventsData.dragenter = true;
  285. },
  286. dragleave: function () {
  287. eventsData.dragleave = true;
  288. },
  289. drop: function (e, data) {
  290. eventsData.drop = data;
  291. },
  292. paste: function (e, data) {
  293. eventsData.paste = data;
  294. },
  295. change: function () {
  296. eventsData.change = true;
  297. }
  298. });
  299. form.fileupload('disable');
  300. form.fileupload('enable');
  301. form
  302. .fileupload('option', 'fileInput')
  303. .trigger($.Event('change', eventObject));
  304. expect(eventsData.change).to.equal(true);
  305. form
  306. .fileupload('option', 'dropZone')
  307. .trigger($.Event('dragover', eventObject))
  308. .trigger($.Event('dragenter', eventObject))
  309. .trigger($.Event('dragleave', eventObject))
  310. .trigger($.Event('drop', eventObject));
  311. expect(eventsData.dragover).to.equal(true);
  312. expect(eventsData.dragenter).to.equal(true);
  313. expect(eventsData.dragleave).to.equal(true);
  314. expect(eventsData.drop.files).to.deep.equal(files);
  315. form
  316. .fileupload('option', 'pasteZone')
  317. .trigger($.Event('paste', eventObject));
  318. expect(eventsData.paste.files).to.deep.equal(files);
  319. });
  320. it('option', function () {
  321. var eventsData = {};
  322. form.fileupload('option', 'drop', function (e, data) {
  323. eventsData.drop = data;
  324. });
  325. var dropZone = form
  326. .fileupload('option', 'dropZone')
  327. .trigger($.Event('drop', eventObject));
  328. expect(eventsData.drop.files).to.deep.equal(files);
  329. delete eventsData.drop;
  330. form.fileupload('option', 'dropZone', null);
  331. dropZone.trigger($.Event('drop', eventObject));
  332. expect(eventsData.drop).to.equal();
  333. form.fileupload('option', {
  334. dropZone: dropZone
  335. });
  336. dropZone.trigger($.Event('drop', eventObject));
  337. expect(eventsData.drop.files).to.deep.equal(files);
  338. });
  339. it('add', function () {
  340. var eventData = [];
  341. form.fileupload('option', 'add', function (e, data) {
  342. eventData.push(data);
  343. });
  344. form.fileupload('add', { files: files });
  345. expect(eventData.length).to.equal(2);
  346. expect(eventData[0].files[0]).to.equal(files[0]);
  347. expect(eventData[1].files[0]).to.equal(files[1]);
  348. });
  349. it('send', function (done) {
  350. this.slow(200);
  351. form.fileupload('send', { files: files }).complete(function (result) {
  352. var uploadedFiles = result.responseJSON.files;
  353. expect(uploadedFiles.length).to.equal(2);
  354. expect(uploadedFiles[0].type).to.equal(files[0].type);
  355. expect(uploadedFiles[0].error).to.equal();
  356. expect(uploadedFiles[1].type).to.equal(files[1].type);
  357. expect(uploadedFiles[1].error).to.equal();
  358. done();
  359. });
  360. });
  361. });
  362. describe('Callbacks', function () {
  363. var form;
  364. beforeEach(function () {
  365. form = createFileuploadForm().fileupload({ dataType: 'json' });
  366. });
  367. afterEach(function () {
  368. form.remove();
  369. });
  370. it('add', function () {
  371. var eventData = [];
  372. form.fileupload('option', 'add', function (e, data) {
  373. eventData.push(data);
  374. });
  375. form.fileupload('add', { files: files });
  376. expect(eventData.length).to.equal(2);
  377. expect(eventData[0].files[0]).to.equal(files[0]);
  378. expect(eventData[1].files[0]).to.equal(files[1]);
  379. });
  380. it('submit', function (done) {
  381. this.slow(200);
  382. var eventData = [];
  383. form.fileupload('option', {
  384. submit: function (e, data) {
  385. eventData.push(data);
  386. },
  387. stop: function () {
  388. if (eventData.length < 2) return;
  389. expect(eventData[0].files[0]).to.equal(files[0]);
  390. expect(eventData[1].files[0]).to.equal(files[1]);
  391. done();
  392. }
  393. });
  394. form.fileupload('add', { files: files });
  395. });
  396. it('send', function (done) {
  397. this.slow(200);
  398. var eventData = [];
  399. form.fileupload('option', {
  400. send: function (e, data) {
  401. eventData.push(data);
  402. },
  403. stop: function () {
  404. expect(eventData.length).to.equal(1);
  405. expect(eventData[0].files).to.deep.equal(files);
  406. done();
  407. }
  408. });
  409. form.fileupload('send', { files: files });
  410. });
  411. it('done', function (done) {
  412. this.slow(200);
  413. var eventData = [];
  414. form.fileupload('option', {
  415. done: function (e, data) {
  416. eventData.push(data);
  417. },
  418. stop: function () {
  419. if (eventData.length < 2) return;
  420. expect(eventData[0].result.files.length).to.equal(1);
  421. expect(eventData[1].result.files.length).to.equal(1);
  422. done();
  423. }
  424. });
  425. form.fileupload('add', { files: files });
  426. });
  427. it('fail', function (done) {
  428. this.slow(200);
  429. var eventData = [];
  430. form.fileupload('option', {
  431. url: uploadURL + '404',
  432. fail: function (e, data) {
  433. eventData.push(data);
  434. },
  435. stop: function () {
  436. if (eventData.length < 2) return;
  437. expect(eventData[0].result).to.equal();
  438. expect(eventData[1].result).to.equal();
  439. done();
  440. }
  441. });
  442. form.fileupload('add', { files: files });
  443. });
  444. it('always', function (done) {
  445. this.slow(200);
  446. var eventData = [];
  447. form.fileupload('option', {
  448. always: function (e, data) {
  449. eventData.push(data);
  450. },
  451. stop: function () {
  452. if (eventData.length < 2) {
  453. expect(eventData[0].result).to.equal();
  454. form.fileupload('add', { files: [fileGIF] });
  455. return;
  456. }
  457. expect(eventData[1].result.files.length).to.equal(1);
  458. done();
  459. }
  460. });
  461. form.fileupload('add', { files: [fileGIF], url: uploadURL + '404' });
  462. });
  463. it('progress', function (done) {
  464. this.slow(200);
  465. var loaded;
  466. var total;
  467. form.fileupload('option', {
  468. progress: function (e, data) {
  469. loaded = data.loaded;
  470. total = data.total;
  471. expect(loaded).to.be.at.most(total);
  472. },
  473. stop: function () {
  474. expect(loaded).to.equal(total);
  475. done();
  476. }
  477. });
  478. form.fileupload('add', { files: [fileGIF] });
  479. });
  480. it('progressall', function (done) {
  481. this.slow(200);
  482. var loaded;
  483. var total;
  484. var completed = 0;
  485. form.fileupload('option', {
  486. progressall: function (e, data) {
  487. loaded = data.loaded;
  488. total = data.total;
  489. expect(loaded).to.be.at.most(total);
  490. },
  491. always: function () {
  492. completed++;
  493. },
  494. stop: function () {
  495. if (completed < 2) return;
  496. expect(loaded).to.equal(total);
  497. done();
  498. }
  499. });
  500. form.fileupload('add', { files: files });
  501. });
  502. it('start', function (done) {
  503. this.slow(200);
  504. var started;
  505. form.fileupload('option', {
  506. start: function () {
  507. started = true;
  508. },
  509. stop: function () {
  510. expect(started).to.equal(true);
  511. done();
  512. }
  513. });
  514. form.fileupload('add', { files: [fileGIF] });
  515. });
  516. it('stop', function (done) {
  517. this.slow(200);
  518. form.fileupload('option', {
  519. stop: function () {
  520. done();
  521. }
  522. });
  523. form.fileupload('add', { files: [fileGIF] });
  524. });
  525. it('dragover', function () {
  526. var eventsData = {};
  527. form.fileupload('option', {
  528. autoUpload: false,
  529. dragover: function () {
  530. eventsData.dragover = true;
  531. }
  532. });
  533. form
  534. .fileupload('option', 'dropZone')
  535. .trigger($.Event('dragover', eventObject));
  536. expect(eventsData.dragover).to.equal(true);
  537. });
  538. it('dragenter', function () {
  539. var eventsData = {};
  540. form.fileupload('option', {
  541. autoUpload: false,
  542. dragenter: function () {
  543. eventsData.dragenter = true;
  544. }
  545. });
  546. form
  547. .fileupload('option', 'dropZone')
  548. .trigger($.Event('dragenter', eventObject));
  549. expect(eventsData.dragenter).to.equal(true);
  550. });
  551. it('dragleave', function () {
  552. var eventsData = {};
  553. form.fileupload('option', {
  554. autoUpload: false,
  555. dragleave: function () {
  556. eventsData.dragleave = true;
  557. }
  558. });
  559. form
  560. .fileupload('option', 'dropZone')
  561. .trigger($.Event('dragleave', eventObject));
  562. expect(eventsData.dragleave).to.equal(true);
  563. });
  564. it('drop', function () {
  565. var eventsData = {};
  566. form.fileupload('option', {
  567. autoUpload: false,
  568. drop: function (e, data) {
  569. eventsData.drop = data;
  570. }
  571. });
  572. form
  573. .fileupload('option', 'dropZone')
  574. .trigger($.Event('drop', eventObject));
  575. expect(eventsData.drop.files).to.deep.equal(files);
  576. });
  577. it('paste', function () {
  578. var eventsData = {};
  579. form.fileupload('option', {
  580. autoUpload: false,
  581. pasteZone: document,
  582. paste: function (e, data) {
  583. eventsData.paste = data;
  584. }
  585. });
  586. form
  587. .fileupload('option', 'pasteZone')
  588. .trigger($.Event('paste', eventObject));
  589. expect(eventsData.paste.files).to.deep.equal(files);
  590. });
  591. it('change', function () {
  592. var eventsData = {};
  593. form.fileupload('option', {
  594. autoUpload: false,
  595. change: function () {
  596. eventsData.change = true;
  597. }
  598. });
  599. form
  600. .fileupload('option', 'fileInput')
  601. .trigger($.Event('change', eventObject));
  602. expect(eventsData.change).to.equal(true);
  603. });
  604. });
  605. describe('Options', function () {
  606. var form;
  607. beforeEach(function () {
  608. form = createFileuploadForm();
  609. });
  610. afterEach(function () {
  611. form.remove();
  612. });
  613. it('paramName', function (done) {
  614. form.fileupload({
  615. send: function (e, data) {
  616. expect(data.paramName[0]).to.equal(
  617. form.fileupload('option', 'fileInput').prop('name')
  618. );
  619. done();
  620. return false;
  621. }
  622. });
  623. form.fileupload('add', { files: [fileGIF] });
  624. });
  625. it('url', function (done) {
  626. form.fileupload({
  627. send: function (e, data) {
  628. expect(data.url).to.equal(form.prop('action'));
  629. done();
  630. return false;
  631. }
  632. });
  633. form.fileupload('add', { files: [fileGIF] });
  634. });
  635. it('type', function (done) {
  636. form.fileupload({
  637. type: 'PUT',
  638. send: function (e, data) {
  639. expect(data.type).to.equal('PUT');
  640. done();
  641. return false;
  642. }
  643. });
  644. form.fileupload('add', { files: [fileGIF] });
  645. });
  646. it('replaceFileInput', function () {
  647. form.fileupload();
  648. var fileInput = form.fileupload('option', 'fileInput');
  649. fileInput.trigger($.Event('change', eventObject));
  650. expect(form.fileupload('option', 'fileInput')[0]).to.not.equal(
  651. fileInput[0]
  652. );
  653. form.fileupload('option', 'replaceFileInput', false);
  654. fileInput = form.fileupload('option', 'fileInput');
  655. fileInput.trigger($.Event('change', eventObject));
  656. expect(form.fileupload('option', 'fileInput')[0]).to.equal(fileInput[0]);
  657. });
  658. it('forceIframeTransport', function (done) {
  659. form.fileupload({
  660. forceIframeTransport: 'PUT',
  661. send: function (e, data) {
  662. expect(data.dataType.substr(0, 6)).to.equal('iframe');
  663. done();
  664. return false;
  665. }
  666. });
  667. form.fileupload('add', { files: [fileGIF] });
  668. });
  669. it('singleFileUploads', function (done) {
  670. form.fileupload({
  671. singleFileUploads: false,
  672. send: function (e, data) {
  673. expect(data.files).to.deep.equal(files);
  674. done();
  675. return false;
  676. }
  677. });
  678. form.fileupload('add', { files: files });
  679. });
  680. it('limitMultiFileUploads', function (done) {
  681. var completed = 0;
  682. form.fileupload({
  683. singleFileUploads: false,
  684. limitMultiFileUploads: 2,
  685. send: function (e, data) {
  686. expect(data.files).to.deep.equal(files);
  687. completed++;
  688. if (completed < 2) return;
  689. done();
  690. return false;
  691. }
  692. });
  693. form.fileupload('add', { files: files.concat(files) });
  694. });
  695. it('limitMultiFileUploadSize', function (done) {
  696. var completed = 0;
  697. form.fileupload({
  698. singleFileUploads: false,
  699. limitMultiFileUploadSize: files[0].size + files[1].size,
  700. limitMultiFileUploadSizeOverhead: 0,
  701. send: function (e, data) {
  702. expect(data.files).to.deep.equal(files);
  703. completed++;
  704. if (completed < 2) return;
  705. done();
  706. return false;
  707. }
  708. });
  709. form.fileupload('add', { files: files.concat(files) });
  710. });
  711. it('sequentialUploads', function (done) {
  712. this.slow(400);
  713. var completed = 0;
  714. var events = [];
  715. form.fileupload({
  716. sequentialUploads: true,
  717. dataType: 'json',
  718. send: function () {
  719. events.push('send');
  720. },
  721. always: function () {
  722. events.push('complete');
  723. completed++;
  724. },
  725. stop: function () {
  726. if (completed === 4) {
  727. expect(events.join(',')).to.equal(
  728. [
  729. 'send',
  730. 'complete',
  731. 'send',
  732. 'complete',
  733. 'send',
  734. 'complete',
  735. 'send',
  736. 'complete'
  737. ].join(',')
  738. );
  739. done();
  740. }
  741. }
  742. });
  743. form.fileupload('add', { files: files.concat(files) });
  744. });
  745. it('limitConcurrentUploads', function (done) {
  746. this.slow(800);
  747. var completed = 0;
  748. var loadCount = 0;
  749. form.fileupload({
  750. limitConcurrentUploads: 2,
  751. dataType: 'json',
  752. send: function () {
  753. loadCount++;
  754. expect(loadCount).to.be.at.most(2);
  755. },
  756. always: function () {
  757. completed++;
  758. loadCount--;
  759. },
  760. stop: function () {
  761. if (completed === 8) {
  762. done();
  763. }
  764. }
  765. });
  766. form.fileupload('add', {
  767. files: files.concat(files).concat(files).concat(files)
  768. });
  769. });
  770. it('multipart', function (done) {
  771. form.fileupload({
  772. multipart: false,
  773. send: function (e, data) {
  774. expect(data.contentType).to.equal(fileGIF.type);
  775. expect(data.headers['Content-Disposition']).to.equal(
  776. 'attachment; filename="' + fileGIF.name + '"'
  777. );
  778. done();
  779. return false;
  780. }
  781. });
  782. form.fileupload('add', { files: [fileGIF] });
  783. });
  784. it('uniqueFilenames', function (done) {
  785. form.fileupload({
  786. uniqueFilenames: {},
  787. send: function (e, data) {
  788. var formFiles = data.data.getAll('files[]');
  789. expect(formFiles[0].name).to.equal(fileGIF.name);
  790. expect(formFiles[1].name).to.equal(
  791. fileGIF.name.replace('.gif', ' (1).gif')
  792. );
  793. expect(formFiles[2].name).to.equal(
  794. fileGIF.name.replace('.gif', ' (2).gif')
  795. );
  796. done();
  797. return false;
  798. }
  799. });
  800. form.fileupload('send', { files: [fileGIF, fileGIF, fileGIF] });
  801. });
  802. it('maxChunkSize', function (done) {
  803. this.slow(400);
  804. var events = [];
  805. form.fileupload({
  806. maxChunkSize: 32,
  807. dataType: 'json',
  808. chunkbeforesend: function () {
  809. events.push('chunkbeforesend');
  810. },
  811. chunksend: function () {
  812. events.push('chunksend');
  813. },
  814. chunkdone: function () {
  815. events.push('chunkdone');
  816. },
  817. done: function (e, data) {
  818. var uploadedFile = data.result.files[0];
  819. expect(uploadedFile.type).to.equal(fileGIF.type);
  820. expect(uploadedFile.size).to.equal(fileGIF.size);
  821. },
  822. stop: function () {
  823. expect(events.join(',')).to.equal(
  824. [
  825. 'chunkbeforesend',
  826. 'chunksend',
  827. 'chunkdone',
  828. 'chunkbeforesend',
  829. 'chunksend',
  830. 'chunkdone',
  831. 'chunkbeforesend',
  832. 'chunksend',
  833. 'chunkdone',
  834. 'chunkbeforesend',
  835. 'chunksend',
  836. 'chunkdone'
  837. ].join(',')
  838. );
  839. done();
  840. }
  841. });
  842. form.fileupload('send', { files: [fileGIF] });
  843. });
  844. it('acceptFileTypes', function (done) {
  845. var processData;
  846. form.fileupload({
  847. acceptFileTypes: /^image\/gif$/,
  848. singleFileUploads: false,
  849. processalways: function (e, data) {
  850. processData = data;
  851. },
  852. processstop: function () {
  853. expect(processData.files[0].error).to.equal();
  854. expect(processData.files[1].error).to.equal(
  855. form.fileupload('option').i18n('acceptFileTypes')
  856. );
  857. done();
  858. }
  859. });
  860. form.fileupload('add', { files: files });
  861. });
  862. it('maxFileSize', function (done) {
  863. var processData;
  864. form.fileupload({
  865. maxFileSize: 200,
  866. singleFileUploads: false,
  867. processalways: function (e, data) {
  868. processData = data;
  869. },
  870. processstop: function () {
  871. expect(processData.files[0].error).to.equal();
  872. expect(processData.files[1].error).to.equal(
  873. form.fileupload('option').i18n('maxFileSize')
  874. );
  875. done();
  876. }
  877. });
  878. form.fileupload('add', { files: files });
  879. });
  880. it('minFileSize', function (done) {
  881. var processData;
  882. form.fileupload({
  883. minFileSize: 200,
  884. singleFileUploads: false,
  885. processalways: function (e, data) {
  886. processData = data;
  887. },
  888. processstop: function () {
  889. expect(processData.files[0].error).to.equal(
  890. form.fileupload('option').i18n('minFileSize')
  891. );
  892. expect(processData.files[1].error).to.equal();
  893. done();
  894. }
  895. });
  896. form.fileupload('add', { files: files });
  897. });
  898. it('maxNumberOfFiles', function (done) {
  899. var processData;
  900. form.fileupload({
  901. maxNumberOfFiles: 2,
  902. getNumberOfFiles: function () {
  903. return 2;
  904. },
  905. singleFileUploads: false,
  906. processalways: function (e, data) {
  907. processData = data;
  908. },
  909. processstop: function () {
  910. expect(processData.files[0].error).to.equal(
  911. form.fileupload('option').i18n('maxNumberOfFiles')
  912. );
  913. expect(processData.files[1].error).to.equal(
  914. form.fileupload('option').i18n('maxNumberOfFiles')
  915. );
  916. done();
  917. }
  918. });
  919. form.fileupload('add', { files: files });
  920. });
  921. });
  922. })(this.chai.expect, this.jQuery);