berkshelf-store 0.2.0

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