Upgrade filebrowser; minor fixes relevant to the upgrade.
[redakcja.git] / src / fileupload / static / lib / jQuery-File-Upload-10.32.0 / test / unit.js
diff --git a/src/fileupload/static/lib/jQuery-File-Upload-10.32.0/test/unit.js b/src/fileupload/static/lib/jQuery-File-Upload-10.32.0/test/unit.js
new file mode 100644 (file)
index 0000000..d9d9fff
--- /dev/null
@@ -0,0 +1,989 @@
+/*
+ * jQuery File Upload Test
+ * https://github.com/blueimp/JavaScript-Load-Image
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * https://opensource.org/licenses/MIT
+ */
+
+/* global beforeEach, afterEach, describe, it */
+/* eslint-disable new-cap */
+
+(function (expect, $) {
+  'use strict';
+
+  var canCreateBlob = !!window.dataURLtoBlob;
+  // 80x60px GIF image (color black, base64 data):
+  var b64DataGIF =
+    'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' +
+    'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' +
+    'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7';
+  var imageUrlGIF = 'data:image/gif;base64,' + b64DataGIF;
+  var blobGIF = canCreateBlob && window.dataURLtoBlob(imageUrlGIF);
+
+  // 2x1px JPEG (color white, with the Exif orientation flag set to 6 and the
+  // IPTC ObjectName (2:5) set to 'objectname'):
+  var b64DataJPEG =
+    '/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAA' +
+    'BgASAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAA8cAgUACm9iamVj' +
+    'dG5hbWUA/9sAQwABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
+    'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/9sAQwEBAQEBAQEBAQEBAQEBAQEB' +
+    'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
+    '/8AAEQgAAQACAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYH' +
+    'CAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh' +
+    'CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldY' +
+    'WVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1' +
+    'tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8B' +
+    'AAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAEC' +
+    'dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBka' +
+    'JicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG' +
+    'h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ' +
+    '2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/v4ooooA/9k=';
+  var imageUrlJPEG = 'data:image/jpeg;base64,' + b64DataJPEG;
+  var blobJPEG = canCreateBlob && window.dataURLtoBlob(imageUrlJPEG);
+
+  var fileGIF, fileJPEG, files, items, eventObject;
+
+  var uploadURL = '../server/php/';
+
+  /**
+   * Creates a fileupload form and adds it to the DOM
+   *
+   * @returns {object} jQuery node
+   */
+  function createFileuploadForm() {
+    return $('<form><input type="file" name="files[]" multiple></form>')
+      .prop({
+        action: uploadURL,
+        method: 'POST',
+        enctype: 'multipart/form-data'
+      })
+      .css({ display: 'none' })
+      .appendTo(document.body);
+  }
+
+  /**
+   * Deletes all files from the upload server
+   *
+   * @param {Array} files Response files list
+   * @param {Function} callback Callback function
+   */
+  function deleteFiles(files, callback) {
+    $.when(
+      files.map(function (file) {
+        return $.ajax({
+          type: file.deleteType,
+          url: file.deleteUrl
+        });
+      })
+    ).always(function () {
+      callback();
+    });
+  }
+
+  beforeEach(function () {
+    fileGIF = new File([blobGIF], 'example.gif', { type: 'image/gif' });
+    fileJPEG = new File([blobJPEG], 'example.jpg', { type: 'image/jpeg' });
+    files = [fileGIF, fileJPEG];
+    items = [
+      {
+        getAsFile: function () {
+          return files[0];
+        }
+      },
+      {
+        getAsFile: function () {
+          return files[1];
+        }
+      }
+    ];
+    eventObject = {
+      originalEvent: {
+        dataTransfer: { files: files, types: ['Files'] },
+        clipboardData: { items: items }
+      }
+    };
+  });
+
+  afterEach(function (done) {
+    $.getJSON(uploadURL).then(function (result) {
+      deleteFiles(result.files, done);
+    });
+  });
+
+  describe('Initialization', function () {
+    var form;
+
+    beforeEach(function () {
+      form = createFileuploadForm();
+    });
+
+    afterEach(function () {
+      form.remove();
+    });
+
+    it('widget', function () {
+      form.fileupload();
+      expect(form.data('blueimp-fileupload')).to.be.an('object');
+    });
+
+    it('file input', function () {
+      form.fileupload();
+      expect(form.fileupload('option', 'fileInput').length).to.equal(1);
+    });
+
+    it('drop zone', function () {
+      form.fileupload();
+      expect(form.fileupload('option', 'dropZone').length).to.equal(1);
+    });
+
+    it('paste zone', function () {
+      form.fileupload({ pasteZone: document });
+      expect(form.fileupload('option', 'pasteZone').length).to.equal(1);
+    });
+
+    it('data attributes', function () {
+      form.attr('data-url', 'https://example.org');
+      form.fileupload();
+      expect(form.fileupload('option', 'url')).to.equal('https://example.org');
+      expect(form.data('blueimp-fileupload')).to.be.an('object');
+    });
+
+    it('event listeners', function () {
+      var eventsData = {};
+      form.fileupload({
+        autoUpload: false,
+        pasteZone: document,
+        dragover: function () {
+          eventsData.dragover = true;
+        },
+        dragenter: function () {
+          eventsData.dragenter = true;
+        },
+        dragleave: function () {
+          eventsData.dragleave = true;
+        },
+        drop: function (e, data) {
+          eventsData.drop = data;
+        },
+        paste: function (e, data) {
+          eventsData.paste = data;
+        },
+        change: function () {
+          eventsData.change = true;
+        }
+      });
+      form
+        .fileupload('option', 'fileInput')
+        .trigger($.Event('change', eventObject));
+      expect(eventsData.change).to.equal(true);
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('dragover', eventObject))
+        .trigger($.Event('dragenter', eventObject))
+        .trigger($.Event('dragleave', eventObject))
+        .trigger($.Event('drop', eventObject));
+      expect(eventsData.dragover).to.equal(true);
+      expect(eventsData.dragenter).to.equal(true);
+      expect(eventsData.dragleave).to.equal(true);
+      expect(eventsData.drop.files).to.deep.equal(files);
+      form
+        .fileupload('option', 'pasteZone')
+        .trigger($.Event('paste', eventObject));
+      expect(eventsData.paste.files).to.deep.equal(files);
+    });
+  });
+
+  describe('API', function () {
+    var form;
+
+    beforeEach(function () {
+      form = createFileuploadForm().fileupload({
+        dataType: 'json',
+        autoUpload: false
+      });
+    });
+
+    afterEach(function () {
+      form.remove();
+    });
+
+    it('destroy', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        pasteZone: document,
+        dragover: function () {
+          eventsData.dragover = true;
+        },
+        dragenter: function () {
+          eventsData.dragenter = true;
+        },
+        dragleave: function () {
+          eventsData.dragleave = true;
+        },
+        drop: function (e, data) {
+          eventsData.drop = data;
+        },
+        paste: function (e, data) {
+          eventsData.paste = data;
+        },
+        change: function () {
+          eventsData.change = true;
+        }
+      });
+      var fileInput = form.fileupload('option', 'fileInput');
+      var dropZone = form.fileupload('option', 'dropZone');
+      var pasteZone = form.fileupload('option', 'pasteZone');
+      form.fileupload('destroy');
+      expect(form.data('blueimp-fileupload')).to.equal();
+      fileInput.trigger($.Event('change', eventObject));
+      expect(eventsData.change).to.equal();
+      dropZone
+        .trigger($.Event('dragover', eventObject))
+        .trigger($.Event('dragenter', eventObject))
+        .trigger($.Event('dragleave', eventObject))
+        .trigger($.Event('drop', eventObject));
+      expect(eventsData.dragover).to.equal();
+      expect(eventsData.dragenter).to.equal();
+      expect(eventsData.dragleave).to.equal();
+      expect(eventsData.drop).to.equal();
+      pasteZone.trigger($.Event('paste', eventObject));
+      expect(eventsData.paste).to.equal();
+    });
+
+    it('disable', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        pasteZone: document,
+        dragover: function () {
+          eventsData.dragover = true;
+        },
+        dragenter: function () {
+          eventsData.dragenter = true;
+        },
+        dragleave: function () {
+          eventsData.dragleave = true;
+        },
+        drop: function (e, data) {
+          eventsData.drop = data;
+        },
+        paste: function (e, data) {
+          eventsData.paste = data;
+        },
+        change: function () {
+          eventsData.change = true;
+        }
+      });
+      form.fileupload('disable');
+      form
+        .fileupload('option', 'fileInput')
+        .trigger($.Event('change', eventObject));
+      expect(eventsData.change).to.equal();
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('dragover', eventObject))
+        .trigger($.Event('dragenter', eventObject))
+        .trigger($.Event('dragleave', eventObject))
+        .trigger($.Event('drop', eventObject));
+      expect(eventsData.dragover).to.equal();
+      expect(eventsData.dragenter).to.equal();
+      expect(eventsData.dragleave).to.equal();
+      expect(eventsData.drop).to.equal();
+      form
+        .fileupload('option', 'pasteZone')
+        .trigger($.Event('paste', eventObject));
+      expect(eventsData.paste).to.equal();
+    });
+
+    it('enable', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        pasteZone: document,
+        dragover: function () {
+          eventsData.dragover = true;
+        },
+        dragenter: function () {
+          eventsData.dragenter = true;
+        },
+        dragleave: function () {
+          eventsData.dragleave = true;
+        },
+        drop: function (e, data) {
+          eventsData.drop = data;
+        },
+        paste: function (e, data) {
+          eventsData.paste = data;
+        },
+        change: function () {
+          eventsData.change = true;
+        }
+      });
+      form.fileupload('disable');
+      form.fileupload('enable');
+      form
+        .fileupload('option', 'fileInput')
+        .trigger($.Event('change', eventObject));
+      expect(eventsData.change).to.equal(true);
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('dragover', eventObject))
+        .trigger($.Event('dragenter', eventObject))
+        .trigger($.Event('dragleave', eventObject))
+        .trigger($.Event('drop', eventObject));
+      expect(eventsData.dragover).to.equal(true);
+      expect(eventsData.dragenter).to.equal(true);
+      expect(eventsData.dragleave).to.equal(true);
+      expect(eventsData.drop.files).to.deep.equal(files);
+      form
+        .fileupload('option', 'pasteZone')
+        .trigger($.Event('paste', eventObject));
+      expect(eventsData.paste.files).to.deep.equal(files);
+    });
+
+    it('option', function () {
+      var eventsData = {};
+      form.fileupload('option', 'drop', function (e, data) {
+        eventsData.drop = data;
+      });
+      var dropZone = form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('drop', eventObject));
+      expect(eventsData.drop.files).to.deep.equal(files);
+      delete eventsData.drop;
+      form.fileupload('option', 'dropZone', null);
+      dropZone.trigger($.Event('drop', eventObject));
+      expect(eventsData.drop).to.equal();
+      form.fileupload('option', {
+        dropZone: dropZone
+      });
+      dropZone.trigger($.Event('drop', eventObject));
+      expect(eventsData.drop.files).to.deep.equal(files);
+    });
+
+    it('add', function () {
+      var eventData = [];
+      form.fileupload('option', 'add', function (e, data) {
+        eventData.push(data);
+      });
+      form.fileupload('add', { files: files });
+      expect(eventData.length).to.equal(2);
+      expect(eventData[0].files[0]).to.equal(files[0]);
+      expect(eventData[1].files[0]).to.equal(files[1]);
+    });
+
+    it('send', function (done) {
+      this.slow(200);
+      form.fileupload('send', { files: files }).complete(function (result) {
+        var uploadedFiles = result.responseJSON.files;
+        expect(uploadedFiles.length).to.equal(2);
+        expect(uploadedFiles[0].type).to.equal(files[0].type);
+        expect(uploadedFiles[0].error).to.equal();
+        expect(uploadedFiles[1].type).to.equal(files[1].type);
+        expect(uploadedFiles[1].error).to.equal();
+        done();
+      });
+    });
+  });
+
+  describe('Callbacks', function () {
+    var form;
+
+    beforeEach(function () {
+      form = createFileuploadForm().fileupload({ dataType: 'json' });
+    });
+
+    afterEach(function () {
+      form.remove();
+    });
+
+    it('add', function () {
+      var eventData = [];
+      form.fileupload('option', 'add', function (e, data) {
+        eventData.push(data);
+      });
+      form.fileupload('add', { files: files });
+      expect(eventData.length).to.equal(2);
+      expect(eventData[0].files[0]).to.equal(files[0]);
+      expect(eventData[1].files[0]).to.equal(files[1]);
+    });
+
+    it('submit', function (done) {
+      this.slow(200);
+      var eventData = [];
+      form.fileupload('option', {
+        submit: function (e, data) {
+          eventData.push(data);
+        },
+        stop: function () {
+          if (eventData.length < 2) return;
+          expect(eventData[0].files[0]).to.equal(files[0]);
+          expect(eventData[1].files[0]).to.equal(files[1]);
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('send', function (done) {
+      this.slow(200);
+      var eventData = [];
+      form.fileupload('option', {
+        send: function (e, data) {
+          eventData.push(data);
+        },
+        stop: function () {
+          expect(eventData.length).to.equal(1);
+          expect(eventData[0].files).to.deep.equal(files);
+          done();
+        }
+      });
+      form.fileupload('send', { files: files });
+    });
+
+    it('done', function (done) {
+      this.slow(200);
+      var eventData = [];
+      form.fileupload('option', {
+        done: function (e, data) {
+          eventData.push(data);
+        },
+        stop: function () {
+          if (eventData.length < 2) return;
+          expect(eventData[0].result.files.length).to.equal(1);
+          expect(eventData[1].result.files.length).to.equal(1);
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('fail', function (done) {
+      this.slow(200);
+      var eventData = [];
+      form.fileupload('option', {
+        url: uploadURL + '404',
+        fail: function (e, data) {
+          eventData.push(data);
+        },
+        stop: function () {
+          if (eventData.length < 2) return;
+          expect(eventData[0].result).to.equal();
+          expect(eventData[1].result).to.equal();
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('always', function (done) {
+      this.slow(200);
+      var eventData = [];
+      form.fileupload('option', {
+        always: function (e, data) {
+          eventData.push(data);
+        },
+        stop: function () {
+          if (eventData.length < 2) {
+            expect(eventData[0].result).to.equal();
+            form.fileupload('add', { files: [fileGIF] });
+            return;
+          }
+          expect(eventData[1].result.files.length).to.equal(1);
+          done();
+        }
+      });
+      form.fileupload('add', { files: [fileGIF], url: uploadURL + '404' });
+    });
+
+    it('progress', function (done) {
+      this.slow(200);
+      var loaded;
+      var total;
+      form.fileupload('option', {
+        progress: function (e, data) {
+          loaded = data.loaded;
+          total = data.total;
+          expect(loaded).to.be.at.most(total);
+        },
+        stop: function () {
+          expect(loaded).to.equal(total);
+          done();
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('progressall', function (done) {
+      this.slow(200);
+      var loaded;
+      var total;
+      var completed = 0;
+      form.fileupload('option', {
+        progressall: function (e, data) {
+          loaded = data.loaded;
+          total = data.total;
+          expect(loaded).to.be.at.most(total);
+        },
+        always: function () {
+          completed++;
+        },
+        stop: function () {
+          if (completed < 2) return;
+          expect(loaded).to.equal(total);
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('start', function (done) {
+      this.slow(200);
+      var started;
+      form.fileupload('option', {
+        start: function () {
+          started = true;
+        },
+        stop: function () {
+          expect(started).to.equal(true);
+          done();
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('stop', function (done) {
+      this.slow(200);
+      form.fileupload('option', {
+        stop: function () {
+          done();
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('dragover', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        autoUpload: false,
+        dragover: function () {
+          eventsData.dragover = true;
+        }
+      });
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('dragover', eventObject));
+      expect(eventsData.dragover).to.equal(true);
+    });
+
+    it('dragenter', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        autoUpload: false,
+        dragenter: function () {
+          eventsData.dragenter = true;
+        }
+      });
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('dragenter', eventObject));
+      expect(eventsData.dragenter).to.equal(true);
+    });
+
+    it('dragleave', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        autoUpload: false,
+        dragleave: function () {
+          eventsData.dragleave = true;
+        }
+      });
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('dragleave', eventObject));
+      expect(eventsData.dragleave).to.equal(true);
+    });
+
+    it('drop', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        autoUpload: false,
+        drop: function (e, data) {
+          eventsData.drop = data;
+        }
+      });
+      form
+        .fileupload('option', 'dropZone')
+        .trigger($.Event('drop', eventObject));
+      expect(eventsData.drop.files).to.deep.equal(files);
+    });
+
+    it('paste', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        autoUpload: false,
+        pasteZone: document,
+        paste: function (e, data) {
+          eventsData.paste = data;
+        }
+      });
+      form
+        .fileupload('option', 'pasteZone')
+        .trigger($.Event('paste', eventObject));
+      expect(eventsData.paste.files).to.deep.equal(files);
+    });
+
+    it('change', function () {
+      var eventsData = {};
+      form.fileupload('option', {
+        autoUpload: false,
+        change: function () {
+          eventsData.change = true;
+        }
+      });
+      form
+        .fileupload('option', 'fileInput')
+        .trigger($.Event('change', eventObject));
+      expect(eventsData.change).to.equal(true);
+    });
+  });
+
+  describe('Options', function () {
+    var form;
+
+    beforeEach(function () {
+      form = createFileuploadForm();
+    });
+
+    afterEach(function () {
+      form.remove();
+    });
+
+    it('paramName', function (done) {
+      form.fileupload({
+        send: function (e, data) {
+          expect(data.paramName[0]).to.equal(
+            form.fileupload('option', 'fileInput').prop('name')
+          );
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('url', function (done) {
+      form.fileupload({
+        send: function (e, data) {
+          expect(data.url).to.equal(form.prop('action'));
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('type', function (done) {
+      form.fileupload({
+        type: 'PUT',
+        send: function (e, data) {
+          expect(data.type).to.equal('PUT');
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('replaceFileInput', function () {
+      form.fileupload();
+      var fileInput = form.fileupload('option', 'fileInput');
+      fileInput.trigger($.Event('change', eventObject));
+      expect(form.fileupload('option', 'fileInput')[0]).to.not.equal(
+        fileInput[0]
+      );
+      form.fileupload('option', 'replaceFileInput', false);
+      fileInput = form.fileupload('option', 'fileInput');
+      fileInput.trigger($.Event('change', eventObject));
+      expect(form.fileupload('option', 'fileInput')[0]).to.equal(fileInput[0]);
+    });
+
+    it('forceIframeTransport', function (done) {
+      form.fileupload({
+        forceIframeTransport: 'PUT',
+        send: function (e, data) {
+          expect(data.dataType.substr(0, 6)).to.equal('iframe');
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('singleFileUploads', function (done) {
+      form.fileupload({
+        singleFileUploads: false,
+        send: function (e, data) {
+          expect(data.files).to.deep.equal(files);
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('limitMultiFileUploads', function (done) {
+      var completed = 0;
+      form.fileupload({
+        singleFileUploads: false,
+        limitMultiFileUploads: 2,
+        send: function (e, data) {
+          expect(data.files).to.deep.equal(files);
+          completed++;
+          if (completed < 2) return;
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: files.concat(files) });
+    });
+
+    it('limitMultiFileUploadSize', function (done) {
+      var completed = 0;
+      form.fileupload({
+        singleFileUploads: false,
+        limitMultiFileUploadSize: files[0].size + files[1].size,
+        limitMultiFileUploadSizeOverhead: 0,
+        send: function (e, data) {
+          expect(data.files).to.deep.equal(files);
+          completed++;
+          if (completed < 2) return;
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: files.concat(files) });
+    });
+
+    it('sequentialUploads', function (done) {
+      this.slow(400);
+      var completed = 0;
+      var events = [];
+      form.fileupload({
+        sequentialUploads: true,
+        dataType: 'json',
+        send: function () {
+          events.push('send');
+        },
+        always: function () {
+          events.push('complete');
+          completed++;
+        },
+        stop: function () {
+          if (completed === 4) {
+            expect(events.join(',')).to.equal(
+              [
+                'send',
+                'complete',
+                'send',
+                'complete',
+                'send',
+                'complete',
+                'send',
+                'complete'
+              ].join(',')
+            );
+            done();
+          }
+        }
+      });
+      form.fileupload('add', { files: files.concat(files) });
+    });
+
+    it('limitConcurrentUploads', function (done) {
+      this.slow(800);
+      var completed = 0;
+      var loadCount = 0;
+      form.fileupload({
+        limitConcurrentUploads: 2,
+        dataType: 'json',
+        send: function () {
+          loadCount++;
+          expect(loadCount).to.be.at.most(2);
+        },
+        always: function () {
+          completed++;
+          loadCount--;
+        },
+        stop: function () {
+          if (completed === 8) {
+            done();
+          }
+        }
+      });
+      form.fileupload('add', {
+        files: files.concat(files).concat(files).concat(files)
+      });
+    });
+
+    it('multipart', function (done) {
+      form.fileupload({
+        multipart: false,
+        send: function (e, data) {
+          expect(data.contentType).to.equal(fileGIF.type);
+          expect(data.headers['Content-Disposition']).to.equal(
+            'attachment; filename="' + fileGIF.name + '"'
+          );
+          done();
+          return false;
+        }
+      });
+      form.fileupload('add', { files: [fileGIF] });
+    });
+
+    it('uniqueFilenames', function (done) {
+      form.fileupload({
+        uniqueFilenames: {},
+        send: function (e, data) {
+          var formFiles = data.data.getAll('files[]');
+          expect(formFiles[0].name).to.equal(fileGIF.name);
+          expect(formFiles[1].name).to.equal(
+            fileGIF.name.replace('.gif', ' (1).gif')
+          );
+          expect(formFiles[2].name).to.equal(
+            fileGIF.name.replace('.gif', ' (2).gif')
+          );
+          done();
+          return false;
+        }
+      });
+      form.fileupload('send', { files: [fileGIF, fileGIF, fileGIF] });
+    });
+
+    it('maxChunkSize', function (done) {
+      this.slow(400);
+      var events = [];
+      form.fileupload({
+        maxChunkSize: 32,
+        dataType: 'json',
+        chunkbeforesend: function () {
+          events.push('chunkbeforesend');
+        },
+        chunksend: function () {
+          events.push('chunksend');
+        },
+        chunkdone: function () {
+          events.push('chunkdone');
+        },
+        done: function (e, data) {
+          var uploadedFile = data.result.files[0];
+          expect(uploadedFile.type).to.equal(fileGIF.type);
+          expect(uploadedFile.size).to.equal(fileGIF.size);
+        },
+        stop: function () {
+          expect(events.join(',')).to.equal(
+            [
+              'chunkbeforesend',
+              'chunksend',
+              'chunkdone',
+              'chunkbeforesend',
+              'chunksend',
+              'chunkdone',
+              'chunkbeforesend',
+              'chunksend',
+              'chunkdone',
+              'chunkbeforesend',
+              'chunksend',
+              'chunkdone'
+            ].join(',')
+          );
+          done();
+        }
+      });
+      form.fileupload('send', { files: [fileGIF] });
+    });
+
+    it('acceptFileTypes', function (done) {
+      var processData;
+      form.fileupload({
+        acceptFileTypes: /^image\/gif$/,
+        singleFileUploads: false,
+        processalways: function (e, data) {
+          processData = data;
+        },
+        processstop: function () {
+          expect(processData.files[0].error).to.equal();
+          expect(processData.files[1].error).to.equal(
+            form.fileupload('option').i18n('acceptFileTypes')
+          );
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('maxFileSize', function (done) {
+      var processData;
+      form.fileupload({
+        maxFileSize: 200,
+        singleFileUploads: false,
+        processalways: function (e, data) {
+          processData = data;
+        },
+        processstop: function () {
+          expect(processData.files[0].error).to.equal();
+          expect(processData.files[1].error).to.equal(
+            form.fileupload('option').i18n('maxFileSize')
+          );
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('minFileSize', function (done) {
+      var processData;
+      form.fileupload({
+        minFileSize: 200,
+        singleFileUploads: false,
+        processalways: function (e, data) {
+          processData = data;
+        },
+        processstop: function () {
+          expect(processData.files[0].error).to.equal(
+            form.fileupload('option').i18n('minFileSize')
+          );
+          expect(processData.files[1].error).to.equal();
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+
+    it('maxNumberOfFiles', function (done) {
+      var processData;
+      form.fileupload({
+        maxNumberOfFiles: 2,
+        getNumberOfFiles: function () {
+          return 2;
+        },
+        singleFileUploads: false,
+        processalways: function (e, data) {
+          processData = data;
+        },
+        processstop: function () {
+          expect(processData.files[0].error).to.equal(
+            form.fileupload('option').i18n('maxNumberOfFiles')
+          );
+          expect(processData.files[1].error).to.equal(
+            form.fileupload('option').i18n('maxNumberOfFiles')
+          );
+          done();
+        }
+      });
+      form.fileupload('add', { files: files });
+    });
+  });
+})(this.chai.expect, this.jQuery);