bc94cf961d
+ basic rotation handle
1292 lines
41 KiB
JavaScript
Executable file
1292 lines
41 KiB
JavaScript
Executable file
/*
|
|
* jQuery File Upload Plugin Test
|
|
* https://github.com/blueimp/jQuery-File-Upload
|
|
*
|
|
* Copyright 2010, Sebastian Tschan
|
|
* https://blueimp.net
|
|
*
|
|
* Licensed under the MIT license:
|
|
* https://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()
|
|
);
|
|
});
|
|
|
|
});
|