/admin-dashboard/assets/jquery-file-upload/test/test.js

https://gitlab.com/emad.rashad/mls-grading · JavaScript · 1260 lines · 1177 code · 66 blank · 17 comment · 34 complexity · 90340af4b54ad798c56f01a89e7a7196 MD5 · raw file

  1. /*
  2. * jQuery File Upload Plugin Test 7.3
  3. * https://github.com/blueimp/jQuery-File-Upload
  4. *
  5. * Copyright 2010, Sebastian Tschan
  6. * https://blueimp.net
  7. *
  8. * Licensed under the MIT license:
  9. * http://www.opensource.org/licenses/MIT
  10. */
  11. /*jslint nomen: true, unparam: true */
  12. /*global $, QUnit, window, document, expect, module, test, asyncTest, start, ok, strictEqual, notStrictEqual */
  13. $(function () {
  14. 'use strict';
  15. QUnit.done = function () {
  16. // Delete all uploaded files:
  17. var url = $('#fileupload').prop('action');
  18. $.getJSON(url, function (result) {
  19. $.each(result.files, function (index, file) {
  20. $.ajax({
  21. url: url + '?file=' + encodeURIComponent(file.name),
  22. type: 'DELETE'
  23. });
  24. });
  25. });
  26. };
  27. var lifecycle = {
  28. setup: function () {
  29. // Set the .fileupload method to the basic widget method:
  30. $.widget('blueimp.fileupload', window.testBasicWidget, {});
  31. },
  32. teardown: function () {
  33. // Remove all remaining event listeners:
  34. $(document).unbind();
  35. }
  36. },
  37. lifecycleUI = {
  38. setup: function () {
  39. // Set the .fileupload method to the UI widget method:
  40. $.widget('blueimp.fileupload', window.testUIWidget, {});
  41. },
  42. teardown: function () {
  43. // Remove all remaining event listeners:
  44. $(document).unbind();
  45. }
  46. };
  47. module('Initialization', lifecycle);
  48. test('Widget initialization', function () {
  49. var fu = $('#fileupload').fileupload();
  50. ok(fu.data('blueimp-fileupload') || fu.data('fileupload'));
  51. });
  52. test('Data attribute options', function () {
  53. $('#fileupload').attr('data-url', 'http://example.org');
  54. $('#fileupload').fileupload();
  55. strictEqual(
  56. $('#fileupload').fileupload('option', 'url'),
  57. 'http://example.org'
  58. );
  59. });
  60. test('File input initialization', function () {
  61. var fu = $('#fileupload').fileupload();
  62. ok(
  63. fu.fileupload('option', 'fileInput').length,
  64. 'File input field inside of the widget'
  65. );
  66. ok(
  67. fu.fileupload('option', 'fileInput').length,
  68. 'Widget element as file input field'
  69. );
  70. });
  71. test('Drop zone initialization', function () {
  72. ok($('#fileupload').fileupload()
  73. .fileupload('option', 'dropZone').length);
  74. });
  75. test('Paste zone initialization', function () {
  76. ok($('#fileupload').fileupload()
  77. .fileupload('option', 'pasteZone').length);
  78. });
  79. test('Event listeners initialization', function () {
  80. expect(
  81. $.support.xhrFormDataFileUpload ? 4 : 1
  82. );
  83. var eo = {originalEvent: {}},
  84. fu = $('#fileupload').fileupload({
  85. dragover: function () {
  86. ok(true, 'Triggers dragover callback');
  87. return false;
  88. },
  89. drop: function () {
  90. ok(true, 'Triggers drop callback');
  91. return false;
  92. },
  93. paste: function () {
  94. ok(true, 'Triggers paste callback');
  95. return false;
  96. },
  97. change: function () {
  98. ok(true, 'Triggers change callback');
  99. return false;
  100. }
  101. }),
  102. fileInput = fu.fileupload('option', 'fileInput'),
  103. dropZone = fu.fileupload('option', 'dropZone'),
  104. pasteZone = fu.fileupload('option', 'pasteZone');
  105. fileInput.trigger($.Event('change', eo));
  106. dropZone.trigger($.Event('dragover', eo));
  107. dropZone.trigger($.Event('drop', eo));
  108. pasteZone.trigger($.Event('paste', eo));
  109. });
  110. module('API', lifecycle);
  111. test('destroy', function () {
  112. expect(4);
  113. var eo = {originalEvent: {}},
  114. options = {
  115. dragover: function () {
  116. ok(true, 'Triggers dragover callback');
  117. return false;
  118. },
  119. drop: function () {
  120. ok(true, 'Triggers drop callback');
  121. return false;
  122. },
  123. paste: function () {
  124. ok(true, 'Triggers paste callback');
  125. return false;
  126. },
  127. change: function () {
  128. ok(true, 'Triggers change callback');
  129. return false;
  130. }
  131. },
  132. fu = $('#fileupload').fileupload(options),
  133. fileInput = fu.fileupload('option', 'fileInput'),
  134. dropZone = fu.fileupload('option', 'dropZone'),
  135. pasteZone = fu.fileupload('option', 'pasteZone');
  136. dropZone.bind('dragover', options.dragover);
  137. dropZone.bind('drop', options.drop);
  138. pasteZone.bind('paste', options.paste);
  139. fileInput.bind('change', options.change);
  140. fu.fileupload('destroy');
  141. fileInput.trigger($.Event('change', eo));
  142. dropZone.trigger($.Event('dragover', eo));
  143. dropZone.trigger($.Event('drop', eo));
  144. pasteZone.trigger($.Event('paste', eo));
  145. });
  146. test('disable/enable', function () {
  147. expect(
  148. $.support.xhrFormDataFileUpload ? 4 : 1
  149. );
  150. var eo = {originalEvent: {}},
  151. fu = $('#fileupload').fileupload({
  152. dragover: function () {
  153. ok(true, 'Triggers dragover callback');
  154. return false;
  155. },
  156. drop: function () {
  157. ok(true, 'Triggers drop callback');
  158. return false;
  159. },
  160. paste: function () {
  161. ok(true, 'Triggers paste callback');
  162. return false;
  163. },
  164. change: function () {
  165. ok(true, 'Triggers change callback');
  166. return false;
  167. }
  168. }),
  169. fileInput = fu.fileupload('option', 'fileInput'),
  170. dropZone = fu.fileupload('option', 'dropZone'),
  171. pasteZone = fu.fileupload('option', 'pasteZone');
  172. fu.fileupload('disable');
  173. fileInput.trigger($.Event('change', eo));
  174. dropZone.trigger($.Event('dragover', eo));
  175. dropZone.trigger($.Event('drop', eo));
  176. pasteZone.trigger($.Event('paste', eo));
  177. fu.fileupload('enable');
  178. fileInput.trigger($.Event('change', eo));
  179. dropZone.trigger($.Event('dragover', eo));
  180. dropZone.trigger($.Event('drop', eo));
  181. pasteZone.trigger($.Event('paste', eo));
  182. });
  183. test('option', function () {
  184. expect(
  185. $.support.xhrFormDataFileUpload ? 10 : 7
  186. );
  187. var eo = {originalEvent: {}},
  188. fu = $('#fileupload').fileupload({
  189. dragover: function () {
  190. ok(true, 'Triggers dragover callback');
  191. return false;
  192. },
  193. drop: function () {
  194. ok(true, 'Triggers drop callback');
  195. return false;
  196. },
  197. paste: function () {
  198. ok(true, 'Triggers paste callback');
  199. return false;
  200. },
  201. change: function () {
  202. ok(true, 'Triggers change callback');
  203. return false;
  204. }
  205. }),
  206. fileInput = fu.fileupload('option', 'fileInput'),
  207. dropZone = fu.fileupload('option', 'dropZone'),
  208. pasteZone = fu.fileupload('option', 'pasteZone');
  209. fu.fileupload('option', 'fileInput', null);
  210. fu.fileupload('option', 'dropZone', null);
  211. fu.fileupload('option', 'pasteZone', null);
  212. fileInput.trigger($.Event('change', eo));
  213. dropZone.trigger($.Event('dragover', eo));
  214. dropZone.trigger($.Event('drop', eo));
  215. pasteZone.trigger($.Event('paste', eo));
  216. fu.fileupload('option', 'dropZone', 'body');
  217. strictEqual(
  218. fu.fileupload('option', 'dropZone')[0],
  219. document.body,
  220. 'Allow a query string as parameter for the dropZone option'
  221. );
  222. fu.fileupload('option', 'dropZone', document);
  223. strictEqual(
  224. fu.fileupload('option', 'dropZone')[0],
  225. document,
  226. 'Allow a document element as parameter for the dropZone option'
  227. );
  228. fu.fileupload('option', 'pasteZone', 'body');
  229. strictEqual(
  230. fu.fileupload('option', 'pasteZone')[0],
  231. document.body,
  232. 'Allow a query string as parameter for the pasteZone option'
  233. );
  234. fu.fileupload('option', 'pasteZone', document);
  235. strictEqual(
  236. fu.fileupload('option', 'pasteZone')[0],
  237. document,
  238. 'Allow a document element as parameter for the pasteZone option'
  239. );
  240. fu.fileupload('option', 'fileInput', ':file');
  241. strictEqual(
  242. fu.fileupload('option', 'fileInput')[0],
  243. $(':file')[0],
  244. 'Allow a query string as parameter for the fileInput option'
  245. );
  246. fu.fileupload('option', 'fileInput', $(':file')[0]);
  247. strictEqual(
  248. fu.fileupload('option', 'fileInput')[0],
  249. $(':file')[0],
  250. 'Allow a document element as parameter for the fileInput option'
  251. );
  252. fu.fileupload('option', 'fileInput', fileInput);
  253. fu.fileupload('option', 'dropZone', dropZone);
  254. fu.fileupload('option', 'pasteZone', pasteZone);
  255. fileInput.trigger($.Event('change', eo));
  256. dropZone.trigger($.Event('dragover', eo));
  257. dropZone.trigger($.Event('drop', eo));
  258. pasteZone.trigger($.Event('paste', eo));
  259. });
  260. asyncTest('add', function () {
  261. expect(2);
  262. var param = {files: [{name: 'test'}]};
  263. $('#fileupload').fileupload({
  264. add: function (e, data) {
  265. strictEqual(
  266. data.files[0].name,
  267. param.files[0].name,
  268. 'Triggers add callback'
  269. );
  270. }
  271. }).fileupload('add', param).fileupload(
  272. 'option',
  273. 'add',
  274. function (e, data) {
  275. data.submit().complete(function () {
  276. ok(true, 'data.submit() Returns a jqXHR object');
  277. start();
  278. });
  279. }
  280. ).fileupload('add', param);
  281. });
  282. asyncTest('send', function () {
  283. expect(3);
  284. var param = {files: [{name: 'test'}]};
  285. $('#fileupload').fileupload({
  286. send: function (e, data) {
  287. strictEqual(
  288. data.files[0].name,
  289. 'test',
  290. 'Triggers send callback'
  291. );
  292. }
  293. }).fileupload('send', param).fail(function () {
  294. ok(true, 'Allows to abort the request');
  295. }).complete(function () {
  296. ok(true, 'Returns a jqXHR object');
  297. start();
  298. }).abort();
  299. });
  300. module('Callbacks', lifecycle);
  301. asyncTest('add', function () {
  302. expect(1);
  303. var param = {files: [{name: 'test'}]};
  304. $('#fileupload').fileupload({
  305. add: function (e, data) {
  306. ok(true, 'Triggers add callback');
  307. start();
  308. }
  309. }).fileupload('add', param);
  310. });
  311. asyncTest('submit', function () {
  312. expect(1);
  313. var param = {files: [{name: 'test'}]};
  314. $('#fileupload').fileupload({
  315. submit: function (e, data) {
  316. ok(true, 'Triggers submit callback');
  317. start();
  318. return false;
  319. }
  320. }).fileupload('add', param);
  321. });
  322. asyncTest('send', function () {
  323. expect(1);
  324. var param = {files: [{name: 'test'}]};
  325. $('#fileupload').fileupload({
  326. send: function (e, data) {
  327. ok(true, 'Triggers send callback');
  328. start();
  329. return false;
  330. }
  331. }).fileupload('send', param);
  332. });
  333. asyncTest('done', function () {
  334. expect(1);
  335. var param = {files: [{name: 'test'}]};
  336. $('#fileupload').fileupload({
  337. done: function (e, data) {
  338. ok(true, 'Triggers done callback');
  339. start();
  340. }
  341. }).fileupload('send', param);
  342. });
  343. asyncTest('fail', function () {
  344. expect(1);
  345. var param = {files: [{name: 'test'}]},
  346. fu = $('#fileupload').fileupload({
  347. url: '404',
  348. fail: function (e, data) {
  349. ok(true, 'Triggers fail callback');
  350. start();
  351. }
  352. });
  353. (fu.data('blueimp-fileupload') || fu.data('fileupload'))
  354. ._isXHRUpload = function () {
  355. return true;
  356. };
  357. fu.fileupload('send', param);
  358. });
  359. asyncTest('always', function () {
  360. expect(2);
  361. var param = {files: [{name: 'test'}]},
  362. counter = 0,
  363. fu = $('#fileupload').fileupload({
  364. always: function (e, data) {
  365. ok(true, 'Triggers always callback');
  366. if (counter === 1) {
  367. start();
  368. } else {
  369. counter += 1;
  370. }
  371. }
  372. });
  373. (fu.data('blueimp-fileupload') || fu.data('fileupload'))
  374. ._isXHRUpload = function () {
  375. return true;
  376. };
  377. fu.fileupload('add', param).fileupload(
  378. 'option',
  379. 'url',
  380. '404'
  381. ).fileupload('add', param);
  382. });
  383. asyncTest('progress', function () {
  384. expect(1);
  385. var param = {files: [{name: 'test'}]},
  386. counter = 0;
  387. $('#fileupload').fileupload({
  388. forceIframeTransport: true,
  389. progress: function (e, data) {
  390. ok(true, 'Triggers progress callback');
  391. if (counter === 0) {
  392. start();
  393. } else {
  394. counter += 1;
  395. }
  396. }
  397. }).fileupload('send', param);
  398. });
  399. asyncTest('progressall', function () {
  400. expect(1);
  401. var param = {files: [{name: 'test'}]},
  402. counter = 0;
  403. $('#fileupload').fileupload({
  404. forceIframeTransport: true,
  405. progressall: function (e, data) {
  406. ok(true, 'Triggers progressall callback');
  407. if (counter === 0) {
  408. start();
  409. } else {
  410. counter += 1;
  411. }
  412. }
  413. }).fileupload('send', param);
  414. });
  415. asyncTest('start', function () {
  416. expect(1);
  417. var param = {files: [{name: '1'}, {name: '2'}]},
  418. active = 0;
  419. $('#fileupload').fileupload({
  420. send: function (e, data) {
  421. active += 1;
  422. },
  423. start: function (e, data) {
  424. ok(!active, 'Triggers start callback before uploads');
  425. start();
  426. }
  427. }).fileupload('send', param);
  428. });
  429. asyncTest('stop', function () {
  430. expect(1);
  431. var param = {files: [{name: '1'}, {name: '2'}]},
  432. active = 0;
  433. $('#fileupload').fileupload({
  434. send: function (e, data) {
  435. active += 1;
  436. },
  437. always: function (e, data) {
  438. active -= 1;
  439. },
  440. stop: function (e, data) {
  441. ok(!active, 'Triggers stop callback after uploads');
  442. start();
  443. }
  444. }).fileupload('send', param);
  445. });
  446. test('change', function () {
  447. var fu = $('#fileupload').fileupload(),
  448. fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'),
  449. fileInput = fu.fileupload('option', 'fileInput');
  450. expect(2);
  451. fu.fileupload({
  452. change: function (e, data) {
  453. ok(true, 'Triggers change callback');
  454. strictEqual(
  455. data.files.length,
  456. 0,
  457. 'Returns empty files list'
  458. );
  459. },
  460. add: $.noop
  461. });
  462. fuo._onChange({
  463. data: {fileupload: fuo},
  464. target: fileInput[0]
  465. });
  466. });
  467. test('paste', function () {
  468. var fu = $('#fileupload').fileupload(),
  469. fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
  470. expect(1);
  471. fu.fileupload({
  472. paste: function (e, data) {
  473. ok(true, 'Triggers paste callback');
  474. },
  475. add: $.noop
  476. });
  477. fuo._onPaste({
  478. data: {fileupload: fuo},
  479. originalEvent: {clipboardData: {}},
  480. preventDefault: $.noop
  481. });
  482. });
  483. test('drop', function () {
  484. var fu = $('#fileupload').fileupload(),
  485. fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
  486. expect(1);
  487. fu.fileupload({
  488. drop: function (e, data) {
  489. ok(true, 'Triggers drop callback');
  490. },
  491. add: $.noop
  492. });
  493. fuo._onDrop({
  494. data: {fileupload: fuo},
  495. originalEvent: {dataTransfer: {}},
  496. preventDefault: $.noop
  497. });
  498. });
  499. test('dragover', function () {
  500. var fu = $('#fileupload').fileupload(),
  501. fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
  502. expect(1);
  503. fu.fileupload({
  504. dragover: function (e, data) {
  505. ok(true, 'Triggers dragover callback');
  506. },
  507. add: $.noop
  508. });
  509. fuo._onDragOver({
  510. data: {fileupload: fuo},
  511. originalEvent: {dataTransfer: {}},
  512. preventDefault: $.noop
  513. });
  514. });
  515. module('Options', lifecycle);
  516. test('paramName', function () {
  517. expect(1);
  518. var param = {files: [{name: 'test'}]};
  519. $('#fileupload').fileupload({
  520. paramName: null,
  521. send: function (e, data) {
  522. strictEqual(
  523. data.paramName[0],
  524. data.fileInput.prop('name'),
  525. 'Takes paramName from file input field if not set'
  526. );
  527. return false;
  528. }
  529. }).fileupload('send', param);
  530. });
  531. test('url', function () {
  532. expect(1);
  533. var param = {files: [{name: 'test'}]};
  534. $('#fileupload').fileupload({
  535. url: null,
  536. send: function (e, data) {
  537. strictEqual(
  538. data.url,
  539. $(data.fileInput.prop('form')).prop('action'),
  540. 'Takes url from form action if not set'
  541. );
  542. return false;
  543. }
  544. }).fileupload('send', param);
  545. });
  546. test('type', function () {
  547. expect(2);
  548. var param = {files: [{name: 'test'}]};
  549. $('#fileupload').fileupload({
  550. type: null,
  551. send: function (e, data) {
  552. strictEqual(
  553. data.type,
  554. 'POST',
  555. 'Request type is "POST" if not set to "PUT"'
  556. );
  557. return false;
  558. }
  559. }).fileupload('send', param);
  560. $('#fileupload').fileupload({
  561. type: 'PUT',
  562. send: function (e, data) {
  563. strictEqual(
  564. data.type,
  565. 'PUT',
  566. 'Request type is "PUT" if set to "PUT"'
  567. );
  568. return false;
  569. }
  570. }).fileupload('send', param);
  571. });
  572. test('replaceFileInput', function () {
  573. var fu = $('#fileupload').fileupload(),
  574. fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'),
  575. fileInput = fu.fileupload('option', 'fileInput'),
  576. fileInputElement = fileInput[0];
  577. expect(2);
  578. fu.fileupload({
  579. replaceFileInput: false,
  580. change: function (e, data) {
  581. strictEqual(
  582. fu.fileupload('option', 'fileInput')[0],
  583. fileInputElement,
  584. 'Keeps file input with replaceFileInput: false'
  585. );
  586. },
  587. add: $.noop
  588. });
  589. fuo._onChange({
  590. data: {fileupload: fuo},
  591. target: fileInput[0]
  592. });
  593. fu.fileupload({
  594. replaceFileInput: true,
  595. change: function (e, data) {
  596. notStrictEqual(
  597. fu.fileupload('option', 'fileInput')[0],
  598. fileInputElement,
  599. 'Replaces file input with replaceFileInput: true'
  600. );
  601. },
  602. add: $.noop
  603. });
  604. fuo._onChange({
  605. data: {fileupload: fuo},
  606. target: fileInput[0]
  607. });
  608. });
  609. asyncTest('forceIframeTransport', function () {
  610. expect(1);
  611. var param = {files: [{name: 'test'}]};
  612. $('#fileupload').fileupload({
  613. forceIframeTransport: true,
  614. done: function (e, data) {
  615. strictEqual(
  616. data.dataType.substr(0, 6),
  617. 'iframe',
  618. 'Iframe Transport is used'
  619. );
  620. start();
  621. }
  622. }).fileupload('send', param);
  623. });
  624. test('singleFileUploads', function () {
  625. expect(3);
  626. var fu = $('#fileupload').fileupload(),
  627. param = {files: [{name: '1'}, {name: '2'}]},
  628. index = 1;
  629. (fu.data('blueimp-fileupload') || fu.data('fileupload'))
  630. ._isXHRUpload = function () {
  631. return true;
  632. };
  633. $('#fileupload').fileupload({
  634. singleFileUploads: true,
  635. add: function (e, data) {
  636. ok(true, 'Triggers callback number ' + index.toString());
  637. index += 1;
  638. }
  639. }).fileupload('add', param).fileupload(
  640. 'option',
  641. 'singleFileUploads',
  642. false
  643. ).fileupload('add', param);
  644. });
  645. test('limitMultiFileUploads', function () {
  646. expect(3);
  647. var fu = $('#fileupload').fileupload(),
  648. param = {files: [
  649. {name: '1'},
  650. {name: '2'},
  651. {name: '3'},
  652. {name: '4'},
  653. {name: '5'}
  654. ]},
  655. index = 1;
  656. (fu.data('blueimp-fileupload') || fu.data('fileupload'))
  657. ._isXHRUpload = function () {
  658. return true;
  659. };
  660. $('#fileupload').fileupload({
  661. singleFileUploads: false,
  662. limitMultiFileUploads: 2,
  663. add: function (e, data) {
  664. ok(true, 'Triggers callback number ' + index.toString());
  665. index += 1;
  666. }
  667. }).fileupload('add', param);
  668. });
  669. asyncTest('sequentialUploads', function () {
  670. expect(6);
  671. var param = {files: [
  672. {name: '1'},
  673. {name: '2'},
  674. {name: '3'},
  675. {name: '4'},
  676. {name: '5'},
  677. {name: '6'}
  678. ]},
  679. addIndex = 0,
  680. sendIndex = 0,
  681. loadIndex = 0,
  682. fu = $('#fileupload').fileupload({
  683. sequentialUploads: true,
  684. add: function (e, data) {
  685. addIndex += 1;
  686. if (addIndex === 4) {
  687. data.submit().abort();
  688. } else {
  689. data.submit();
  690. }
  691. },
  692. send: function (e, data) {
  693. sendIndex += 1;
  694. },
  695. done: function (e, data) {
  696. loadIndex += 1;
  697. strictEqual(sendIndex, loadIndex, 'upload in order');
  698. },
  699. fail: function (e, data) {
  700. strictEqual(data.errorThrown, 'abort', 'upload aborted');
  701. },
  702. stop: function (e) {
  703. start();
  704. }
  705. });
  706. (fu.data('blueimp-fileupload') || fu.data('fileupload'))
  707. ._isXHRUpload = function () {
  708. return true;
  709. };
  710. fu.fileupload('add', param);
  711. });
  712. asyncTest('limitConcurrentUploads', function () {
  713. expect(12);
  714. var param = {files: [
  715. {name: '1'},
  716. {name: '2'},
  717. {name: '3'},
  718. {name: '4'},
  719. {name: '5'},
  720. {name: '6'},
  721. {name: '7'},
  722. {name: '8'},
  723. {name: '9'},
  724. {name: '10'},
  725. {name: '11'},
  726. {name: '12'}
  727. ]},
  728. addIndex = 0,
  729. sendIndex = 0,
  730. loadIndex = 0,
  731. fu = $('#fileupload').fileupload({
  732. limitConcurrentUploads: 3,
  733. add: function (e, data) {
  734. addIndex += 1;
  735. if (addIndex === 4) {
  736. data.submit().abort();
  737. } else {
  738. data.submit();
  739. }
  740. },
  741. send: function (e, data) {
  742. sendIndex += 1;
  743. },
  744. done: function (e, data) {
  745. loadIndex += 1;
  746. ok(sendIndex - loadIndex < 3);
  747. },
  748. fail: function (e, data) {
  749. strictEqual(data.errorThrown, 'abort', 'upload aborted');
  750. },
  751. stop: function (e) {
  752. start();
  753. }
  754. });
  755. (fu.data('blueimp-fileupload') || fu.data('fileupload'))
  756. ._isXHRUpload = function () {
  757. return true;
  758. };
  759. fu.fileupload('add', param);
  760. });
  761. if ($.support.xhrFileUpload) {
  762. asyncTest('multipart', function () {
  763. expect(2);
  764. var param = {files: [{
  765. name: 'test.png',
  766. size: 123,
  767. type: 'image/png'
  768. }]},
  769. fu = $('#fileupload').fileupload({
  770. multipart: false,
  771. always: function (e, data) {
  772. strictEqual(
  773. data.contentType,
  774. param.files[0].type,
  775. 'non-multipart upload sets file type as contentType'
  776. );
  777. strictEqual(
  778. data.headers['Content-Disposition'],
  779. 'attachment; filename="' + param.files[0].name + '"',
  780. 'non-multipart upload sets Content-Disposition header'
  781. );
  782. start();
  783. }
  784. });
  785. fu.fileupload('send', param);
  786. });
  787. }
  788. module('UI Initialization', lifecycleUI);
  789. test('Widget initialization', function () {
  790. var fu = $('#fileupload').fileupload();
  791. ok(fu.data('blueimp-fileupload') || fu.data('fileupload'));
  792. ok(
  793. $('#fileupload').fileupload('option', 'uploadTemplate').length,
  794. 'Initialized upload template'
  795. );
  796. ok(
  797. $('#fileupload').fileupload('option', 'downloadTemplate').length,
  798. 'Initialized download template'
  799. );
  800. });
  801. test('Buttonbar event listeners', function () {
  802. var buttonbar = $('#fileupload .fileupload-buttonbar'),
  803. files = [{name: 'test'}];
  804. expect(4);
  805. $('#fileupload').fileupload({
  806. send: function (e, data) {
  807. ok(true, 'Started file upload via global start button');
  808. },
  809. fail: function (e, data) {
  810. ok(true, 'Canceled file upload via global cancel button');
  811. data.context.remove();
  812. },
  813. destroy: function (e, data) {
  814. ok(true, 'Delete action called via global delete button');
  815. }
  816. });
  817. $('#fileupload').fileupload('add', {files: files});
  818. buttonbar.find('.cancel').click();
  819. $('#fileupload').fileupload('add', {files: files});
  820. buttonbar.find('.start').click();
  821. buttonbar.find('.cancel').click();
  822. ($('#fileupload').data('blueimp-fileupload') ||
  823. $('#fileupload').data('fileupload'))
  824. ._renderDownload(files)
  825. .appendTo($('#fileupload .files')).show()
  826. .find('.delete input').click();
  827. buttonbar.find('.delete').click();
  828. });
  829. module('UI API', lifecycleUI);
  830. test('destroy', function () {
  831. var buttonbar = $('#fileupload .fileupload-buttonbar'),
  832. files = [{name: 'test'}];
  833. expect(1);
  834. $('#fileupload').fileupload({
  835. send: function (e, data) {
  836. ok(true, 'This test should not run');
  837. return false;
  838. }
  839. })
  840. .fileupload('add', {files: files})
  841. .fileupload('destroy');
  842. buttonbar.find('.start').click(function () {
  843. ok(true, 'Clicked global start button');
  844. return false;
  845. }).click();
  846. });
  847. test('disable/enable', function () {
  848. var buttonbar = $('#fileupload .fileupload-buttonbar');
  849. $('#fileupload').fileupload();
  850. $('#fileupload').fileupload('disable');
  851. strictEqual(
  852. buttonbar.find('input[type=file], button').not(':disabled').length,
  853. 0,
  854. 'Disables the buttonbar buttons'
  855. );
  856. $('#fileupload').fileupload('enable');
  857. strictEqual(
  858. buttonbar.find('input[type=file], button').not(':disabled').length,
  859. 4,
  860. 'Enables the buttonbar buttons'
  861. );
  862. });
  863. module('UI Callbacks', lifecycleUI);
  864. test('destroy', function () {
  865. expect(3);
  866. $('#fileupload').fileupload({
  867. destroy: function (e, data) {
  868. ok(true, 'Triggers destroy callback');
  869. strictEqual(
  870. data.url,
  871. 'test',
  872. 'Passes over deletion url parameter'
  873. );
  874. strictEqual(
  875. data.type,
  876. 'DELETE',
  877. 'Passes over deletion request type parameter'
  878. );
  879. }
  880. });
  881. ($('#fileupload').data('blueimp-fileupload') ||
  882. $('#fileupload').data('fileupload'))
  883. ._renderDownload([{
  884. name: 'test',
  885. delete_url: 'test',
  886. delete_type: 'DELETE'
  887. }])
  888. .appendTo($('#fileupload .files'))
  889. .show()
  890. .find('.delete input').click();
  891. $('#fileupload .fileupload-buttonbar .delete').click();
  892. });
  893. asyncTest('added', function () {
  894. expect(1);
  895. var param = {files: [{name: 'test'}]};
  896. $('#fileupload').fileupload({
  897. added: function (e, data) {
  898. start();
  899. strictEqual(
  900. data.files[0].name,
  901. param.files[0].name,
  902. 'Triggers added callback'
  903. );
  904. },
  905. send: function () {
  906. return false;
  907. }
  908. }).fileupload('add', param);
  909. });
  910. asyncTest('started', function () {
  911. expect(1);
  912. var param = {files: [{name: 'test'}]};
  913. $('#fileupload').fileupload({
  914. started: function (e) {
  915. start();
  916. ok('Triggers started callback');
  917. return false;
  918. },
  919. sent: function (e, data) {
  920. return false;
  921. }
  922. }).fileupload('send', param);
  923. });
  924. asyncTest('sent', function () {
  925. expect(1);
  926. var param = {files: [{name: 'test'}]};
  927. $('#fileupload').fileupload({
  928. sent: function (e, data) {
  929. start();
  930. strictEqual(
  931. data.files[0].name,
  932. param.files[0].name,
  933. 'Triggers sent callback'
  934. );
  935. return false;
  936. }
  937. }).fileupload('send', param);
  938. });
  939. asyncTest('completed', function () {
  940. expect(1);
  941. var param = {files: [{name: 'test'}]};
  942. $('#fileupload').fileupload({
  943. completed: function (e, data) {
  944. start();
  945. ok('Triggers completed callback');
  946. return false;
  947. }
  948. }).fileupload('send', param);
  949. });
  950. asyncTest('failed', function () {
  951. expect(1);
  952. var param = {files: [{name: 'test'}]};
  953. $('#fileupload').fileupload({
  954. failed: function (e, data) {
  955. start();
  956. ok('Triggers failed callback');
  957. return false;
  958. }
  959. }).fileupload('send', param).abort();
  960. });
  961. asyncTest('stopped', function () {
  962. expect(1);
  963. var param = {files: [{name: 'test'}]};
  964. $('#fileupload').fileupload({
  965. stopped: function (e, data) {
  966. start();
  967. ok('Triggers stopped callback');
  968. return false;
  969. }
  970. }).fileupload('send', param);
  971. });
  972. asyncTest('destroyed', function () {
  973. expect(1);
  974. $('#fileupload').fileupload({
  975. destroyed: function (e, data) {
  976. start();
  977. ok(true, 'Triggers destroyed callback');
  978. }
  979. });
  980. ($('#fileupload').data('blueimp-fileupload') ||
  981. $('#fileupload').data('fileupload'))
  982. ._renderDownload([{
  983. name: 'test',
  984. delete_url: 'test',
  985. delete_type: 'DELETE'
  986. }])
  987. .appendTo($('#fileupload .files'))
  988. .show()
  989. .find('.delete input').click();
  990. $('#fileupload .fileupload-buttonbar .delete').click();
  991. });
  992. module('UI Options', lifecycleUI);
  993. test('autoUpload', function () {
  994. expect(1);
  995. $('#fileupload')
  996. .fileupload({
  997. autoUpload: true,
  998. send: function (e, data) {
  999. ok(true, 'Started file upload automatically');
  1000. return false;
  1001. }
  1002. })
  1003. .fileupload('add', {files: [{name: 'test'}]})
  1004. .fileupload('option', 'autoUpload', false)
  1005. .fileupload('add', {files: [{name: 'test'}]});
  1006. });
  1007. test('maxNumberOfFiles', function () {
  1008. expect(4);
  1009. var addIndex = 0,
  1010. sendIndex = 0;
  1011. $('#fileupload')
  1012. .fileupload({
  1013. autoUpload: true,
  1014. maxNumberOfFiles: 1,
  1015. singleFileUploads: false,
  1016. send: function (e, data) {
  1017. strictEqual(
  1018. sendIndex += 1,
  1019. addIndex
  1020. );
  1021. },
  1022. progress: $.noop,
  1023. progressall: $.noop,
  1024. done: $.noop,
  1025. stop: $.noop
  1026. })
  1027. .fileupload('add', {files: [{name: (addIndex += 1)}]})
  1028. .fileupload('add', {files: [{name: 'test'}]})
  1029. .fileupload('option', 'maxNumberOfFiles', 1)
  1030. .fileupload('add', {files: [{name: 1}, {name: 2}]})
  1031. .fileupload({
  1032. maxNumberOfFiles: 1,
  1033. send: function (e, data) {
  1034. strictEqual(
  1035. sendIndex += 1,
  1036. addIndex
  1037. );
  1038. return false;
  1039. }
  1040. })
  1041. .fileupload('add', {files: [{name: (addIndex += 1)}]})
  1042. .fileupload('add', {files: [{name: (addIndex += 1)}]})
  1043. .fileupload({
  1044. maxNumberOfFiles: 0,
  1045. send: function (e, data) {
  1046. ok(
  1047. !$.blueimp.fileupload.prototype.options
  1048. .send.call(this, e, data)
  1049. );
  1050. return false;
  1051. }
  1052. })
  1053. .fileupload('send', {files: [{name: 'test'}]});
  1054. });
  1055. test('maxFileSize', function () {
  1056. expect(3);
  1057. var addIndex = 0,
  1058. sendIndex = 0;
  1059. $('#fileupload')
  1060. .fileupload({
  1061. autoUpload: true,
  1062. maxFileSize: 1000,
  1063. send: function (e, data) {
  1064. strictEqual(
  1065. sendIndex += 1,
  1066. addIndex
  1067. );
  1068. return false;
  1069. }
  1070. })
  1071. .fileupload('add', {files: [{
  1072. name: (addIndex += 1)
  1073. }]})
  1074. .fileupload('add', {files: [{
  1075. name: (addIndex += 1),
  1076. size: 999
  1077. }]})
  1078. .fileupload('add', {files: [{
  1079. name: 'test',
  1080. size: 1001
  1081. }]})
  1082. .fileupload({
  1083. send: function (e, data) {
  1084. ok(
  1085. !$.blueimp.fileupload.prototype.options
  1086. .send.call(this, e, data)
  1087. );
  1088. return false;
  1089. }
  1090. })
  1091. .fileupload('send', {files: [{
  1092. name: 'test',
  1093. size: 1001
  1094. }]});
  1095. });
  1096. test('minFileSize', function () {
  1097. expect(3);
  1098. var addIndex = 0,
  1099. sendIndex = 0;
  1100. $('#fileupload')
  1101. .fileupload({
  1102. autoUpload: true,
  1103. minFileSize: 1000,
  1104. send: function (e, data) {
  1105. strictEqual(
  1106. sendIndex += 1,
  1107. addIndex
  1108. );
  1109. return false;
  1110. }
  1111. })
  1112. .fileupload('add', {files: [{
  1113. name: (addIndex += 1)
  1114. }]})
  1115. .fileupload('add', {files: [{
  1116. name: (addIndex += 1),
  1117. size: 1001
  1118. }]})
  1119. .fileupload('add', {files: [{
  1120. name: 'test',
  1121. size: 999
  1122. }]})
  1123. .fileupload({
  1124. send: function (e, data) {
  1125. ok(
  1126. !$.blueimp.fileupload.prototype.options
  1127. .send.call(this, e, data)
  1128. );
  1129. return false;
  1130. }
  1131. })
  1132. .fileupload('send', {files: [{
  1133. name: 'test',
  1134. size: 999
  1135. }]});
  1136. });
  1137. test('acceptFileTypes', function () {
  1138. expect(3);
  1139. var addIndex = 0,
  1140. sendIndex = 0;
  1141. $('#fileupload')
  1142. .fileupload({
  1143. autoUpload: true,
  1144. acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
  1145. previewFileTypes: /none/,
  1146. send: function (e, data) {
  1147. strictEqual(
  1148. sendIndex += 1,
  1149. addIndex
  1150. );
  1151. return false;
  1152. }
  1153. })
  1154. .fileupload('add', {files: [{
  1155. name: (addIndex += 1) + '.jpg'
  1156. }]})
  1157. .fileupload('add', {files: [{
  1158. name: (addIndex += 1),
  1159. type: 'image/jpeg'
  1160. }]})
  1161. .fileupload('add', {files: [{
  1162. name: 'test.txt',
  1163. type: 'text/plain'
  1164. }]})
  1165. .fileupload({
  1166. send: function (e, data) {
  1167. ok(
  1168. !$.blueimp.fileupload.prototype.options
  1169. .send.call(this, e, data)
  1170. );
  1171. return false;
  1172. }
  1173. })
  1174. .fileupload('send', {files: [{
  1175. name: 'test.txt',
  1176. type: 'text/plain'
  1177. }]});
  1178. });
  1179. test('acceptFileTypes as HTML5 data attribute', function () {
  1180. expect(2);
  1181. var regExp = /(\.|\/)(gif|jpe?g|png)$/i;
  1182. $('#fileupload')
  1183. .attr('data-accept-file-types', regExp.toString())
  1184. .fileupload();
  1185. strictEqual(
  1186. $.type($('#fileupload').fileupload('option', 'acceptFileTypes')),
  1187. $.type(regExp)
  1188. );
  1189. strictEqual(
  1190. $('#fileupload').fileupload('option', 'acceptFileTypes').toString(),
  1191. regExp.toString()
  1192. );
  1193. });
  1194. });