2.6.0 • Published 8 years ago

moldy-mongo-adapter v2.6.0

Weekly downloads
108
License
MIT
Repository
github
Last release
8 years ago

TOC

moldy-mongo-adapter

create

should create by a property.

var personMoldy = Moldy.extend('person', {
	properties: {
		name: '',
		age: ''
	}
}).create();
personMoldy.name = 'David';
personMoldy.$save(function (_error) {
	personMoldy.name.should.eql('David');
	_done(_error);
});

get

define a JSON schema.

schema = {
	properties: {
		name: 'string',
		friends: [{
			keyless: true,
			properties: {
				name: {
					type: 'string',
					default: ''
				},
				age: {
					type: 'number',
					default: 0
				}
			}
		}]
	}
};

should create a new person so we can get it next.

var personMoldy = Moldy.extend('person', schema).create();
personMoldy.name = 'Mr David';
personMoldy.friends.push({
	name: 'leonie'
});
personMoldy.friends[0].age = ' 33';
personMoldy.friends.push({
	name: 'max'
});
personMoldy.$save(function (_error) {
	newPersonId = personMoldy.id;
	_done(_error);
});

should handle not found items.

var personMoldy = Moldy.extend('person', schema);
personMoldy.$findOne({
	id: 'non-existant id'
}, function (_error, _item) {
	should.not.exist(_error);
	should(_item).eql(undefined);
	_done();
});

should get by a id from the previous example.

var personMoldy = Moldy.extend('person', schema);
personMoldy.$findOne({
	id: newPersonId
}, function (_error, _david) {
	if (_error) {
		return _done(_error);
	}
	var david = _david;
	david.name.should.eql('Mr David');
	david.friends.should.be.an.Array;
	david.friends.should.have.a.lengthOf(2);
	david.friends[0].name.should.equal('leonie');
	david.friends[0].age.should.equal(33);
	david.friends[1].name.should.equal('max');
	david.friends[1].age.should.equal(0);
	david.$destroy(_done);
});

find

should get an array of models.

personMoldy.$find(function (_error, _people) {
	if (_error) {
		return _done(_error);
	}
	_people.should.be.an.Array;
	_people.length.should.greaterThan(0);
	_people.forEach(function (_person) {
		_person.should.be.a.Moldy;
		_person.should.have.a.property('id');
		_person.should.have.a.property('name');
		_person.should.have.a.property('age');
		Object.keys(_person.$json()).should.have.a.lengthOf(3);
	});
	_done();
});

should be sorted by orderBy.

async.parallel({
	ascending: function (_next) {
		personMoldy.$find({
			__orderBy: 'age'
		}, function (_error, _people) {
			if (_error) {
				return _done(_error);
			}
			_people.should.be.an.Array;
			_people.length.should.be.equal(30);
			_people[9].age.should.be.greaterThan(_people[0].age);
			_people[15].age.should.be.greaterThan(_people[5].age);
			_next();
		});
	},
	descending: function (_next) {
		personMoldy.$find({
			__orderBy: '-age'
		}, function (_error, _people) {
			if (_error) {
				return _done(_error);
			}
			_people.should.be.an.Array;
			_people.length.should.be.greaterThan(10);
			_people[0].age.should.be.greaterThan(_people[9].age);
			_people[5].age.should.be.greaterThan(_people[15].age);
			_next();
		});
	},
	twoFields: function (_next) {
		personMoldy.$find({
			__orderBy: '-age,name'
		}, function (_error, _people) {
			if (_error) {
				return _done(_error);
			}
			_people.should.be.an.Array;
			_people.length.should.equal(30);
			_people[0].age.should.be.greaterThan(_people[9].age);
			_people[5].age.should.be.greaterThan(_people[15].age);
			_next();
		});
	}
}, _done);

should allow for paged results.

async.parallel({
	defaultPerPage1: function (_next) {
		personMoldy.$find({
			__page: 1
		}, function (_error, _people) {
			if (_error) {
				return _done(_error);
			}
			_people.length.should.equal(20);
			_people[0].age.should.equal(0);
			_next();
		});
	},
	defaultPerPage2: function (_next) {
		personMoldy.$find({
			__page: 2
		}, function (_error, _people) {
			if (_error) {
				return _done(_error);
			}
			// there are only 30 results so page 2 has 10 results
			_people.length.should.equal(10);
			_people[0].age.should.equal(20);
			_next();
		});
	},
	customPerPage: function (_next) {
		personMoldy.$find({
			__page: 1,
			__perPage: 15
		}, function (_error, _people) {
			if (_error) {
				return _done(_error);
			}
			_people.length.should === 15;
			_people[0].age.should === 0;
			_people[14].age.should === 14;
			_next();
		});
	}
}, _done);

should allow for ordered paged results.

personMoldy.$find({
	__page: 2,
	__perPage: 10,
	__orderBy: '-age'
}, function (_error, _people) {
	if (_error) {
		return _done(_error);
	}
	_people.length.should.equal(10);
	_people[0].age.should.not.equal(30); // the highest age
	_people[9].age.should.not.equal(0); // the lowest age
	_people[0].age.should.be.greaterThan(_people[9].age);
	_done();
});

save

create a schema.

schema = {
	properties: {
		name: 'string',
		age: {
			type: 'number',
			default: 0
		},
		backpack: {
			keyless: true,
			properties: {
				mainCompartment: {
					type: 'string',
					default: 'comic books',
				},
				leftPocket: {
					type: 'string',
					default: 'chewing gum',
				}
			}
		},
		friends: [{
			keyless: true,
			properties: {
				name: {
					type: 'string',
					default: ''
				},
				age: {
					type: 'number',
					default: 0
				}
			}
		}]
	}
};

should save a model.

var personMoldy = Moldy.extend('person', schema);
personMoldy.$findOne(function (_error, _person) {
	if (_error) {
		return _done(_error);
	}
	var person = _person;
	key = person.id;
	person.name = 'Mr David';
	person.friends.push({
		name: 'leonie'
	});
	person.friends.push({
		name: 'max'
	});
	person.friends.push({
		name: 'david'
	});
	person.$save(function (_error) {
		if (_error) {
			return _done(_error);
		}
		var newPersonMoldy = Moldy.extend('person', schema);
		newPersonMoldy.$findOne({
			id: key
		}, function (_error, newPerson) {
			newPerson.id.should.equal(key);
			newPerson.friends.splice(1, 1);
			newPerson.$save(function (_error) {
				if (_error) {
					return _done(_error);
				}
				var newNewPersonMoldy = Moldy.extend('person', schema);
				newNewPersonMoldy.$findOne({
					id: key
				}, function (_error, _newNewPersonMoldy) {
					_newNewPersonMoldy.friends.should.have.a.lengthOf(2);
					_newNewPersonMoldy.friends[1].name.should.equal('david');
					_done();
				});
			});
		});
	});
});

should update a model.

function getMoldyPerson(_pDone) {
			Moldy.extend('person', schema).$findOne({
				id: key
			}, _pDone);
		}
		async.parallel({
			// Get two Moldy references to the same thing.
			person1: getMoldyPerson,
			person2: getMoldyPerson,
		}, function (_error, _people) {
			if (_error) return _done(_error);
			async.series([
				// Update a property of each, individually.
				function (_sDone) {
					_people.person1.backpack.mainCompartment = 'precious vase';
					_people.person1.$update(_sDone);
				},
				function (_sDone) {
					_people.person2.backpack.leftPocket = 'instruction manual';
					_people.person2.$update(_sDone);
				},
			], function (_error) {
				if (_error) return _done(_error);
				// Get another reference of the moldy thing and check whether The
				// update method has updated or clobbered the data
				getMoldyPerson(function (_error, _person) {
					if (_error) return _done(_error);
					_person.backpack.mainCompartment.should.eql('precious vase');
					_person.backpack.leftPocket.should.eql('instruction manual');
					_done();
				});
			});
		});

should bypass moldy and do an $inc operation.

var personMoldy = Moldy.extend('person', schema);
personMoldy.$findOne({
	id: key
}, function (_error, _person) {
	if (_error) {
		return _done(_error);
	}
	_person.age.should.eql(0);
	_person.friends[0].age.should.eql(0);
	var specialUpdate = {
		id: _person.id,
		$inc: {
			age: 1
		}
	};

	_person.$save(specialUpdate, function (_error, _updatedUser) {
		if (_error) {
			return _done(_error);
		}
		_updatedUser.age.should.eql(1);
		_person.age.should.eql(1);
		var newPersonMoldy = Moldy.extend('person', schema);
		newPersonMoldy.$findOne({
			id: key
		}, function (_error, newPerson) {
			newPerson.id.should.equal(key);
			newPerson.age.should.eql(1);
			_done(_error);
		});
	});
});

should bypass moldy and do an upsert.

var ObjectID = require('mongodb').ObjectID;
var personMoldy = Moldy.extend('person', schema);
var specialPerson = personMoldy.create({
	id: '000000000000000000001337',
	name: 'Mr Upsert'
});
var specialUpdate = specialPerson.$json();
specialUpdate._id = new ObjectID('000000000000000000001337');
specialPerson.$save(specialUpdate, function (_error, _updatedUser) {
	if (_error) {
		return _done(_error);
	}
	specialPerson.id.should.eql('000000000000000000001337');
	_updatedUser.id.should.eql('000000000000000000001337');
	specialPerson.name.should.eql('Mr Upsert');
	_updatedUser.name.should.eql('Mr Upsert');
	personMoldy.$findOne({
		name: 'Mr Upsert'
	}, function (_error, newPerson) {
		newPerson.id.should.equal('000000000000000000001337');
		newPerson.name.should.eql('Mr Upsert');
		_done(_error);
	});
});

destroy

define a JSON schema.

schema = {
	properties: {
		name: 'string'
	}
};

should destroy all the models.

var personMoldy = Moldy.extend('person', schema);
personMoldy.$find(function (_error, _guys) {
	_guys.length.should.be.greaterThan(0);
	var deleteGuy = function (_guy) {
		personMoldy.$find(function (_error, _guys) {
			if (_guys.length === 0) {
				return _done();
			}
			var guy = Moldy.extend('person', schema);
			guy.$findOne({
				id: _guys[0].id
			}, function (_error, _guy) {
				if (_error) {
					return _done(_error);
				}
				_guy.$destroy(function (_error) {
					if (_error) {
						return _done(_error);
					}
					deleteGuy();
				});
			});
		});
	};
	deleteGuy();
});
2.6.0

8 years ago

2.5.0

8 years ago

2.4.1

8 years ago

2.4.0

8 years ago

2.4.0-0

8 years ago

2.3.0

8 years ago

2.2.0

9 years ago

2.1.0

9 years ago

2.0.0

9 years ago

1.2.2

10 years ago

1.2.1

10 years ago

1.2.0

10 years ago

1.1.2

10 years ago

1.1.1

10 years ago

1.1.0

10 years ago

1.0.1

10 years ago

1.0.0

10 years ago

0.0.8

10 years ago

0.0.7

10 years ago