/* * jQuery File Upload Plugin Test 9.4.1 * https://github.com/blueimp/jQuery-File-Upload * * Copyright 2010, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ /* global $, QUnit, window, document, expect, module, test, asyncTest, start, ok, strictEqual, notStrictEqual */ $(function () { // jshint nomen:false 'use strict'; QUnit.done = function () { // Delete all uploaded files: var url = $('#fileupload').prop('action'); $.getJSON(url, function (result) { $.each(result.files, function (index, file) { $.ajax({ url: url + '?file=' + encodeURIComponent(file.name), type: 'DELETE' }); }); }); }; var lifecycle = { setup: function () { // Set the .fileupload method to the basic widget method: $.widget('blueimp.fileupload', window.testBasicWidget, {}); }, teardown: function () { // Remove all remaining event listeners: $(document).unbind(); } }, lifecycleUI = { setup: function () { // Set the .fileupload method to the UI widget method: $.widget('blueimp.fileupload', window.testUIWidget, {}); }, teardown: function () { // Remove all remaining event listeners: $(document).unbind(); } }; module('Initialization', lifecycle); test('Widget initialization', function () { var fu = $('#fileupload').fileupload(); ok(fu.data('blueimp-fileupload') || fu.data('fileupload')); }); test('Data attribute options', function () { $('#fileupload').attr('data-url', 'http://example.org'); $('#fileupload').fileupload(); strictEqual( $('#fileupload').fileupload('option', 'url'), 'http://example.org' ); }); test('File input initialization', function () { var fu = $('#fileupload').fileupload(); ok( fu.fileupload('option', 'fileInput').length, 'File input field inside of the widget' ); ok( fu.fileupload('option', 'fileInput').length, 'Widget element as file input field' ); }); test('Drop zone initialization', function () { ok($('#fileupload').fileupload() .fileupload('option', 'dropZone').length); }); test('Paste zone initialization', function () { ok($('#fileupload').fileupload({pasteZone: document}) .fileupload('option', 'pasteZone').length); }); test('Event listeners initialization', function () { expect( $.support.xhrFormDataFileUpload ? 4 : 1 ); var eo = { originalEvent: { dataTransfer: {files: [{}], types: ['Files']}, clipboardData: {items: [{}]} } }, fu = $('#fileupload').fileupload({ pasteZone: document, dragover: function () { ok(true, 'Triggers dragover callback'); return false; }, drop: function () { ok(true, 'Triggers drop callback'); return false; }, paste: function () { ok(true, 'Triggers paste callback'); return false; }, change: function () { ok(true, 'Triggers change callback'); return false; } }), fileInput = fu.fileupload('option', 'fileInput'), dropZone = fu.fileupload('option', 'dropZone'), pasteZone = fu.fileupload('option', 'pasteZone'); fileInput.trigger($.Event('change', eo)); dropZone.trigger($.Event('dragover', eo)); dropZone.trigger($.Event('drop', eo)); pasteZone.trigger($.Event('paste', eo)); }); module('API', lifecycle); test('destroy', function () { expect(4); var eo = { originalEvent: { dataTransfer: {files: [{}], types: ['Files']}, clipboardData: {items: [{}]} } }, options = { pasteZone: document, dragover: function () { ok(true, 'Triggers dragover callback'); return false; }, drop: function () { ok(true, 'Triggers drop callback'); return false; }, paste: function () { ok(true, 'Triggers paste callback'); return false; }, change: function () { ok(true, 'Triggers change callback'); return false; } }, fu = $('#fileupload').fileupload(options), fileInput = fu.fileupload('option', 'fileInput'), dropZone = fu.fileupload('option', 'dropZone'), pasteZone = fu.fileupload('option', 'pasteZone'); dropZone.bind('dragover', options.dragover); dropZone.bind('drop', options.drop); pasteZone.bind('paste', options.paste); fileInput.bind('change', options.change); fu.fileupload('destroy'); fileInput.trigger($.Event('change', eo)); dropZone.trigger($.Event('dragover', eo)); dropZone.trigger($.Event('drop', eo)); pasteZone.trigger($.Event('paste', eo)); }); test('disable/enable', function () { expect( $.support.xhrFormDataFileUpload ? 4 : 1 ); var eo = { originalEvent: { dataTransfer: {files: [{}], types: ['Files']}, clipboardData: {items: [{}]} } }, fu = $('#fileupload').fileupload({ pasteZone: document, dragover: function () { ok(true, 'Triggers dragover callback'); return false; }, drop: function () { ok(true, 'Triggers drop callback'); return false; }, paste: function () { ok(true, 'Triggers paste callback'); return false; }, change: function () { ok(true, 'Triggers change callback'); return false; } }), fileInput = fu.fileupload('option', 'fileInput'), dropZone = fu.fileupload('option', 'dropZone'), pasteZone = fu.fileupload('option', 'pasteZone'); fu.fileupload('disable'); fileInput.trigger($.Event('change', eo)); dropZone.trigger($.Event('dragover', eo)); dropZone.trigger($.Event('drop', eo)); pasteZone.trigger($.Event('paste', eo)); fu.fileupload('enable'); fileInput.trigger($.Event('change', eo)); dropZone.trigger($.Event('dragover', eo)); dropZone.trigger($.Event('drop', eo)); pasteZone.trigger($.Event('paste', eo)); }); test('option', function () { expect( $.support.xhrFormDataFileUpload ? 10 : 7 ); var eo = { originalEvent: { dataTransfer: {files: [{}], types: ['Files']}, clipboardData: {items: [{}]} } }, fu = $('#fileupload').fileupload({ pasteZone: document, dragover: function () { ok(true, 'Triggers dragover callback'); return false; }, drop: function () { ok(true, 'Triggers drop callback'); return false; }, paste: function () { ok(true, 'Triggers paste callback'); return false; }, change: function () { ok(true, 'Triggers change callback'); return false; } }), fileInput = fu.fileupload('option', 'fileInput'), dropZone = fu.fileupload('option', 'dropZone'), pasteZone = fu.fileupload('option', 'pasteZone'); fu.fileupload('option', 'fileInput', null); fu.fileupload('option', 'dropZone', null); fu.fileupload('option', 'pasteZone', null); fileInput.trigger($.Event('change', eo)); dropZone.trigger($.Event('dragover', eo)); dropZone.trigger($.Event('drop', eo)); pasteZone.trigger($.Event('paste', eo)); fu.fileupload('option', 'dropZone', 'body'); strictEqual( fu.fileupload('option', 'dropZone')[0], document.body, 'Allow a query string as parameter for the dropZone option' ); fu.fileupload('option', 'dropZone', document); strictEqual( fu.fileupload('option', 'dropZone')[0], document, 'Allow a document element as parameter for the dropZone option' ); fu.fileupload('option', 'pasteZone', 'body'); strictEqual( fu.fileupload('option', 'pasteZone')[0], document.body, 'Allow a query string as parameter for the pasteZone option' ); fu.fileupload('option', 'pasteZone', document); strictEqual( fu.fileupload('option', 'pasteZone')[0], document, 'Allow a document element as parameter for the pasteZone option' ); fu.fileupload('option', 'fileInput', ':file'); strictEqual( fu.fileupload('option', 'fileInput')[0], $(':file')[0], 'Allow a query string as parameter for the fileInput option' ); fu.fileupload('option', 'fileInput', $(':file')[0]); strictEqual( fu.fileupload('option', 'fileInput')[0], $(':file')[0], 'Allow a document element as parameter for the fileInput option' ); fu.fileupload('option', 'fileInput', fileInput); fu.fileupload('option', 'dropZone', dropZone); fu.fileupload('option', 'pasteZone', pasteZone); fileInput.trigger($.Event('change', eo)); dropZone.trigger($.Event('dragover', eo)); dropZone.trigger($.Event('drop', eo)); pasteZone.trigger($.Event('paste', eo)); }); asyncTest('add', function () { expect(2); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ add: function (e, data) { strictEqual( data.files[0].name, param.files[0].name, 'Triggers add callback' ); } }).fileupload('add', param).fileupload( 'option', 'add', function (e, data) { data.submit().complete(function () { ok(true, 'data.submit() Returns a jqXHR object'); start(); }); } ).fileupload('add', param); }); asyncTest('send', function () { expect(3); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ send: function (e, data) { strictEqual( data.files[0].name, 'test', 'Triggers send callback' ); } }).fileupload('send', param).fail(function () { ok(true, 'Allows to abort the request'); }).complete(function () { ok(true, 'Returns a jqXHR object'); start(); }).abort(); }); module('Callbacks', lifecycle); asyncTest('add', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ add: function () { ok(true, 'Triggers add callback'); start(); } }).fileupload('add', param); }); asyncTest('submit', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ submit: function () { ok(true, 'Triggers submit callback'); start(); return false; } }).fileupload('add', param); }); asyncTest('send', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ send: function () { ok(true, 'Triggers send callback'); start(); return false; } }).fileupload('send', param); }); asyncTest('done', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ done: function () { ok(true, 'Triggers done callback'); start(); } }).fileupload('send', param); }); asyncTest('fail', function () { expect(1); var param = {files: [{name: 'test'}]}, fu = $('#fileupload').fileupload({ url: '404', fail: function () { ok(true, 'Triggers fail callback'); start(); } }); (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; fu.fileupload('send', param); }); asyncTest('always', function () { expect(2); var param = {files: [{name: 'test'}]}, counter = 0, fu = $('#fileupload').fileupload({ always: function () { ok(true, 'Triggers always callback'); if (counter === 1) { start(); } else { counter += 1; } } }); (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; fu.fileupload('add', param).fileupload( 'option', 'url', '404' ).fileupload('add', param); }); asyncTest('progress', function () { expect(1); var param = {files: [{name: 'test'}]}, counter = 0; $('#fileupload').fileupload({ forceIframeTransport: true, progress: function () { ok(true, 'Triggers progress callback'); if (counter === 0) { start(); } else { counter += 1; } } }).fileupload('send', param); }); asyncTest('progressall', function () { expect(1); var param = {files: [{name: 'test'}]}, counter = 0; $('#fileupload').fileupload({ forceIframeTransport: true, progressall: function () { ok(true, 'Triggers progressall callback'); if (counter === 0) { start(); } else { counter += 1; } } }).fileupload('send', param); }); asyncTest('start', function () { expect(1); var param = {files: [{name: '1'}, {name: '2'}]}, active = 0; $('#fileupload').fileupload({ send: function () { active += 1; }, start: function () { ok(!active, 'Triggers start callback before uploads'); start(); } }).fileupload('send', param); }); asyncTest('stop', function () { expect(1); var param = {files: [{name: '1'}, {name: '2'}]}, active = 0; $('#fileupload').fileupload({ send: function () { active += 1; }, always: function () { active -= 1; }, stop: function () { ok(!active, 'Triggers stop callback after uploads'); start(); } }).fileupload('send', param); }); test('change', function () { var fu = $('#fileupload').fileupload(), fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'), fileInput = fu.fileupload('option', 'fileInput'); expect(2); fu.fileupload({ change: function (e, data) { ok(true, 'Triggers change callback'); strictEqual( data.files.length, 0, 'Returns empty files list' ); }, add: $.noop }); fuo._onChange({ data: {fileupload: fuo}, target: fileInput[0] }); }); test('paste', function () { var fu = $('#fileupload').fileupload(), fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'); expect(1); fu.fileupload({ paste: function () { ok(true, 'Triggers paste callback'); }, add: $.noop }); fuo._onPaste({ data: {fileupload: fuo}, originalEvent: { dataTransfer: {files: [{}]}, clipboardData: {items: [{}]} }, preventDefault: $.noop }); }); test('drop', function () { var fu = $('#fileupload').fileupload(), fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'); expect(1); fu.fileupload({ drop: function () { ok(true, 'Triggers drop callback'); }, add: $.noop }); fuo._onDrop({ data: {fileupload: fuo}, originalEvent: { dataTransfer: {files: [{}]}, clipboardData: {items: [{}]} }, preventDefault: $.noop }); }); test('dragover', function () { var fu = $('#fileupload').fileupload(), fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'); expect(1); fu.fileupload({ dragover: function () { ok(true, 'Triggers dragover callback'); }, add: $.noop }); fuo._onDragOver({ data: {fileupload: fuo}, originalEvent: {dataTransfer: {types: ['Files']}}, preventDefault: $.noop }); }); module('Options', lifecycle); test('paramName', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ paramName: null, send: function (e, data) { strictEqual( data.paramName[0], data.fileInput.prop('name'), 'Takes paramName from file input field if not set' ); return false; } }).fileupload('send', param); }); test('url', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ url: null, send: function (e, data) { strictEqual( data.url, $(data.fileInput.prop('form')).prop('action'), 'Takes url from form action if not set' ); return false; } }).fileupload('send', param); }); test('type', function () { expect(2); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ type: null, send: function (e, data) { strictEqual( data.type, 'POST', 'Request type is "POST" if not set to "PUT"' ); return false; } }).fileupload('send', param); $('#fileupload').fileupload({ type: 'PUT', send: function (e, data) { strictEqual( data.type, 'PUT', 'Request type is "PUT" if set to "PUT"' ); return false; } }).fileupload('send', param); }); test('replaceFileInput', function () { var fu = $('#fileupload').fileupload(), fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'), fileInput = fu.fileupload('option', 'fileInput'), fileInputElement = fileInput[0]; expect(2); fu.fileupload({ replaceFileInput: false, change: function () { strictEqual( fu.fileupload('option', 'fileInput')[0], fileInputElement, 'Keeps file input with replaceFileInput: false' ); }, add: $.noop }); fuo._onChange({ data: {fileupload: fuo}, target: fileInput[0] }); fu.fileupload({ replaceFileInput: true, change: function () { notStrictEqual( fu.fileupload('option', 'fileInput')[0], fileInputElement, 'Replaces file input with replaceFileInput: true' ); }, add: $.noop }); fuo._onChange({ data: {fileupload: fuo}, target: fileInput[0] }); }); asyncTest('forceIframeTransport', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ forceIframeTransport: true, done: function (e, data) { strictEqual( data.dataType.substr(0, 6), 'iframe', 'Iframe Transport is used' ); start(); } }).fileupload('send', param); }); test('singleFileUploads', function () { expect(3); var fu = $('#fileupload').fileupload(), param = {files: [{name: '1'}, {name: '2'}]}, index = 1; (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; $('#fileupload').fileupload({ singleFileUploads: true, add: function () { ok(true, 'Triggers callback number ' + index.toString()); index += 1; } }).fileupload('add', param).fileupload( 'option', 'singleFileUploads', false ).fileupload('add', param); }); test('limitMultiFileUploads', function () { expect(3); var fu = $('#fileupload').fileupload(), param = {files: [ {name: '1'}, {name: '2'}, {name: '3'}, {name: '4'}, {name: '5'} ]}, index = 1; (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; $('#fileupload').fileupload({ singleFileUploads: false, limitMultiFileUploads: 2, add: function () { ok(true, 'Triggers callback number ' + index.toString()); index += 1; } }).fileupload('add', param); }); test('limitMultiFileUploadSize', function () { expect(7); var fu = $('#fileupload').fileupload(), param = {files: [ {name: '1-1', size: 100000}, {name: '1-2', size: 40000}, {name: '2-1', size: 100000}, {name: '3-1', size: 50000}, {name: '3-2', size: 40000}, {name: '4-1', size: 45000} // New request due to limitMultiFileUploads ]}, param2 = {files: [ {name: '5-1'}, {name: '5-2'}, {name: '6-1'}, {name: '6-2'}, {name: '7-1'} ]}, index = 1; (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; $('#fileupload').fileupload({ singleFileUploads: false, limitMultiFileUploads: 2, limitMultiFileUploadSize: 150000, limitMultiFileUploadSizeOverhead: 5000, add: function () { ok(true, 'Triggers callback number ' + index.toString()); index += 1; } }).fileupload('add', param).fileupload('add', param2); }); asyncTest('sequentialUploads', function () { expect(6); var param = {files: [ {name: '1'}, {name: '2'}, {name: '3'}, {name: '4'}, {name: '5'}, {name: '6'} ]}, addIndex = 0, sendIndex = 0, loadIndex = 0, fu = $('#fileupload').fileupload({ sequentialUploads: true, add: function (e, data) { addIndex += 1; if (addIndex === 4) { data.submit().abort(); } else { data.submit(); } }, send: function () { sendIndex += 1; }, done: function () { loadIndex += 1; strictEqual(sendIndex, loadIndex, 'upload in order'); }, fail: function (e, data) { strictEqual(data.errorThrown, 'abort', 'upload aborted'); }, stop: function () { start(); } }); (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; fu.fileupload('add', param); }); asyncTest('limitConcurrentUploads', function () { expect(12); var param = {files: [ {name: '1'}, {name: '2'}, {name: '3'}, {name: '4'}, {name: '5'}, {name: '6'}, {name: '7'}, {name: '8'}, {name: '9'}, {name: '10'}, {name: '11'}, {name: '12'} ]}, addIndex = 0, sendIndex = 0, loadIndex = 0, fu = $('#fileupload').fileupload({ limitConcurrentUploads: 3, add: function (e, data) { addIndex += 1; if (addIndex === 4) { data.submit().abort(); } else { data.submit(); } }, send: function () { sendIndex += 1; }, done: function () { loadIndex += 1; ok(sendIndex - loadIndex < 3); }, fail: function (e, data) { strictEqual(data.errorThrown, 'abort', 'upload aborted'); }, stop: function () { start(); } }); (fu.data('blueimp-fileupload') || fu.data('fileupload')) ._isXHRUpload = function () { return true; }; fu.fileupload('add', param); }); if ($.support.xhrFileUpload) { asyncTest('multipart', function () { expect(2); var param = {files: [{ name: 'test.png', size: 123, type: 'image/png' }]}, fu = $('#fileupload').fileupload({ multipart: false, always: function (e, data) { strictEqual( data.contentType, param.files[0].type, 'non-multipart upload sets file type as contentType' ); strictEqual( data.headers['Content-Disposition'], 'attachment; filename="' + param.files[0].name + '"', 'non-multipart upload sets Content-Disposition header' ); start(); } }); fu.fileupload('send', param); }); } module('UI Initialization', lifecycleUI); test('Widget initialization', function () { var fu = $('#fileupload').fileupload(); ok(fu.data('blueimp-fileupload') || fu.data('fileupload')); ok( $('#fileupload').fileupload('option', 'uploadTemplate').length, 'Initialized upload template' ); ok( $('#fileupload').fileupload('option', 'downloadTemplate').length, 'Initialized download template' ); }); test('Buttonbar event listeners', function () { var buttonbar = $('#fileupload .fileupload-buttonbar'), files = [{name: 'test'}]; expect(4); $('#fileupload').fileupload({ send: function () { ok(true, 'Started file upload via global start button'); }, fail: function (e, data) { ok(true, 'Canceled file upload via global cancel button'); data.context.remove(); }, destroy: function () { ok(true, 'Delete action called via global delete button'); } }); $('#fileupload').fileupload('add', {files: files}); buttonbar.find('.cancel').click(); $('#fileupload').fileupload('add', {files: files}); buttonbar.find('.start').click(); buttonbar.find('.cancel').click(); files[0].deleteUrl = 'http://example.org/banana.jpg'; ($('#fileupload').data('blueimp-fileupload') || $('#fileupload').data('fileupload')) ._renderDownload(files) .appendTo($('#fileupload .files')).show() .find('.toggle').click(); buttonbar.find('.delete').click(); }); module('UI API', lifecycleUI); test('destroy', function () { var buttonbar = $('#fileupload .fileupload-buttonbar'), files = [{name: 'test'}]; expect(1); $('#fileupload').fileupload({ send: function () { ok(true, 'This test should not run'); return false; } }) .fileupload('add', {files: files}) .fileupload('destroy'); buttonbar.find('.start').click(function () { ok(true, 'Clicked global start button'); return false; }).click(); }); test('disable/enable', function () { var buttonbar = $('#fileupload .fileupload-buttonbar'); $('#fileupload').fileupload(); $('#fileupload').fileupload('disable'); strictEqual( buttonbar.find('input[type=file], button').not(':disabled').length, 0, 'Disables the buttonbar buttons' ); $('#fileupload').fileupload('enable'); strictEqual( buttonbar.find('input[type=file], button').not(':disabled').length, 4, 'Enables the buttonbar buttons' ); }); module('UI Callbacks', lifecycleUI); test('destroy', function () { expect(3); $('#fileupload').fileupload({ destroy: function (e, data) { ok(true, 'Triggers destroy callback'); strictEqual( data.url, 'test', 'Passes over deletion url parameter' ); strictEqual( data.type, 'DELETE', 'Passes over deletion request type parameter' ); } }); ($('#fileupload').data('blueimp-fileupload') || $('#fileupload').data('fileupload')) ._renderDownload([{ name: 'test', deleteUrl: 'test', deleteType: 'DELETE' }]) .appendTo($('#fileupload .files')) .show() .find('.toggle').click(); $('#fileupload .fileupload-buttonbar .delete').click(); }); asyncTest('added', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ added: function (e, data) { start(); strictEqual( data.files[0].name, param.files[0].name, 'Triggers added callback' ); }, send: function () { return false; } }).fileupload('add', param); }); asyncTest('started', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ started: function () { start(); ok('Triggers started callback'); return false; }, sent: function () { return false; } }).fileupload('send', param); }); asyncTest('sent', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ sent: function (e, data) { start(); strictEqual( data.files[0].name, param.files[0].name, 'Triggers sent callback' ); return false; } }).fileupload('send', param); }); asyncTest('completed', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ completed: function () { start(); ok('Triggers completed callback'); return false; } }).fileupload('send', param); }); asyncTest('failed', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ failed: function () { start(); ok('Triggers failed callback'); return false; } }).fileupload('send', param).abort(); }); asyncTest('stopped', function () { expect(1); var param = {files: [{name: 'test'}]}; $('#fileupload').fileupload({ stopped: function () { start(); ok('Triggers stopped callback'); return false; } }).fileupload('send', param); }); asyncTest('destroyed', function () { expect(1); $('#fileupload').fileupload({ dataType: 'html', destroyed: function () { start(); ok(true, 'Triggers destroyed callback'); } }); ($('#fileupload').data('blueimp-fileupload') || $('#fileupload').data('fileupload')) ._renderDownload([{ name: 'test', deleteUrl: '.', deleteType: 'GET' }]) .appendTo($('#fileupload .files')) .show() .find('.toggle').click(); $('#fileupload .fileupload-buttonbar .delete').click(); }); module('UI Options', lifecycleUI); test('autoUpload', function () { expect(1); $('#fileupload') .fileupload({ autoUpload: true, send: function () { ok(true, 'Started file upload automatically'); return false; } }) .fileupload('add', {files: [{name: 'test'}]}) .fileupload('option', 'autoUpload', false) .fileupload('add', {files: [{name: 'test'}]}); }); test('maxNumberOfFiles', function () { expect(3); var addIndex = 0, sendIndex = 0; $('#fileupload') .fileupload({ autoUpload: true, maxNumberOfFiles: 3, singleFileUploads: false, send: function () { strictEqual( sendIndex += 1, addIndex ); }, progress: $.noop, progressall: $.noop, done: $.noop, stop: $.noop }) .fileupload('add', {files: [{name: (addIndex += 1)}]}) .fileupload('add', {files: [{name: (addIndex += 1)}]}) .fileupload('add', {files: [{name: (addIndex += 1)}]}) .fileupload('add', {files: [{name: 'test'}]}); }); test('maxFileSize', function () { expect(2); var addIndex = 0, sendIndex = 0; $('#fileupload') .fileupload({ autoUpload: true, maxFileSize: 1000, send: function () { strictEqual( sendIndex += 1, addIndex ); return false; } }) .fileupload('add', {files: [{ name: (addIndex += 1) }]}) .fileupload('add', {files: [{ name: (addIndex += 1), size: 999 }]}) .fileupload('add', {files: [{ name: 'test', size: 1001 }]}) .fileupload({ send: function (e, data) { ok( !$.blueimp.fileupload.prototype.options .send.call(this, e, data) ); return false; } }); }); test('minFileSize', function () { expect(2); var addIndex = 0, sendIndex = 0; $('#fileupload') .fileupload({ autoUpload: true, minFileSize: 1000, send: function () { strictEqual( sendIndex += 1, addIndex ); return false; } }) .fileupload('add', {files: [{ name: (addIndex += 1) }]}) .fileupload('add', {files: [{ name: (addIndex += 1), size: 1001 }]}) .fileupload('add', {files: [{ name: 'test', size: 999 }]}) .fileupload({ send: function (e, data) { ok( !$.blueimp.fileupload.prototype.options .send.call(this, e, data) ); return false; } }); }); test('acceptFileTypes', function () { expect(2); var addIndex = 0, sendIndex = 0; $('#fileupload') .fileupload({ autoUpload: true, acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, disableImageMetaDataLoad: true, send: function () { strictEqual( sendIndex += 1, addIndex ); return false; } }) .fileupload('add', {files: [{ name: (addIndex += 1) + '.jpg' }]}) .fileupload('add', {files: [{ name: (addIndex += 1), type: 'image/jpeg' }]}) .fileupload('add', {files: [{ name: 'test.txt', type: 'text/plain' }]}) .fileupload({ send: function (e, data) { ok( !$.blueimp.fileupload.prototype.options .send.call(this, e, data) ); return false; } }); }); test('acceptFileTypes as HTML5 data attribute', function () { expect(2); var regExp = /(\.|\/)(gif|jpe?g|png)$/i; $('#fileupload') .attr('data-accept-file-types', regExp.toString()) .fileupload(); strictEqual( $.type($('#fileupload').fileupload('option', 'acceptFileTypes')), $.type(regExp) ); strictEqual( $('#fileupload').fileupload('option', 'acceptFileTypes').toString(), regExp.toString() ); }); });