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'); }); });