/complaints-card/target/complaints-card/WEB-INF/resources/js/jquery-file-upload/test/test.js

https://bitbucket.org/asergeev1970/complaints · JavaScript · 1242 lines · 1159 code · 66 blank · 17 comment · 21 complexity · c150ebfc777f154bb4b248a69889ea94 MD5 · raw file

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