/tests/tests.js

https://github.com/bangnaga/jQuery-File-Upload · JavaScript · 1093 lines · 1018 code · 56 blank · 19 comment · 14 complexity · 27bd8a8b62055684e48a1f7e76f25bc5 MD5 · raw file

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