149 lines
4.5 KiB
JavaScript
149 lines
4.5 KiB
JavaScript
var expect = require("expect.js"),
|
|
dottie = require('../dottie');
|
|
|
|
/* If people modify the array prototype Dottie should not be affected */
|
|
Array.prototype.getByName = function(name) {
|
|
for (var i = 0, len = this.length; i < len; i++) {
|
|
if (typeof this[i] != "object") continue;
|
|
if (this[i].name === name) return this[i];
|
|
|
|
}
|
|
};
|
|
Array.prototype.getByType = function(type) {
|
|
var newvalues = [];
|
|
for (var i = 0, len = this.length; i < len; i++) {
|
|
if (typeof this[i] != "object") continue;
|
|
if (this[i].type === type) newvalues.push(this[i]);
|
|
}
|
|
if (newvalues.length <= 0) newvalues = undefined;
|
|
return newvalues;
|
|
};
|
|
|
|
describe("dottie.transform", function () {
|
|
it("should create a properly nested object from a basic dottie notated set of keys", function () {
|
|
var values = {
|
|
'user.name': 'John Doe',
|
|
'user.email': 'jd@foobar.com',
|
|
'user.location.country': 'Zanzibar',
|
|
'user.location.city': 'Zanzibar City'
|
|
};
|
|
|
|
var transformed = dottie.transform(values);
|
|
|
|
expect(transformed.user).not.to.be(undefined);
|
|
expect(transformed.user.location).not.to.be(undefined);
|
|
|
|
expect(transformed.user).to.be.an('object');
|
|
expect(transformed.user.location).to.be.an('object');
|
|
|
|
expect(transformed.user.email).to.equal('jd@foobar.com');
|
|
expect(transformed.user.location.city).to.equal('Zanzibar City');
|
|
});
|
|
|
|
it("should be able to handle a mixture of nested properties and dottie notated set of keys", function () {
|
|
var values = {
|
|
user: {
|
|
name: 'John Doe'
|
|
},
|
|
'user.email': 'jd@foobar.com',
|
|
'user.location.country': 'Zanzibar',
|
|
'user.location.city': 'Zanzibar City',
|
|
'project.title': 'dottie'
|
|
};
|
|
|
|
var transformed = dottie.transform(values);
|
|
|
|
expect(transformed.user).not.to.be(undefined);
|
|
expect(transformed.user.location).not.to.be(undefined);
|
|
expect(transformed.project).not.to.be(undefined);
|
|
|
|
expect(transformed.user).to.be.an('object');
|
|
expect(transformed.user.location).to.be.an('object');
|
|
expect(transformed.project).to.be.an('object');
|
|
|
|
expect(transformed.user.email).to.equal('jd@foobar.com');
|
|
expect(transformed.user.location.city).to.equal('Zanzibar City');
|
|
expect(transformed.project.title).to.equal('dottie');
|
|
});
|
|
|
|
it("should be able to handle base level properties together with nested", function () {
|
|
var values = {
|
|
'customer.name': 'John Doe',
|
|
'customer.age': 15,
|
|
'client': 'Lolcat'
|
|
};
|
|
|
|
var transformed = dottie.transform(values);
|
|
|
|
expect(transformed.client).not.to.be(undefined);
|
|
expect(transformed.hasOwnProperty('client')).to.be.ok(); // Ensure that the property is actually on the object itself, not on the prototype.
|
|
expect(transformed.customer).not.to.be(undefined);
|
|
|
|
expect(transformed.customer).to.be.an('object');
|
|
|
|
expect(transformed.client).to.equal('Lolcat');
|
|
expect(transformed.customer.name).to.equal('John Doe');
|
|
expect(transformed.customer.age).to.equal(15);
|
|
});
|
|
|
|
it("should be able to handle null valued properties, not assigning nested level objects", function() {
|
|
var values = {
|
|
'section.id': 20,
|
|
'section.layout': null,
|
|
'section.layout.id': null,
|
|
'section.layout.name': null
|
|
};
|
|
|
|
var transformed = dottie.transform(values);
|
|
|
|
expect(transformed.section.layout).to.be(null);
|
|
expect(transformed['section.layout.id']).to.be(undefined);
|
|
expect(transformed['section.layout.name']).to.be(undefined);
|
|
});
|
|
|
|
it("supports arrays", function () {
|
|
var values = [
|
|
{
|
|
'customer.name': 'John Doe',
|
|
'customer.age': 15,
|
|
'client': 'Lolcat'
|
|
},
|
|
{
|
|
'client.name': 'John Doe',
|
|
'client.age': 15,
|
|
'customer': 'Lolcat'
|
|
}
|
|
];
|
|
|
|
var transformed = dottie.transform(values);
|
|
expect(transformed[0].customer.name).to.equal('John Doe');
|
|
expect(transformed[1].client.name).to.equal('John Doe');
|
|
});
|
|
|
|
it("supports custom delimiters", function () {
|
|
var values = {
|
|
user: {
|
|
name: 'John Doe'
|
|
},
|
|
'user_email': 'jd@foobar.com',
|
|
'user_location_country': 'Zanzibar',
|
|
'user_location_city': 'Zanzibar City',
|
|
'project_title': 'dottie'
|
|
};
|
|
|
|
var transformed = dottie.transform(values, { delimiter: '_' });
|
|
|
|
expect(transformed.user).not.to.be(undefined);
|
|
expect(transformed.user.location).not.to.be(undefined);
|
|
expect(transformed.project).not.to.be(undefined);
|
|
|
|
expect(transformed.user).to.be.an('object');
|
|
expect(transformed.user.location).to.be.an('object');
|
|
expect(transformed.project).to.be.an('object');
|
|
|
|
expect(transformed.user.email).to.equal('jd@foobar.com');
|
|
expect(transformed.user.location.city).to.equal('Zanzibar City');
|
|
expect(transformed.project.title).to.equal('dottie');
|
|
});
|
|
});
|