You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

327 lines
9.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

var assert = require('assert');
var humps = require('../humps');
describe('humps', function() {
'use strict';
var actual;
// =========
// = Setup =
// =========
beforeEach(function() {
this.simple_obj = {
attr_one: 'foo',
attr_two: 'bar'
};
this.simpleCamelObj = {
attrOne: 'foo',
attrTwo: 'bar'
};
this.simplePascalObj = {
AttrOne: 'foo',
AttrTwo: 'bar'
};
this.complex_obj = {
attr_one: 'foo',
attr_two: {
nested_attr1: 'bar'
},
attr_three: {
nested_attr2: {
nested_attr3: [{
nested_in_array1: 'baz'
}, {
nested_in_array2: 'hello'
}, {
nested_in_array3: ['world', 'boo']
}]
}
}
};
this.complexCamelObj = {
attrOne: 'foo',
attrTwo: {
nestedAttr1: 'bar'
},
attrThree: {
nestedAttr2: {
nestedAttr3: [{
nestedInArray1: 'baz'
}, {
nestedInArray2: 'hello'
}, {
nestedInArray3: ['world', 'boo']
}]
}
}
};
this.complexPascalObj = {
AttrOne: 'foo',
AttrTwo: {
NestedAttr1: 'bar'
},
AttrThree: {
NestedAttr2: {
NestedAttr3: [{
NestedInArray1: 'baz'
}, {
NestedInArray2: 'hello'
}, {
NestedInArray3: ['world', 'boo']
}]
}
}
};
this.complexIgnoringNumbersObj = {
attr_one: 'foo',
attr_two: {
nested_attr1: 'bar'
},
attr_three: {
nested_attr2: {
nested_attr3: [{
nested_in_array1: 'baz'
}, {
nested_in_array2: 'hello'
}, {
nested_in_array3: ['world', 'boo']
}]
}
}
};
this.complexCustomObj = {
'attr-one': 'foo',
'attr-two': {
'nested-attr1': 'bar'
},
'attr-three': {
'nested-attr2': {
'nested-attr3': [{
'nested-in-array1': 'baz'
}, {
'nested-in-array2': 'hello'
}, {
'nested-in-array3': ['world', 'boo']
}]
}
}
};
});
// =========
// = Specs =
// =========
describe('.camelizeKeys', function() {
it('converts simple object keys to camelcase', function() {
assert.deepEqual(humps.camelizeKeys(this.simple_obj), this.simpleCamelObj);
});
it('converts complex object keys to camelcase', function() {
assert.deepEqual(humps.camelizeKeys(this.complex_obj), this.complexCamelObj);
});
it('does not attempt to process dates', function() {
'work in progress';
var date = new Date();
var _object = {
a_date: date
};
var convertedObject = {
aDate: date
};
assert.deepEqual(humps.camelizeKeys(_object), convertedObject);
});
it('converts keys within arrays of objects', function() {
var array = [{first_name: 'Sam'}, {first_name: 'Jenna'}],
convertedArray = [{firstName: 'Sam'}, {firstName: 'Jenna'}],
result = humps.camelizeKeys(array);
assert.deepEqual(result, convertedArray);
// Ensure its an array, and not an object with numeric keys
assert.deepEqual(toString.call(result), '[object Array]');
});
describe("when the value is a function", function() {
it('converts the key and assigns the function', function() {
function myFunction() {
}
var _object = {
a_function: myFunction
};
var result = humps.camelizeKeys(_object);
// deepEqual treats functions as the same as an empty object
assert.strictEqual(result.aFunction, myFunction);
});
});
it('uses a custom convertion callback', function() {
actual = humps.camelizeKeys(this.simple_obj, function(key, convert) {
return key === 'attr_one' ? key : convert(key);
});
assert.deepEqual(actual, { attr_one: 'foo', attrTwo: 'bar' });
});
});
describe('.decamelizeKeys', function() {
it('converts simple objects with camelcased keys to underscored', function() {
assert.deepEqual(humps.decamelizeKeys(this.simpleCamelObj), this.simple_obj);
});
it('converts complex objects with camelcased keys to underscored', function() {
assert.deepEqual(humps.decamelizeKeys(this.complexCamelObj), this.complex_obj);
});
it('decamelizes keys with a custom separator', function() {
actual = humps.decamelizeKeys(this.complexCamelObj, { separator: '-' });
assert.deepEqual(actual, this.complexCustomObj);
});
it('uses a custom split regexp', function() {
actual = humps.decamelizeKeys({ attr1: 'foo' }, { split: /(?=[A-Z0-9])/ });
assert.deepEqual(actual, { attr_1: 'foo' });
});
it('uses a custom convertion callback', function() {
actual = humps.decamelizeKeys(this.simpleCamelObj, function(key, convert, options) {
return key === 'attrOne' ? key : convert(key, options);
});
assert.deepEqual(actual, { attrOne: 'foo', attr_two: 'bar' });
});
describe("when the value is a function", function() {
it('converts the key and assigns the function', function() {
function myFunction() {
}
var _object = {
aFunction: myFunction
};
var result = humps.decamelizeKeys(_object);
// deepEqual treats functions as the same as an empty object
assert.strictEqual(result.a_function, myFunction);
});
});
it('uses a custom convertion callback as an option', function() {
actual = humps.decamelizeKeys(this.simpleCamelObj, {
process: function(key, convert, options) {
return key === 'attrOne' ? key : convert(key, options);
}
});
assert.deepEqual(actual, { attrOne: 'foo', attr_two: 'bar' });
});
});
describe('.pascalizeKeys', function() {
it('converts simple object keys to PascalCase', function() {
assert.deepEqual(humps.pascalizeKeys(this.simple_obj), this.simplePascalObj);
});
it('converts complex object keys to PascalCase', function() {
assert.deepEqual(humps.pascalizeKeys(this.complex_obj), this.complexPascalObj);
});
it('does not attempt to process dates', function() {
'work in progress';
var date = new Date();
var _object = {
a_date: date
};
var convertedObject = {
ADate: date
};
assert.deepEqual(humps.pascalizeKeys(_object), convertedObject);
});
it('uses a custom convertion callback', function() {
actual = humps.pascalizeKeys(this.simple_obj, function(key, convert) {
return key === 'attr_one' ? key : convert(key);
});
assert.deepEqual(actual, { attr_one: 'foo', AttrTwo: 'bar' });
});
});
describe('.depascalizeKeys', function() {
it('converts simple object with PascalCase keys to underscored', function() {
assert.deepEqual(humps.depascalizeKeys(this.simplePascalObj), this.simple_obj);
});
it('converts complex object with PascalCase keys to underscored', function() {
assert.deepEqual(humps.depascalizeKeys(this.complexPascalObj), this.complex_obj);
});
it('depascalizes keys with a custom separator', function() {
actual = humps.depascalizeKeys(this.complexPascalObj, { separator: '-' });
assert.deepEqual(actual, this.complexCustomObj);
});
});
describe('.camelize', function() {
it('converts underscored strings to camelcase', function() {
assert.equal(humps.camelize('hello_world'), 'helloWorld');
});
it('converts hyphenated strings to camelcase', function() {
assert.equal(humps.camelize('hello-world'), 'helloWorld');
assert.equal(humps.camelize('hello-world-1'), 'helloWorld1');
});
it('converts space-separated strings to camelcase', function() {
assert.equal(humps.camelize('hello world'), 'helloWorld');
});
it('converts PascalCased strings to camelcase', function() {
assert.equal(humps.camelize('HelloWorld'), 'helloWorld');
});
it('keeps numbers unchanged', function() {
assert.equal(humps.camelize('-1'), '-1');
assert.equal(humps.camelize('1'), '1');
});
});
describe('.decamelize', function() {
it('converts camelcased strings to underscored', function() {
assert.equal(humps.decamelize('helloWorld'), 'hello_world');
});
it('decamelizes strings with custom separator', function() {
actual = humps.decamelize('helloWorld', { separator: '-' });
assert.equal(actual, 'hello-world');
});
it('does not separate on digits', function() {
assert.equal(humps.decamelize('helloWorld1'), 'hello_world1');
});
it('uses a custom split regexp', function() {
assert.equal(humps.decamelize('helloWorld1', { split: /(?=[A-Z0-9])/ }),
'hello_world_1');
});
});
describe('.pascalize', function() {
it('converts underscored strings to PascalCase', function() {
assert.equal(humps.pascalize('hello_world'), 'HelloWorld');
});
it('converts hyphenated strings to PascalCase', function() {
assert.equal(humps.pascalize('hello-world'), 'HelloWorld');
});
it('converts space-separated strings to PascalCase', function() {
assert.equal(humps.pascalize('hello world'), 'HelloWorld');
});
});
});