Compare commits

...

7 Commits

Author SHA1 Message Date
nobuti c2232a6d01 Fix mock server to fix specs.
7 years ago
nobuti 8fd20a0f35 Fix dependencies.
7 years ago
nobuti a1dc06cf4b Get rid of bower.
7 years ago
nobuti 33a766a342 Fix package.json
7 years ago
xavijam 9b7ca3dac5 Setting newer version for grunt-contrib-jasmine
8 years ago
nobuti ff2c75cdf7 More fix.
8 years ago
nobuti af329465c9 Fix dependency.
8 years ago

@ -1,3 +1,5 @@
var webpackConfig = require('./webpack.config');
module.exports = function(grunt) {
grunt.initConfig({
@ -8,78 +10,67 @@ module.exports = function(grunt) {
}
},
stop_node: { stop: {} },
stop_node: {
stop: {}
},
run: {
installBower: {
cmd: 'node',
args: [
'./node_modules/bower/bin/bower',
'install'
]
},
killAllNodeWindows: {
cmd: 'taskkill',
args: [
'/f',
'/im',
'node.exe'
]
},
killAllNodeMac: {
cmd: 'killall',
args: [
'node'
]
jasmine: {
headless: {
options: {
browser: 'chrome',
headless: true,
timeout: 20000,
keepRunner: true,
outfile: '_SpecRunner.html',
host: 'http://localhost:8088',
summary: true,
display: 'short',
reportSlowerThan: 2000,
specs: [
'.grunt/tests.specs.js'
]
}
}
},
jasmine: {
amd: {
src: 'backbone-model-file-upload.js',
host: 'http://localhost:8888/',
connect: {
test: {
options: {
specs: ['test/*spec.js'],
helpers: 'bower_components/Blob/Blob.js',
//keepRunner: true,
template: require('grunt-template-jasmine-requirejs'),
templateOptions: {
requireConfig: {
paths: {
"jquery": "bower_components/jquery/dist/jquery.min",
"underscore": "bower_components/underscore/underscore-min",
"backbone": "bower_components/backbone/backbone"
}
}
port: 8088,
livereload: false,
hostname: '0.0.0.0', // to be able to access the server not only from localhost
base: {
path: '.'
}
}
},
browserGlobal: {
src: 'backbone-model-file-upload.js',
host: 'http://localhost:8888/',
specs: {
options: {
specs: ['test/*spec.js'],
//keepRunner: true,
vendor: [
"bower_components/Blob/Blob.js",
"bower_components/jquery/dist/jquery.min.js",
"bower_components/underscore/underscore-min.js",
"bower_components/backbone/backbone.js"
]
port: 8088,
livereload: false,
open: 'http://localhost:8088/_SpecRunner.html',
hostname: '0.0.0.0',
base: {
path: '.'
}
}
}
}
},
webpack: {
options: {
stats: false
},
test: webpackConfig
}
});
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-webpack');
grunt.loadNpmTasks('grunt-contrib-jasmine');
grunt.loadNpmTasks('grunt-run');
grunt.loadNpmTasks('grunt-run-node');
grunt.registerTask('test', ['build','run_node','jasmine','stop_node']);
grunt.registerTask('build', ['run:installBower']);
grunt.registerTask('resetNodeWin', ['run:killAllNodeWindows']);
grunt.registerTask('resetNodeMac', ['run:killAllNodeMac']);
};
grunt.registerTask('test', ['webpack:test', 'connect:test', 'run_node','jasmine','stop_node']);
grunt.registerTask('test:browser', ['webpack:test', 'connect:specs', 'run_node','jasmine','stop_node']);
};

@ -1,24 +0,0 @@
{
"name": "backbone-model-file-upload",
"description": "A concise, non-iframe, & pure XHR2/AJAX Backbone.model file upload. (Good for IE >= 10, FF, Chrome.)",
"version": "1.0.0",
"main": "backbone-model-file-upload.js",
"keywords": [
"backbone",
"fileupload",
"file",
"model",
"multipart"
],
"author": "Joe Vu",
"license": "MIT",
"bugs": {
"url": "https://github.com/homeslicesolutions/backbone-model-file-upload/issues"
},
"homepage": "https://github.com/homeslicesolutions/backbone-model-file-upload",
"dependencies": {
"jquery": "~2.1.1",
"backbone": "~1.1.2",
"Blob": "*"
}
}

@ -6,16 +6,6 @@
"directories": {
"test": "test"
},
"dependencies": {
"bower": "^1.3.12",
"formidable": "~1.0.15",
"grunt": "^0.4.5",
"grunt-contrib-jasmine": "^0.6.5",
"grunt-run": "^0.3.0",
"grunt-run-node": "^0.1.0",
"grunt-template-jasmine-requirejs": "^0.2.0",
"lodash": "~2.4.1"
},
"scripts": {
"test": "grunt test"
},
@ -36,5 +26,19 @@
"url": "https://github.com/homeslicesolutions/backbone-model-file-upload/issues"
},
"homepage": "https://github.com/homeslicesolutions/backbone-model-file-upload",
"devDependencies": {}
"devDependencies": {
"backbone": "1.2.3",
"blob": "0.0.4",
"grunt": "0.4.5",
"grunt-contrib-connect": "^1.0.2",
"grunt-contrib-jasmine": "CartoDB/grunt-contrib-jasmine#headless-chrome",
"grunt-run": "0.3.0",
"grunt-run-node": "0.1.3",
"grunt-template-jasmine-requirejs": "^0.2.0",
"grunt-webpack": "^3.0.2",
"jquery": "2.1.4",
"underscore": "1.8.3",
"webpack": "^3.5.5",
"formidable": "~1.0.15"
}
}

@ -1,297 +1,298 @@
!function(){
'use strict';
describe('Testing Backbone Model Plugin', function(){
Backbone.$.ajaxSetup({
headers: {
"Access-Control-Allow-Origin": "*"
}
});
var $ = require('jquery');
var Backbone = require('backbone');
var _ = require('underscore');
require('../backbone-model-file-upload');
var Blob = require('blob');
describe('Testing Backbone Model Plugin', function () {
Backbone.$.ajaxSetup({
headers: {
"Access-Control-Allow-Origin": "*"
}
});
var File = Backbone.Model.extend({
url: 'http://localhost:8989/',
fileAttribute: 'fileAttachment'
});
var File = Backbone.Model.extend({
url: 'http://localhost:8989/',
fileAttribute: 'fileAttachment'
});
var fileModel;
var simulatedFileObj;
var fileModel;
var simulatedFileObj;
beforeEach(function(){
beforeEach(function () {
simulatedFileObj = new Blob(['<strong>Hello World</strong>'], {type : 'text/html'});
simulatedFileObj = new Blob(['<strong>Hello World</strong>'], {type : 'text/html'});
fileModel = new File({
from: 'sample@email.com',
subject: 'Hello, friend!',
body: 'Dear friend, Just saying hello! Love, Yours truly.',
nestedObject: {
nest: 'eggs',
nestier: {
nestiest: {
0: 'one',
1: 'two',
2: 'three'
}
fileModel = new File({
from: 'sample@email.com',
subject: 'Hello, friend!',
body: 'Dear friend, Just saying hello! Love, Yours truly.',
nestedObject: {
nest: 'eggs',
nestier: {
nestiest: {
0: 'one',
1: 'two',
2: 'three'
}
}
});
}
});
it('should detect the file(blob) save successfully', function(done){
// Arrange
fileModel.set({fileAttachment: simulatedFileObj});
});
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('sample@email.com');
it('should detect the file(blob) save successfully', function (done) {
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
// Arrange
fileModel.set({fileAttachment: simulatedFileObj});
done();
// Listen
fileModel.on('sync', function(model){
});
// Assert
expect(model.get('from')).toBe('sample@email.com');
// Act
fileModel.save(null);
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
done();
});
it ('should be able to be saved in as an argument of "save" as object', function(done){
// Act
fileModel.save(null);
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('sample@email.com');
});
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
it ('should be able to be saved in as an argument of "save" as object', function (done) {
done();
// Listen
fileModel.on('sync', function(model){
});
// Assert
expect(model.get('from')).toBe('sample@email.com');
// Act
fileModel.save({fileAttachment: simulatedFileObj});
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
done();
});
it ('should be able to be saved in as an argument of "save" as key/value argument', function(done){
// Act
fileModel.save({fileAttachment: simulatedFileObj});
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('sample@email.com');
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
});
done();
it ('should be able to be saved in as an argument of "save" as key/value argument', function (done) {
});
// Listen
fileModel.on('sync', function(model){
// Act
fileModel.save('fileAttachment', simulatedFileObj);
// Assert
expect(model.get('from')).toBe('sample@email.com');
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
done();
});
it ('should be able to have "wait" and "validate" option', function(done){
// Act
fileModel.save('fileAttachment', simulatedFileObj);
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('sample@email.com');
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
});
done();
it ('should be able to have "wait" and "validate" option', function (done) {
});
// Listen
fileModel.on('sync', function(model){
// Act
fileModel.save({fileAttachment: simulatedFileObj},{wait: true, validate: false});
// Assert
expect(model.get('from')).toBe('sample@email.com');
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
done();
});
it('should still have the option to save normally by setting it and save(null)', function(done){
// Act
fileModel.save({fileAttachment: simulatedFileObj},{wait: true, validate: false});
});
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('somethingelse@email.com');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
it('should still have the option to save normally by setting it and save(null)', function (done) {
done();
// Listen
fileModel.on('sync', function(model){
});
// Assert
expect(model.get('from')).toBe('somethingelse@email.com');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
// Act
fileModel.set({from: 'somethingelse@email.com'});
fileModel.save();
done();
});
it('should still have the option to save normally by save("from","yes")', function(done){
// Act
fileModel.set({from: 'somethingelse@email.com'});
fileModel.save();
});
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('yes');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
it('should still have the option to save normally by save("from","yes")', function (done) {
done();
// Listen
fileModel.on('sync', function(model){
});
// Assert
expect(model.get('from')).toBe('yes');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
// Act
fileModel.save('from','yes');
done();
});
it('should still have the option to save normally by save({from: "yes"})', function(done){
// Act
fileModel.save('from','yes');
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('yes');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
});
done();
it('should still have the option to save normally by save({from: "yes"})', function (done) {
// Listen
fileModel.on('sync', function(model){
});
// Assert
expect(model.get('from')).toBe('yes');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
// Act
fileModel.save({from: "yes"});
done();
});
it('should still silent true with file', function(done){
// Act
fileModel.save({from: "yes"});
var changed = false;
});
// Listen
fileModel.on('sync', function(model){
// Assert
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
it('should still silent true with file', function (done) {
setTimeout(function(){
expect(changed).not.toBeTruthy();
done();
},500);
var changed = false;
});
// Listen
fileModel.on('sync', function(model){
fileModel.on('change', function(){
changed = true;
});
// Assert
// Assert Blob (phantomJS can't do Blobs so just test minimal attributes)
expect(model.get('fileAttachment').size).toBe(28);
expect(model.get('fileAttachment').type).toBe('text/html');
//expect(model.get('fileAttachment').data).toBe('data:text/html;base64,PHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPg==');
setTimeout(function(){
expect(changed).not.toBeTruthy();
done();
},500);
// Act
fileModel.save({fileAttachment: simulatedFileObj}, {silent: true});
});
fileModel.on('change', function(){
changed = true;
});
it('should still silent true without file', function(done){
// Act
fileModel.save({fileAttachment: simulatedFileObj}, {silent: true});
var changed = false;
});
// Listen
fileModel.on('sync', function(model){
// Assert
expect(model.get('from')).toBe('yes');
it('should still silent true without file', function (done) {
setTimeout(function(){
expect(changed).not.toBeTruthy();
done();
},500);
var changed = false;
});
// Listen
fileModel.on('sync', function(model){
fileModel.on('change', function(){
changed = true;
});
// Assert
expect(model.get('from')).toBe('yes');
// Act
fileModel.save({from: "yes"}, {silent: true});
setTimeout(function(){
expect(changed).not.toBeTruthy();
done();
},500);
});
it('should flatten correctly using a bracket notation', function(){
// Arrange
var expected = {
"from": "sample@email.com",
"subject": "Hello, friend!",
"body": "Dear friend, Just saying hello! Love, Yours truly.",
"nestedObject[nest]": "eggs",
"nestedObject[nestier[nestiest[0]]]": "one",
"nestedObject[nestier[nestiest[1]]]": "two",
"nestedObject[nestier[nestiest[2]]]": "three"
};
var flattened = fileModel._flatten(fileModel.toJSON());
expect(flattened["nestedObject[nest]"]).toBe("eggs")
expect(flattened["nestedObject[nestier[nestiest[0]]]"]).toBe("one");
expect(flattened["nestedObject[nestier[nestiest[1]]]"]).toBe("two");
expect(flattened["nestedObject[nestier[nestiest[2]]]"]).toBe("three");
fileModel.on('change', function(){
changed = true;
});
it('should unflatten correctly using internal "unflatten" function', function(){
var flattened = fileModel._flatten(fileModel.toJSON()),
unflattened = fileModel._unflatten(flattened);
expect(_.isEqual(unflattened, fileModel.toJSON())).toBeTruthy();
console.log(fileModel._flatten({
'family': 'The Smiths',
'grandpa': {
'name': 'Ole Joe Smith',
'children': [
{
'name': 'Mary Lee',
'spouse': 'John Lee',
'children': [
{
'name': 'Tiny Lee'
}
]
},
{
'name': 'Susan Smith'
}
]
}
}));
// Act
fileModel.save({from: "yes"}, {silent: true});
});
});
it('should flatten correctly using a bracket notation', function () {
// Arrange
var expected = {
"from": "sample@email.com",
"subject": "Hello, friend!",
"body": "Dear friend, Just saying hello! Love, Yours truly.",
"nestedObject[nest]": "eggs",
"nestedObject[nestier[nestiest[0]]]": "one",
"nestedObject[nestier[nestiest[1]]]": "two",
"nestedObject[nestier[nestiest[2]]]": "three"
};
var flattened = fileModel._flatten(fileModel.toJSON());
expect(flattened["nestedObject[nest]"]).toBe("eggs")
expect(flattened["nestedObject[nestier[nestiest[0]]]"]).toBe("one");
expect(flattened["nestedObject[nestier[nestiest[1]]]"]).toBe("two");
expect(flattened["nestedObject[nestier[nestiest[2]]]"]).toBe("three");
});
it('should unflatten correctly using internal "unflatten" function', function () {
var flattened = fileModel._flatten(fileModel.toJSON()),
unflattened = fileModel._unflatten(flattened);
expect(_.isEqual(unflattened, fileModel.toJSON())).toBeTruthy();
console.log(fileModel._flatten({
'family': 'The Smiths',
'grandpa': {
'name': 'Ole Joe Smith',
'children': [
{
'name': 'Mary Lee',
'spouse': 'John Lee',
'children': [
{
'name': 'Tiny Lee'
}
]
},
{
'name': 'Susan Smith'
}
]
}
}));
});
});
}();

@ -1,10 +1,8 @@
'use strict';
var http = require('http'),
formidable = require('formidable'),
fs = require('fs'),
_ = require('lodash');
var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
var _ = require('underscore');
var util = require('util');
var options = {
host: 'localhost',
@ -41,6 +39,7 @@ var server = http.createServer(function(req,res) {
output[i] = {};
// This is fucking async
fs.readFile(files[i].path, function (err, data) {
output[i].type = files[i].type;
@ -49,17 +48,18 @@ var server = http.createServer(function(req,res) {
output[i].lastModifiedDate = files[i].lastModifiedDate;
output[i].data = 'data:' + files[i].type + ';base64,' + data.toString('base64');
console.info(output);
res.end(JSON.stringify(output));
});
}
}
} else {
console.info(output);
res.end(JSON.stringify(output));
}
console.info(output);
res.end(JSON.stringify(output));
});
});
@ -83,4 +83,4 @@ function unflatten(obj, output) {
}
server.listen(options.port, options.host);
console.log("listening on " + options.host + ':' + options.port);
console.info("listening on " + options.host + ':' + options.port);

@ -0,0 +1,10 @@
var path = require('path');
module.exports = {
entry: './test/backbone-model-file-upload.spec.js',
output: {
path: path.resolve(path.resolve('.'), '.grunt'),
filename: 'tests.specs.js'
},
devtool: 'inline-source-map'
};
Loading…
Cancel
Save