Skip to content

Instantly share code, notes, and snippets.

@burt202
Last active August 29, 2015 14:06
Show Gist options
  • Save burt202/1708d7987059ef84bc07 to your computer and use it in GitHub Desktop.
Save burt202/1708d7987059ef84bc07 to your computer and use it in GitHub Desktop.
Playing With Promises
node_modules
{
"name": "promise-tests",
"version": "0.0.1",
"dependencies": {
"q": "1.0.1",
"underscore": "1.7.0",
"jasmine-node": "1.14.5"
}
}
var UserService = require("./service");
var userService;
describe("user service with promises", function () {
beforeEach(function () {
userService = new UserService();
});
afterEach(function () {
userService = null;
});
it("should successfully list all users", function (done) {
userService.create({ title: "mr", name: "foo"})
.then(function () { return userService.create({ title: "mrs", name: "bar"}); })
.then(function () { return userService.clone(2, {name: "baz"}); })
.then(function () {
expect(userService.getAll()).toEqual([
{ title: "mr", name: "foo", id: 1},
{ title: "mrs", name: "bar", id: 2},
{ title: "mrs", name: "baz", id: 3}
]);
done();
})
.done();
});
it("should fail with error 'There was an error finding the user'", function (done) {
userService.create({ title: "mr", name: "foo"})
.then(function () { return userService.create({ title: "mrs", name: "bar"}); })
.then(function () { return userService.clone(4, {name: "baz"}); })
.fail(function (err) {
expect(err.message).toEqual("There was an error finding the user");
done();
})
.done();
});
it("should fail with error 'User must have a name'", function (done) {
userService.create({ title: "mr", name: "foo"})
.then(function () { return userService.create({ title: "mrs", name: "bar"}); })
.then(function () { return userService.clone(2, {name: ""}); })
.fail(function (err) {
expect(err.message).toEqual("User must have a name");
done();
})
.done();
});
it("should fail with error 'User with that name already exists'", function (done) {
userService.create({ title: "mr", name: "foo"})
.then(function () { return userService.create({ title: "mrs", name: "bar"}); })
.then(function () { return userService.clone(2, {name: "bar"}); })
.fail(function (err) {
expect(err.message).toEqual("User with that name already exists");
done();
})
.done();
});
});
var q = require("q");
var _ = require("underscore");
var UserService = function () {
var users = [];
var insertId = 0;
return {
get: function (id) {
var deferred = q.defer();
var user = _.findWhere(users, {id: id});
if (!user) {
deferred.reject(new Error("There was an error finding the user"));
} else {
deferred.resolve(_.clone(user));
}
return deferred.promise;
},
getAll: function () {
return users;
},
create: function (data) {
var deferred = q.defer();
if (!data.name || data.name === "") {
deferred.reject(new Error("User must have a name"));
return deferred.promise;
}
var nameAlreadyTaken = _.findWhere(users, {name: data.name});
if (nameAlreadyTaken) {
deferred.reject(new Error("User with that name already exists"));
return deferred.promise;
}
insertId++;
data.id = insertId;
users.push(data);
deferred.resolve(data);
return deferred.promise;
},
clone: function (userId, overrides) {
var deferred = q.defer();
this.get(userId)
.then(function (data) {
var clonedUser = _.extend(data, overrides);
delete clonedUser.id;
return this.create(clonedUser);
}.bind(this))
.then(function (data) {
deferred.resolve(data);
})
.fail(function (err) {
deferred.reject(err);
});
return deferred.promise;
}
};
};
module.exports = UserService;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment