Merge branch 'api-v3' into api-v3-groups

This commit is contained in:
Blade Barringer
2015-12-30 08:30:43 -06:00
47 changed files with 458 additions and 577 deletions
+12 -13
View File
@@ -4,7 +4,7 @@ That's great! This README will serve as a quick primer for style conventions and
## What is this?
These are integration tests for the Habitica API. They are performed by making REST requests to the API's endpoints and asserting on the data that is returned.
These are integration tests for the Habitica API. They are performed by making HTTP requests to the API's endpoints and asserting on the data that is returned.
If the javascript looks weird to you, that's because it's written in [ES2015](http://www.ecma-international.org/ecma-262/6.0/) and transpiled by [Babel](https://babeljs.io/docs/learn-es2015/).
@@ -39,7 +39,6 @@ $ gulp test:api:safe
If you'd like to run the tests individually and inspect the output from the server, in one pane you can run:
```bash
$ export PORT=3003; export NODE_DB_URI="mongodb://localhost/habitrpgtest"
$ gulp nodemon
```
@@ -71,22 +70,24 @@ POST-groups_id_leave.test.js
## Promises
To mitigate [callback hell](http://callbackhell.com/) :imp:, we've written helper methods that [return promises](https://babeljs.io/docs/learn-es2015/#promises). This makes it very easy to chain together commands. All you need to do to make a subsequent request is return another promise and then call `.then((result) => {})` on the surrounding block, like so:
To mitigate [callback hell](http://callbackhell.com/) :imp:, we've written a helper method to generate a user object that can make http requests that [return promises](https://babeljs.io/docs/learn-es2015/#promises). This makes it very easy to chain together commands. All you need to do to make a subsequent request is return another promise and then call `.then((result) => {})` on the surrounding block, like so:
```js
it('does something', () => {
let request;
return generateUser().then((user) => { // We return the initial promise so this test can be run asyncronously
request = requester(user);
return request.post('/groups', {
let user;
return generateUser().then((_user) => { // We return the initial promise so this test can be run asyncronously
user = _user;
return user.post('/groups', {
type: 'party',
});
}).then((party) => { // the result of the promise above is the argument of the function
return request.put(`/groups/${party._id}`, {
return user.put(`/groups/${party._id}`, {
name: 'My party',
});
}).then((result) => {
return request.get('/groups/party');
return user.get('/groups/party');
}).then((party) => {
expect(party.name).to.eql('My party');
});
@@ -97,8 +98,7 @@ If the test is simple, you can use the [chai-as-promised](http://chaijs.com/plug
```js
it('makes the party creator the leader automatically', () => {
let api = requester(user);
return expect(request.post('/groups', {
return expect(user.post('/groups', {
type: 'party',
})).to.eventually.have.deep.property('leader._id', user._id);
});
@@ -108,8 +108,7 @@ If the test is checking that the request returns an error, use the `.eventually.
```js
it('returns an error', () => {
let api = requester(user);
return expect(request.get('/groups/id-of-a-party-that-user-does-not-belong-to'))
return expect(user.get('/groups/id-of-a-party-that-user-does-not-belong-to'))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupNotFound'),
+6 -9
View File
@@ -2,14 +2,13 @@ import {
generateGroup,
generateUser,
resetHabiticaDB,
requester,
} from '../../../helpers/api-integration.helper';
describe('GET /groups', () => {
const NUMBER_OF_PUBLIC_GUILDS = 3;
const NUMBER_OF_USERS_GUILDS = 2;
let user, api;
let user;
before(() => {
let leader, createdGroup;
@@ -26,7 +25,6 @@ describe('GET /groups', () => {
});
}).then((_user) => {
leader = _user;
api = requester(leader);
let publicGuildWithUserAsMember = generateGroup(leader, {
name: 'public guild - is member',
@@ -70,8 +68,7 @@ describe('GET /groups', () => {
return Promise.all(promises);
}).then((groups) => {
api = requester(user);
return api.post('/groups', {
return user.post('/groups', {
type: 'party',
name: 'user\'s party',
privacy: 'private',
@@ -87,7 +84,7 @@ describe('GET /groups', () => {
context('tavern passed in as query', () => {
it('returns only the tavern', () => {
return expect(api.get('/groups', null, {type: 'tavern'}))
return expect(user.get('/groups', null, {type: 'tavern'}))
.to.eventually.have.a.lengthOf(1)
.and.to.have.deep.property('[0]')
.and.to.have.property('_id', 'habitrpg');
@@ -97,7 +94,7 @@ describe('GET /groups', () => {
context('party passed in as query', () => {
it('returns only the user\'s party', () => {
return expect(api.get('/groups', null, {type: 'party'}))
return expect(user.get('/groups', null, {type: 'party'}))
.to.eventually.have.a.lengthOf(1)
.and.to.have.deep.property('[0]')
.and.to.have.property('leader', user._id);
@@ -107,7 +104,7 @@ describe('GET /groups', () => {
context('public passed in as query', () => {
it('returns all public guilds', () => {
return expect(api.get('/groups', null, {type: 'public'}))
return expect(user.get('/groups', null, {type: 'public'}))
.to.eventually.have.a.lengthOf(NUMBER_OF_PUBLIC_GUILDS);
});
});
@@ -115,7 +112,7 @@ describe('GET /groups', () => {
context('guilds passed in as query', () => {
it('returns all guilds user is a part of ', () => {
return expect(api.get('/groups', null, {type: 'guilds'}))
return expect(user.get('/groups', null, {type: 'guilds'}))
.to.eventually.have.a.lengthOf(NUMBER_OF_USERS_GUILDS);
});
});
+18 -29
View File
@@ -1,7 +1,6 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
import {
@@ -36,8 +35,7 @@ describe('GET /groups/:id', () => {
});
it('returns the group object', () => {
let api = requester(member);
return api.get(`/groups/${createdGroup._id}`).then((group) => {
return member.get(`/groups/${createdGroup._id}`).then((group) => {
expect(group._id).to.eql(createdGroup._id);
expect(group.name).to.eql(createdGroup.name);
expect(group.type).to.eql(createdGroup.type);
@@ -46,8 +44,7 @@ describe('GET /groups/:id', () => {
});
it('transforms members array to an array of user objects', () => {
let api = requester(member);
return api.get(`/groups/${createdGroup._id}`).then((group) => {
return member.get(`/groups/${createdGroup._id}`).then((group) => {
let member = group.members[0];
expect(member._id).to.exist;
expect(member.profile.name).to.exist;
@@ -58,8 +55,7 @@ describe('GET /groups/:id', () => {
});
it('transforms leader id to leader object', () => {
let api = requester(member);
return api.get(`/groups/${createdGroup._id}`).then((group) => {
return member.get(`/groups/${createdGroup._id}`).then((group) => {
expect(group.leader._id).to.eql(leader._id);
expect(group.leader.profile.name).to.eql(leader.profile.name);
expect(group.leader.items).to.exist;
@@ -70,8 +66,7 @@ describe('GET /groups/:id', () => {
});
it('includes the user in the members list', () => {
let api = requester(member);
return api.get(`/groups/${createdGroup._id}`).then((group) => {
return member.get(`/groups/${createdGroup._id}`).then((group) => {
let members = group.members;
let userInGroup = find(members, (user) => {
return member._id === user._id;
@@ -148,16 +143,16 @@ describe('GET /groups/:id', () => {
});
context('non-admin', () => {
let api;
let nonAdmin;
beforeEach(() => {
return generateUser().then((user) => {
api = requester(user);
nonAdmin = user;
});
});
it('does not include messages with a flag count of 2 or greater', () => {
return api.get(`/groups/${group._id}`).then((_group) => {
return nonAdmin.get(`/groups/${group._id}`).then((_group) => {
expect(_group.chat).to.have.lengthOf(3);
expect(_group.chat[0].id).to.eql(chat1.id);
expect(_group.chat[1].id).to.eql(chat2.id);
@@ -166,7 +161,7 @@ describe('GET /groups/:id', () => {
});
it('does not include user ids in flags object', () => {
return api.get(`/groups/${group._id}`).then((_group) => {
return nonAdmin.get(`/groups/${group._id}`).then((_group) => {
let chatWithOneFlag = _group.chat[2];
expect(chatWithOneFlag.id).to.eql(chat3.id);
expect(chat3.flags).to.eql({ 'user-id': true });
@@ -176,18 +171,18 @@ describe('GET /groups/:id', () => {
});
context('admin', () => {
let api;
let admin;
beforeEach(() => {
return generateUser({
'contributor.admin': true,
}).then((user) => {
api = requester(user);
admin = user;
});
});
it('includes all messages', () => {
return api.get(`/groups/${group._id}`).then((_group) => {
return admin.get(`/groups/${group._id}`).then((_group) => {
expect(_group.chat).to.have.lengthOf(5);
expect(_group.chat[0].id).to.eql(chat1.id);
expect(_group.chat[1].id).to.eql(chat2.id);
@@ -198,7 +193,7 @@ describe('GET /groups/:id', () => {
});
it('includes user ids in flags object', () => {
return api.get(`/groups/${group._id}`).then((_group) => {
return admin.get(`/groups/${group._id}`).then((_group) => {
let chatWithOneFlag = _group.chat[2];
expect(chatWithOneFlag.id).to.eql(chat3.id);
expect(chat3.flags).to.eql({ 'user-id': true });
@@ -229,8 +224,7 @@ describe('GET /groups/:id', () => {
});
it('returns the group object for a non-member', () => {
let api = requester(nonMember);
return api.get(`/groups/${createdGroup._id}`)
return nonMember.get(`/groups/${createdGroup._id}`)
.then((group) => {
expect(group._id).to.eql(createdGroup._id);
expect(group.name).to.eql(createdGroup.name);
@@ -240,8 +234,7 @@ describe('GET /groups/:id', () => {
});
it('does not include user in members list', () => {
let api = requester(nonMember);
return api.get(`/groups/${createdGroup._id}`).then((group) => {
return nonMember.get(`/groups/${createdGroup._id}`).then((group) => {
let userInGroup = find(group.members, (user) => {
return nonMember._id === user._id;
});
@@ -271,8 +264,7 @@ describe('GET /groups/:id', () => {
});
it('does not return the group object for a non-member', () => {
let api = requester(nonMember);
return expect(api.get(`/groups/${createdGroup._id}`))
return expect(nonMember.get(`/groups/${createdGroup._id}`))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupNotFound'),
@@ -301,8 +293,7 @@ describe('GET /groups/:id', () => {
});
it('does not return the group object for a non-member', () => {
let api = requester(nonMember);
return expect(api.get(`/groups/${createdGroup._id}`))
return expect(nonMember.get(`/groups/${createdGroup._id}`))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupNotFound'),
@@ -329,8 +320,7 @@ describe('GET /groups/:id', () => {
});
it('returns the user\'s party if an id of "party" is passed in', () => {
let api = requester(member);
return api.get('/groups/party')
return member.get('/groups/party')
.then((group) => {
expect(group._id).to.eql(createdGroup._id);
expect(group.name).to.eql(createdGroup.name);
@@ -350,8 +340,7 @@ describe('GET /groups/:id', () => {
});
it('returns error if group does not exist', () => {
let api = requester(user);
return expect(api.get('/groups/group-that-does-not-exist'))
return expect(user.get('/groups/group-that-does-not-exist'))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupNotFound'),
+14 -19
View File
@@ -1,24 +1,22 @@
import {
generateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
describe('POST /groups', () => {
context('All groups', () => {
let api, leader;
let leader;
beforeEach(() => {
return generateUser().then((user) => {
leader = user;
api = requester(user);
});
});
xit('returns defaults? (TODO: it\'s possible to create a group without a type. Should the group default to party? Should we require type to be set?', () => {
return api.post('/groups').then((group) => {
return leader.post('/groups').then((group) => {
expect(group._id).to.exist;
expect(group.name).to.eql(`${leader.profile.name}'s group`);
expect(group.type).to.eql('party');
@@ -35,7 +33,7 @@ describe('POST /groups', () => {
leaderMessage: 'Test Group Message',
};
return api.post('/groups', group).then((createdGroup) => {
return leader.post('/groups', group).then((createdGroup) => {
expect(createdGroup._id).to.exist;
expect(createdGroup.leader).to.eql(leader._id);
expect(createdGroup.name).to.eql(group.name);
@@ -47,7 +45,7 @@ describe('POST /groups', () => {
});
it('returns a populated members array', () => {
return api.post('/groups', {
return leader.post('/groups', {
type: 'party',
}).then((party) => {
let member = party.members[0];
@@ -59,17 +57,16 @@ describe('POST /groups', () => {
});
context('Parties', () => {
let api, leader;
let leader;
beforeEach(() => {
return generateUser().then((user) => {
leader = user;
api = requester(user);
});
});
it('allows party creation without gems', () => {
return expect(api.post('/groups', {
return expect(leader.post('/groups', {
type: 'party',
})).to.eventually.have.property('_id');
});
@@ -78,7 +75,7 @@ describe('POST /groups', () => {
return expect(generateGroup(leader, {
type: 'party',
}).then((group) => {
return api.post('/groups', {
return leader.post('/groups', {
type: 'party',
});
})).to.eventually.be.rejected.and.eql({
@@ -88,7 +85,7 @@ describe('POST /groups', () => {
});
xit('prevents creating a public party. TODO: it is possible to create a public party. Should we send back an error? Automatically switch the privacy to private?', () => {
return expect(api.post('/groups', {
return expect(leader.post('/groups', {
type: 'party',
privacy: 'public',
})).to.eventually.be.rejected.and.eql({
@@ -99,14 +96,13 @@ describe('POST /groups', () => {
});
context('Guilds', () => {
let api, leader;
let leader;
beforeEach(() => {
return generateUser({
balance: 2,
}).then((user) => {
leader = user;
api = requester(user);
});
});
@@ -114,8 +110,7 @@ describe('POST /groups', () => {
return expect(generateUser({
balance: 0.75,
}).then((user) => {
api = requester(user);
return api.post('/groups', {
return user.post('/groups', {
type: 'guild',
});
})).to.eventually.be.rejected.and.eql({
@@ -125,26 +120,26 @@ describe('POST /groups', () => {
});
it('can create a public guild', () => {
return expect(api.post('/groups', {
return expect(leader.post('/groups', {
type: 'guild',
privacy: 'public',
})).to.eventually.have.property('leader', leader._id);
});
it('can create a private guild', () => {
return expect(api.post('/groups', {
return expect(leader.post('/groups', {
type: 'guild',
privacy: 'private',
})).to.eventually.have.property('leader', leader._id);
});
it('deducts gems from user and adds them to guild bank', () => {
return expect(api.post('/groups', {
return expect(leader.post('/groups', {
type: 'guild',
privacy: 'private',
}).then((group) => {
expect(group.balance).to.eql(1);
return api.get('/user');
return leader.get('/user');
})).to.eventually.have.deep.property('balance', 1);
});
});
+5 -8
View File
@@ -1,14 +1,13 @@
import {
generateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
describe('POST /groups/:id', () => {
context('user is not the leader of the group', () => {
let api, user, otherUser, groupUserDoesNotOwn;
let user, otherUser, groupUserDoesNotOwn;
beforeEach(() => {
return Promise.all([
@@ -17,7 +16,6 @@ describe('POST /groups/:id', () => {
]).then((users) => {
user = users[0];
otherUser = users[1];
api = requester(user);
return generateGroup(otherUser, {
name: 'Group not Owned By User',
@@ -31,7 +29,7 @@ describe('POST /groups/:id', () => {
});
it('does not allow user to update group', () => {
return expect(api.post(`/groups/${groupUserDoesNotOwn._id}`, {
return expect(user.post(`/groups/${groupUserDoesNotOwn._id}`, {
name: 'Change'
})).to.eventually.be.rejected.and.eql({
code: 401,
@@ -41,14 +39,13 @@ describe('POST /groups/:id', () => {
});
context('user is the leader of the group', () => {
let api, user, usersGroup;
let user, usersGroup;
beforeEach(() => {
return generateUser({
balance: 10,
}).then((_user) => {
user = _user;
api = requester(user);
return generateGroup(user, {
name: 'Original Group Title',
@@ -61,11 +58,11 @@ describe('POST /groups/:id', () => {
});
it('allows user to update group', () => {
return api.post(`/groups/${usersGroup._id}`, {
return user.post(`/groups/${usersGroup._id}`, {
name: 'New Group Title',
description: 'New group description',
}).then((group) => {
return api.get(`/groups/${usersGroup._id}`);
return user.get(`/groups/${usersGroup._id}`);
}).then((group) => {
expect(group.name).to.eql('New Group Title');
expect(group.description).to.eql('New group description');
+12 -17
View File
@@ -1,7 +1,6 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
import { each, find } from 'lodash';
@@ -18,7 +17,7 @@ describe('POST /groups/:id/join', () => {
'party': {type: 'party', privacy: 'private'},
}, (data, groupType) => {
context(`user has invitation to a ${groupType}`, () => {
let api, group, invitee;
let group, invitee;
beforeEach(() => {
return createAndPopulateGroup({
@@ -30,13 +29,12 @@ describe('POST /groups/:id/join', () => {
}).then((res) => {
group = res.group;
invitee = res.invitees[0];
api = requester(invitee);
});
});
it(`allows user to join a ${groupType}`, () => {
return api.post(`/groups/${group._id}/join`).then((res) => {
return api.get(`/groups/${group._id}`);
return invitee.post(`/groups/${group._id}/join`).then((res) => {
return invitee.get(`/groups/${group._id}`);
}).then((_group) => {
let members = _group.members;
let userInGroup = find(members, (user) => {
@@ -54,7 +52,7 @@ describe('POST /groups/:id/join', () => {
'party': {type: 'party', privacy: 'private'},
}, (data, groupType) => {
context(`user does not have an invitation to a ${groupType}`, () => {
let api, group, user;
let group, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -67,13 +65,12 @@ describe('POST /groups/:id/join', () => {
return generateUser();
}).then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it(`does not allow user to join a ${groupType}`, () => {
return expect(api.post(`/groups/${group._id}/join`).then((res) => {
return api.get(`/groups/${group._id}`);
return expect(user.post(`/groups/${group._id}/join`).then((res) => {
return user.get(`/groups/${group._id}`);
})).to.eventually.be.rejected.and.eql({
code: 401,
text: t('messageGroupRequiresInvite'),
@@ -83,7 +80,7 @@ describe('POST /groups/:id/join', () => {
});
context('user does not have an invitation to a public group', () => {
let api, group, user;
let group, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -96,13 +93,12 @@ describe('POST /groups/:id/join', () => {
return generateUser();
}).then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('allows user to join a public guild', () => {
return api.post(`/groups/${group._id}/join`).then((res) => {
return api.get(`/groups/${group._id}`);
return user.post(`/groups/${group._id}/join`).then((res) => {
return user.get(`/groups/${group._id}`);
}).then((_group) => {
let members = _group.members;
let userInGroup = find(members, (member) => {
@@ -126,7 +122,7 @@ describe('POST /groups/:id/join', () => {
},
}).then((res) => {
group = res.group;
return requester(res.leader).post(`/groups/${group._id}/leave`);
return res.leader.post(`/groups/${group._id}/leave`);
}).then((res) => {
return generateUser();
}).then((generatedUser) => {
@@ -135,9 +131,8 @@ describe('POST /groups/:id/join', () => {
});
it('makes the joining user the leader', () => {
let api = requester(user);
return expect(api.post(`/groups/${group._id}/join`).then((result) => {
return api.get(`/groups/${group._id}`);
return expect(user.post(`/groups/${group._id}/join`).then((result) => {
return user.get(`/groups/${group._id}`);
})).to.eventually.have.deep.property('leader._id', user._id);
});
});
+20 -26
View File
@@ -2,7 +2,6 @@ import {
checkExistence,
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
import { find } from 'lodash';
@@ -14,7 +13,7 @@ describe('POST /groups/:id/leave', () => {
});
context('user is a non-leader member of a guild', () => {
let api, user, group;
let user, group;
beforeEach(() => {
return createAndPopulateGroup({
@@ -26,14 +25,13 @@ describe('POST /groups/:id/leave', () => {
},
}).then((res) => {
user = res.members[0];
api = requester(user);
group = res.group;
});
});
it('leaves the group', () => {
return api.post(`/groups/${group._id}/leave`).then((result) => {
return api.get(`/groups/${group._id}`);
return user.post(`/groups/${group._id}/leave`).then((result) => {
return user.get(`/groups/${group._id}`);
}).then((group) => {
let userInGroup = find(group.members, (member) => {
return member._id === user._id;
@@ -44,7 +42,7 @@ describe('POST /groups/:id/leave', () => {
});
context('user is the last member of a public guild', () => {
let api, user, group;
let user, group;
beforeEach(() => {
return createAndPopulateGroup({
@@ -55,20 +53,19 @@ describe('POST /groups/:id/leave', () => {
},
}).then((res) => {
user = res.leader;
api = requester(user);
group = res.group;
});
});
it('leaves the group accessible', () => {
return expect(api.post(`/groups/${group._id}/leave`).then((result) => {
return api.get(`/groups/${group._id}`);
return expect(user.post(`/groups/${group._id}/leave`).then((result) => {
return user.get(`/groups/${group._id}`);
})).to.eventually.have.property('_id', group._id);
});
});
context('user is the last member of a private group', () => {
let api, user, group;
let user, group;
beforeEach(() => {
return createAndPopulateGroup({
@@ -79,20 +76,19 @@ describe('POST /groups/:id/leave', () => {
},
}).then((res) => {
user = res.leader;
api = requester(user);
group = res.group;
});
});
it('group is deleted', () => {
return expect(api.post(`/groups/${group._id}/leave`).then((result) => {
return expect(user.post(`/groups/${group._id}/leave`).then((result) => {
return checkExistence('groups', group._id);
})).to.eventually.eql(false);
});
});
context('user is the last member of a private group with pending invites', () => {
let api, user, inviteeRequest1, inviteeRequest2, group;
let user, invitee1, invitee2, group;
beforeEach(() => {
return createAndPopulateGroup({
@@ -104,20 +100,19 @@ describe('POST /groups/:id/leave', () => {
},
}).then((res) => {
user = res.leader;
inviteeRequest1 = requester(res.invitees[0]);
inviteeRequest2 = requester(res.invitees[1]);
api = requester(user);
invitee1 = res.invitees[0];
invitee2 = res.invitees[1];
group = res.group;
});
});
it('deletes the group invitations from users', () => {
return api.post(`/groups/${group._id}/leave`).then((result) => {
return user.post(`/groups/${group._id}/leave`).then((result) => {
return Promise.all([
expect(inviteeRequest1.get(`/user`))
expect(invitee1.get(`/user`))
.to.eventually.have.deep.property('invitations.guilds')
.and.to.be.empty,
expect(inviteeRequest2.get(`/user`))
expect(invitee2.get(`/user`))
.to.eventually.have.deep.property('invitations.guilds')
.and.to.be.empty,
]);
@@ -126,7 +121,7 @@ describe('POST /groups/:id/leave', () => {
});
context('user is the last member of a party with pending invites', () => {
let api, user, inviteeRequest1, inviteeRequest2, group;
let user, invitee1, invitee2, group;
beforeEach(() => {
return createAndPopulateGroup({
@@ -138,20 +133,19 @@ describe('POST /groups/:id/leave', () => {
},
}).then((res) => {
user = res.leader;
inviteeRequest1 = requester(res.invitees[0]);
inviteeRequest2 = requester(res.invitees[1]);
api = requester(user);
invitee1 = res.invitees[0];
invitee2 = res.invitees[1];
group = res.group;
});
});
it('deletes the group invitations from users', () => {
return api.post(`/groups/${group._id}/leave`).then((result) => {
return user.post(`/groups/${group._id}/leave`).then((result) => {
return Promise.all([
expect(inviteeRequest1.get(`/user`))
expect(invitee1.get(`/user`))
.to.eventually.have.deep.property('invitations.party')
.and.to.be.empty,
expect(inviteeRequest2.get(`/user`))
expect(invitee2.get(`/user`))
.to.eventually.have.deep.property('invitations.party')
.and.to.be.empty,
]);
@@ -2,7 +2,6 @@ import {
createAndPopulateGroup,
generateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
@@ -17,7 +16,7 @@ describe('POST /groups/:id/removeMember', () => {
});
context('user is the leader of a guild', () => {
let api, leader, member, group;
let leader, member, group;
beforeEach(() => {
return createAndPopulateGroup({
@@ -31,13 +30,11 @@ describe('POST /groups/:id/removeMember', () => {
leader = res.leader;
member = res.members[0];
group = res.group;
api = requester(leader);
});
});
it('does not allow leader to remove themselves', () => {
return expect(api.post(`/groups/${group._id}/removeMember`, null, {
return expect(leader.post(`/groups/${group._id}/removeMember`, null, {
uuid: leader._id,
})).to.eventually.be.rejected.and.eql({
code: 401,
@@ -46,10 +43,10 @@ describe('POST /groups/:id/removeMember', () => {
});
it('can remove other members of guild', () => {
return api.post(`/groups/${group._id}/removeMember`, null, {
return leader.post(`/groups/${group._id}/removeMember`, null, {
uuid: member._id,
}).then((res) => {
return api.get(`/groups/${group._id}`);
return leader.get(`/groups/${group._id}`);
}).then((guild) => {
expect(guild.members).to.have.a.lengthOf(1);
expect(guild.members[0]._id).to.not.eql(member._id);
@@ -1,12 +1,11 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('DELETE /groups/:id/chat', () => {
let api, group, message, user;
let group, message, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -17,24 +16,23 @@ describe('DELETE /groups/:id/chat', () => {
}).then((res) => {
group = res.group;
user = res.leader;
api = requester(user);
return api.post(`/groups/${group._id}/chat`, null, { message: 'Some message', });
return user.post(`/groups/${group._id}/chat`, null, { message: 'Some message', });
}).then((res) => {
message = res.message;
});
});
it('deletes a message', () => {
return api.del(`/groups/${group._id}/chat/${message.id}`).then((res) => {
return api.get(`/groups/${group._id}/chat/`);
return user.del(`/groups/${group._id}/chat/${message.id}`).then((res) => {
return user.get(`/groups/${group._id}/chat/`);
}).then((messages) => {
expect(messages).to.have.length(0);
});
});
it('returns an error is message does not exist', () => {
return expect(api.del(`/groups/${group._id}/chat/some-fake-id`)).to.eventually.be.rejected.and.eql({
return expect(user.del(`/groups/${group._id}/chat/some-fake-id`)).to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupChatNotFound'),
});
@@ -1,7 +1,6 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
@@ -22,20 +21,18 @@ describe('GET /groups/:id/chat', () => {
user = res.leader;
member = res.members[0];
return requester(member).post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
}).then((res) => {
message1 = res.message;
return requester(user).post(`/groups/${group._id}/chat`, null, { message: 'User message' });
return user.post(`/groups/${group._id}/chat`, null, { message: 'User message' });
}).then((res) => {
message2 = res.message;
});
});
it('gets messages', () => {
let api = requester(user);
return api.get(`/groups/${group._id}/chat`).then((messages) => {
return user.get(`/groups/${group._id}/chat`).then((messages) => {
expect(messages).to.have.length(2);
let message = messages[0];
@@ -1,13 +1,12 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('POST /groups/:id/chat', () => {
let api, group, user;
let group, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -18,12 +17,11 @@ describe('POST /groups/:id/chat', () => {
}).then((res) => {
group = res.group;
user = res.leader;
api = requester(user);
});
});
it('creates a chat message', () => {
return api.post(`/groups/${group._id}/chat`, null, {
return user.post(`/groups/${group._id}/chat`, null, {
message: 'Test Message',
}).then((res) => {
let message = res.message;
@@ -36,7 +34,7 @@ describe('POST /groups/:id/chat', () => {
});
it('does not post an empty message', () => {
return expect(api.post(`/groups/${group._id}/chat`, null, {
return expect(user.post(`/groups/${group._id}/chat`, null, {
message: '',
})).to.eventually.be.rejected.and.eql({
code: 400,
@@ -1,7 +1,6 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
@@ -27,16 +26,16 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
});
context('non admin', () => {
let api;
let nonadmin;
beforeEach(() => {
return generateUser().then((user) => {
api = requester(user);
nonadmin = user;
});
});
it('cannot clear flags', () => {
return expect(api.post(`/groups/${group._id}/chat/message-to-clear/clearflags`))
return expect(nonadmin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`))
.to.eventually.be.rejected.and.eql({
code: 401,
text: t('messageGroupChatAdminClearFlagCount'),
@@ -45,34 +44,34 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
});
context('admin', () => {
let api;
let admin;
beforeEach(() => {
return generateUser({
'contributor.admin': true,
}).then((user) => {
api = requester(user);
admin = user;
});
});
it('clears flags', () => {
return api.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then((res) => {
return api.get(`/groups/${group._id}/chat`);
return admin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then((res) => {
return admin.get(`/groups/${group._id}/chat`);
}).then((messages) => {
expect(messages[0].flagCount).to.eql(0);
});
});
it('leaves old flags on the flag object', () => {
return api.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then((res) => {
return api.get(`/groups/${group._id}/chat`);
return admin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then((res) => {
return admin.get(`/groups/${group._id}/chat`);
}).then((messages) => {
expect(messages[0].flags).to.have.property('some-id', true);
});
});
it('returns error if message does not exist', () => {
return expect(api.post(`/groups/${group._id}/chat/non-existant-message/clearflags`))
return expect(admin.post(`/groups/${group._id}/chat/non-existant-message/clearflags`))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupChatNotFound'),
@@ -111,10 +110,8 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
});
it('changes only the message that is flagged', () => {
let api = requester(admin);
return api.post(`/groups/${group._id}/chat/message-to-unflag/clearflags`).then((messages) => {
return api.get(`/groups/${group._id}/chat`);
return admin.post(`/groups/${group._id}/chat/message-to-unflag/clearflags`).then((messages) => {
return admin.get(`/groups/${group._id}/chat`);
}).then((messages) => {
expect(messages).to.have.lengthOf(4);
@@ -1,7 +1,6 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
@@ -22,18 +21,15 @@ describe('POST /groups/:id/chat/:id/flag', () => {
user = res.leader;
member = res.members[0];
return requester(member)
.post(`/groups/${group._id}/chat`, null, { message: 'Group member message', });
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message', });
}).then((res) => {
message = res.message;
});
});
it('flags message', () => {
let api = requester(user);
return api.post(`/groups/${group._id}/chat/${message.id}/flag`).then((messages) => {
return api.get(`/groups/${group._id}/chat`);
return user.post(`/groups/${group._id}/chat/${message.id}/flag`).then((messages) => {
return user.get(`/groups/${group._id}/chat`);
}).then((messages) => {
let message = messages[0];
expect(message.flagCount).to.eql(1);
@@ -41,10 +37,8 @@ describe('POST /groups/:id/chat/:id/flag', () => {
});
it('cannot flag the same message twice', () => {
let api = requester(user);
return expect(api.post(`/groups/${group._id}/chat/${message.id}/flag`).then((messages) => {
return api.post(`/groups/${group._id}/chat/${message.id}/flag`);
return expect(user.post(`/groups/${group._id}/chat/${message.id}/flag`).then((messages) => {
return user.post(`/groups/${group._id}/chat/${message.id}/flag`);
})).to.eventually.be.rejected.and.eql({
code: 401,
text: t('messageGroupChatFlagAlreadyReported'),
@@ -53,7 +47,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
});
context('own message', () => {
let api, group, message, user;
let group, message, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -65,18 +59,15 @@ describe('POST /groups/:id/chat/:id/flag', () => {
}).then((res) => {
group = res.group;
user = res.leader;
api = requester(user);
return api.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message', });
return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message', });
}).then((res) => {
message = res.message;
});
});
it('cannot flag message', () => {
let api = requester(user);
return expect(api.post(`/groups/${group._id}/chat/${message.id}/flag`))
return expect(user.post(`/groups/${group._id}/chat/${message.id}/flag`))
.to.eventually.be.rejected.and.eql({
code: 401,
text: t('messageGroupChatFlagOwnMessage'),
@@ -85,7 +76,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
});
context('nonexistant message', () => {
let api, group, message, user;
let group, message, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -96,14 +87,11 @@ describe('POST /groups/:id/chat/:id/flag', () => {
}).then((res) => {
group = res.group;
user = res.leader;
api = requester(user);
});
});
it('returns error', () => {
let api = requester(user);
return expect(api.post(`/groups/${group._id}/chat/non-existant-message/flag`))
return expect(user.post(`/groups/${group._id}/chat/non-existant-message/flag`))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupChatNotFound'),
@@ -144,10 +132,8 @@ describe('POST /groups/:id/chat/:id/flag', () => {
});
it('changes only the message that is flagged', () => {
let api = requester(user);
return api.post(`/groups/${group._id}/chat/message-to-be-flagged/flag`).then((messages) => {
return requester(admin).get(`/groups/${group._id}/chat`);
return user.post(`/groups/${group._id}/chat/message-to-be-flagged/flag`).then((messages) => {
return admin.get(`/groups/${group._id}/chat`);
}).then((messages) => {
expect(messages).to.have.lengthOf(4);
@@ -190,18 +176,15 @@ describe('POST /groups/:id/chat/:id/flag', () => {
user = res.leader;
member = res.members[0];
return requester(member)
.post(`/groups/${group._id}/chat`, null, { message: 'Group member message', });
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message', });
}).then((res) => {
message = res.message;
});
});
it('sets flagCount to 5', () => {
let api = requester(user);
return api.post(`/groups/${group._id}/chat/${message.id}/flag`).then((messages) => {
return api.get(`/groups/${group._id}/chat`);
return user.post(`/groups/${group._id}/chat/${message.id}/flag`).then((messages) => {
return user.get(`/groups/${group._id}/chat`);
}).then((messages) => {
let message = messages[0];
expect(message.flagCount).to.eql(5);
@@ -1,7 +1,6 @@
import {
createAndPopulateGroup,
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
@@ -22,26 +21,21 @@ describe('POST /groups/:id/chat/:id/like', () => {
user = res.leader;
member = res.members[0];
return requester(member)
.post(`/groups/${group._id}/chat`, null, { message: 'Group member message', });
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message', });
}).then((res) => {
message = res.message;
});
});
it('likes message', () => {
let api = requester(user);
return api.post(`/groups/${group._id}/chat/${message.id}/like`).then((messages) => {
return user.post(`/groups/${group._id}/chat/${message.id}/like`).then((messages) => {
let message = messages[0];
expect(message.likes[user._id]).to.eql(true);
});
});
it('returns the message object', () => {
let api = requester(user);
return api.post(`/groups/${group._id}/chat/${message.id}/like`).then((messages) => {
return user.post(`/groups/${group._id}/chat/${message.id}/like`).then((messages) => {
let message = messages[0];
expect(message.text).to.eql('Group member message');
expect(message.uuid).to.eql(member._id);
@@ -51,7 +45,7 @@ describe('POST /groups/:id/chat/:id/like', () => {
});
context('own message', () => {
let api, group, message, user;
let group, message, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -63,18 +57,15 @@ describe('POST /groups/:id/chat/:id/like', () => {
}).then((res) => {
group = res.group;
user = res.leader;
api = requester(user);
return api.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message', });
return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message', });
}).then((res) => {
message = res.message;
});
});
it('cannot like message', () => {
let api = requester(user);
return expect(api.post(`/groups/${group._id}/chat/${message.id}/like`))
return expect(user.post(`/groups/${group._id}/chat/${message.id}/like`))
.to.eventually.be.rejected.and.eql({
code: 401,
text: t('messageGroupChatLikeOwnMessage'),
@@ -115,10 +106,8 @@ describe('POST /groups/:id/chat/:id/like', () => {
});
it('changes only the message that is liked', () => {
let api = requester(user);
return api.post(`/groups/${group._id}/chat/message-to-be-liked/like`).then((messages) => {
return requester(admin).get(`/groups/${group._id}/chat`);
return user.post(`/groups/${group._id}/chat/message-to-be-liked/like`).then((messages) => {
return admin.get(`/groups/${group._id}/chat`);
}).then((messages) => {
expect(messages).to.have.lengthOf(4);
@@ -143,7 +132,7 @@ describe('POST /groups/:id/chat/:id/like', () => {
});
context('nonexistant message', () => {
let api, group, message, user;
let group, message, user;
beforeEach(() => {
return createAndPopulateGroup({
@@ -154,14 +143,11 @@ describe('POST /groups/:id/chat/:id/like', () => {
}).then((res) => {
group = res.group;
user = res.leader;
api = requester(user);
});
});
it('returns error', () => {
let api = requester(user);
return expect(api.post(`/groups/${group._id}/chat/non-existant-message/like`))
return expect(user.post(`/groups/${group._id}/chat/non-existant-message/like`))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageGroupChatNotFound'),
+1 -1
View File
@@ -1,9 +1,9 @@
import {requester} from '../../../helpers/api-integration.helper';
describe('Status', () => {
it('returns a status of up when server is up', () => {
let api = requester();
return expect(api.get('/status'))
.to.eventually.eql({status: 'up'});
});
+15 -19
View File
@@ -3,23 +3,21 @@ import {
createAndPopulateGroup,
generateGroup,
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
import { find } from 'lodash';
describe('DELETE /user', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser().then((usr) => {
api = requester(usr);
user = usr;
});
});
it('deletes the user', () => {
return expect(api.del('/user').then((fetchedUser) => {
return expect(user.del('/user').then((fetchedUser) => {
return checkExistence('users', user._id);
})).to.eventually.eql(false);
});
@@ -41,7 +39,7 @@ describe('DELETE /user', () => {
});
it('deletes party when user is the only member', () => {
return expect(api.del('/user').then((result) => {
return expect(user.del('/user').then((result) => {
return checkExistence('groups', party._id);
})).to.eventually.eql(false);
});
@@ -60,14 +58,14 @@ describe('DELETE /user', () => {
});
it('deletes guild when user is the only member', () => {
return expect(api.del('/user').then((result) => {
return expect(user.del('/user').then((result) => {
return checkExistence('groups', guild._id);
})).to.eventually.eql(false);
});
});
context('groups user is leader of', () => {
let api, group, oldLeader, newLeader;
let group, oldLeader, newLeader;
beforeEach(() => {
return createAndPopulateGroup({
@@ -80,13 +78,12 @@ describe('DELETE /user', () => {
group = res.group;
newLeader = res.members[0];
oldLeader = res.leader;
api = requester(oldLeader);
});
});
it('chooses new group leader for any group user was the leader of', () => {
return api.del('/user').then((res) => {
return requester(newLeader).get(`/groups/${group._id}`);
return oldLeader.del('/user').then((res) => {
return newLeader.get(`/groups/${group._id}`);
}).then((guild) => {
expect(guild.leader).to.exist;
expect(guild.leader._id).to.not.eql(oldLeader._id);
@@ -95,14 +92,13 @@ describe('DELETE /user', () => {
});
context('groups user is a part of', () => {
let api, group1, group2, userToDelete, otherUser;
let group1, group2, userToDelete, otherUser;
beforeEach(() => {
return generateUser({
balance: 10,
}).then((user) => {
userToDelete = user;
api = requester(userToDelete);
return generateGroup(userToDelete, {
type: 'guild',
@@ -122,17 +118,17 @@ describe('DELETE /user', () => {
group2 = res.group;
otherUser = res.members[0];
return api.post(`/groups/${group2._id}/join`);
return userToDelete.post(`/groups/${group2._id}/join`);
});
});
it('removes user from all groups user was a part of', () => {
return api.del('/user').then((res) => {
return requester(otherUser).get(`/groups/${group1._id}`);
return userToDelete.del('/user').then((res) => {
return otherUser.get(`/groups/${group1._id}`);
}).then((fetchedGroup1) => {
expect(fetchedGroup1.members).to.be.empty;
return requester(otherUser).get(`/groups/${group2._id}`);
return otherUser.get(`/groups/${group2._id}`);
}).then((fetchedGroup2) => {
expect(fetchedGroup2.members).to.not.be.empty;
@@ -147,7 +143,7 @@ describe('DELETE /user', () => {
});
context('pending invitation to group', () => {
let api, group, userToDelete, otherUser;
let group, userToDelete, otherUser;
beforeEach(() => {
return createAndPopulateGroup({
@@ -165,8 +161,8 @@ describe('DELETE /user', () => {
});
it('removes invitations from groups', () => {
return requester(userToDelete).del('/user').then((res) => {
return requester(otherUser).get(`/groups/${group._id}`);
return userToDelete.del('/user').then((res) => {
return otherUser.get(`/groups/${group._id}`);
}).then((fetchedGroup) => {
expect(fetchedGroup.invites).to.have.a.lengthOf(1);
expect(fetchedGroup.invites[0]._id).to.not.eql(userToDelete._id);
+1 -3
View File
@@ -1,6 +1,5 @@
import {
generateUser,
requester,
} from '../../../helpers/api-integration.helper';
describe('GET /user', () => {
@@ -8,8 +7,7 @@ describe('GET /user', () => {
before(() => {
return generateUser().then((usr) => {
let api = requester(usr);
return api.get('/user');
return usr.get('/user');
}).then((fetchedUser) => {
user = fetchedUser;
});
+2 -4
View File
@@ -1,20 +1,18 @@
import {
generateUser,
requester,
} from '../../../helpers/api-integration.helper';
describe('GET /user/tags', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser().then((usr) => {
user = usr;
api = requester(usr);
});
});
it('gets the user\'s tags', () => {
return expect(api.get('/user/tags'))
return expect(user.get('/user/tags'))
.to.eventually.eql(user.tags);
});
});
+3 -5
View File
@@ -1,26 +1,24 @@
import {
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
describe('GET /user/tags/id', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser().then((usr) => {
user = usr;
api = requester(usr);
});
});
it('gets a user\'s tag by id', () => {
return expect(api.get('/user/tags/' + user.tags[0].id))
return expect(user.get('/user/tags/' + user.tags[0].id))
.to.eventually.eql(user.tags[0]);
});
it('fails for non-existent tags', () => {
return expect(api.get('/user/tags/not-an-id'))
return expect(user.get('/user/tags/not-an-id'))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageTagNotFound'),
+4 -6
View File
@@ -1,24 +1,22 @@
import {
generateUser,
requester,
translate as t,
} from '../../../helpers/api-integration.helper';
import { each } from 'lodash';
describe('PUT /user', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser().then((usr) => {
user = usr;
api = requester(user);
});
});
context('allowed operations', () => {
it('updates the user', () => {
return api.put('/user', {
return user.put('/user', {
'profile.name' : 'Frodo',
'preferences.costume': true,
'stats.hp': 14,
@@ -47,7 +45,7 @@ describe('PUT /user', () => {
each(data, (value, operation) => {
errorText.push(t('messageUserOperationProtected', { operation: operation }));
});
return expect(api.put('/user', data)).to.eventually.be.rejected.and.eql({
return expect(user.put('/user', data)).to.eventually.be.rejected.and.eql({
code: 401,
text: errorText,
});
@@ -66,7 +64,7 @@ describe('PUT /user', () => {
each(data, (value, operation) => {
errorText.push(t('messageUserOperationProtected', { operation: operation }));
});
return expect(api.put('/user', data)).to.eventually.be.rejected.and.eql({
return expect(user.put('/user', data)).to.eventually.be.rejected.and.eql({
code: 401,
text: errorText,
});
@@ -1,11 +1,10 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
import { each } from 'lodash';
describe('GET /user/anonymized', () => {
let api, user;
let user;
before(() => {
return generateUser({
@@ -31,8 +30,8 @@ describe('GET /user/anonymized', () => {
}
}
}).then((usr) => {
api = requester(usr);
return api.post('/user/tasks', {
user = usr;
return user.post('/user/tasks', {
text: 'some private text',
notes: 'some private notes',
checklist: [
@@ -42,7 +41,7 @@ describe('GET /user/anonymized', () => {
type: 'daily',
});
}).then((result) => {
return api.get('/user/anonymized');
return user.get('/user/anonymized');
}).then((anonymizedUser) => {
user = anonymizedUser;
});
@@ -1,18 +1,16 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
import { each } from 'lodash';
describe('POST /user/batch-update', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser().then((usr) => {
user = usr;
api = requester(user);
});
});
@@ -20,24 +18,26 @@ describe('POST /user/batch-update', () => {
it('makes batch operations', () => {
let task;
return api.get('/user/tasks').then((tasks) => {
return user.get('/user/tasks').then((tasks) => {
task = tasks[0];
return api.post('/user/batch-update', [
return user.post('/user/batch-update', [
{op: 'update', body: {'stats.hp': 30}},
{op: 'update', body: {'profile.name': 'Samwise'}},
{op: 'score', params: { direction: 'up', id: task.id }},
]);
}).then((user) => {
expect(user.stats.hp).to.eql(30);
expect(user.profile.name).to.eql('Samwise');
return api.get(`/user/tasks/${task.id}`);
}).then((updatedUser) => {
expect(updatedUser.stats.hp).to.eql(30);
expect(updatedUser.profile.name).to.eql('Samwise');
return user.get(`/user/tasks/${task.id}`);
}).then((task) => {
expect(task.value).to.be.greaterThan(0);
});
});
});
context('development only operations', () => {
context('development only operations', () => { // These tests will fail if your NODE_ENV is set to 'development' instead of 'testing'
let protectedOperations = {
'Add Ten Gems': 'addTenGems',
'Add Hourglass': 'addHourglass',
@@ -46,11 +46,11 @@ describe('POST /user/batch-update', () => {
each(protectedOperations, (operation, description) => {
it(`it sends back a 500 error for ${description} operation`, () => {
return expect(api.post('/user/batch-update', [
{op: operation},
return expect(user.post('/user/batch-update', [
{ op: operation },
])).to.eventually.be.rejected.and.eql({
code: 500,
text: t('messageUserOperationNotFound', { operation: operation}),
text: t('messageUserOperationNotFound', { operation }),
});
});
});
@@ -58,7 +58,7 @@ describe('POST /user/batch-update', () => {
context('unknown operations', () => {
it('sends back a 500 error', () => {
return expect(api.post('/user/batch-update', [
return expect(user.post('/user/batch-update', [
{op: 'aNotRealOperation'},
])).to.eventually.be.rejected.and.eql({
code: 500,
@@ -1,23 +1,23 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('POST /user/pushDevice', () => {
let api;
let user;
beforeEach(() => {
return generateUser().then((user) => {
api = requester(user);
return generateUser().then((_user) => {
user = _user;
});
});
it('registers a device id', () => {
return api.post('/user/pushDevice', {
return user.post('/user/pushDevice', {
regId: '123123',
type: 'android',
}).then((devices) => {
let device = devices[0];
expect(device._id).to.exist;
expect(device.regId).to.eql('123123');
expect(device.type).to.eql('android');
@@ -1,24 +1,22 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('DELETE /user/tasks/:id', () => {
let api, user, task;
let user, task;
beforeEach(() => {
return generateUser().then((_user) => {
user = _user;
task = user.todos[0];
api = requester(user);
});
});
it('deletes a task', () => {
return expect(api.del(`/user/tasks/${task.id}`)
return expect(user.del(`/user/tasks/${task.id}`)
.then((res) => {
return api.get(`/user/tasks/${task.id}`);
return user.get(`/user/tasks/${task.id}`);
})).to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageTaskNotFound'),
@@ -26,7 +24,7 @@ describe('DELETE /user/tasks/:id', () => {
});
it('returns an error if the task does not exist', () => {
return expect(api.del('/user/tasks/task-that-does-not-exist'))
return expect(user.del('/user/tasks/task-that-does-not-exist'))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageTaskNotFound'),
@@ -36,7 +34,7 @@ describe('DELETE /user/tasks/:id', () => {
it('does not delete another user\'s task', () => {
return expect(generateUser().then((otherUser) => {
let otherUsersTask = otherUser.todos[0];
return api.del(`/user/tasks/${otherUsersTask.id}`);
return user.del(`/user/tasks/${otherUsersTask.id}`);
})).to.eventually.be.rejected.and.eql({
code: 404,
text: 'Task not found.',
+2 -4
View File
@@ -1,11 +1,10 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('GET /user/tasks/', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser({
@@ -17,12 +16,11 @@ describe('GET /user/tasks/', () => {
],
}).then((_user) => {
user = _user;
api = requester(user);
});
});
it('gets all tasks', () => {
return api.get(`/user/tasks/`).then((tasks) => {
return user.get(`/user/tasks/`).then((tasks) => {
expect(tasks).to.be.an('array');
expect(tasks.length).to.be.greaterThan(3);
+5 -6
View File
@@ -1,22 +1,20 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('GET /user/tasks/:id', () => {
let api, user, task;
let user, task;
beforeEach(() => {
return generateUser().then((_user) => {
user = _user;
task = user.todos[0];
api = requester(user);
});
});
it('gets a task', () => {
return api.get(`/user/tasks/${task.id}`).then((foundTask) => {
return user.get(`/user/tasks/${task.id}`).then((foundTask) => {
expect(foundTask.id).to.eql(task.id);
expect(foundTask.text).to.eql(task.text);
expect(foundTask.notes).to.eql(task.notes);
@@ -26,7 +24,7 @@ describe('GET /user/tasks/:id', () => {
});
it('returns an error if the task does not exist', () => {
return expect(api.get('/user/tasks/task-that-does-not-exist'))
return expect(user.get('/user/tasks/task-that-does-not-exist'))
.to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageTaskNotFound'),
@@ -36,7 +34,8 @@ describe('GET /user/tasks/:id', () => {
it('does not get another user\'s task', () => {
return expect(generateUser().then((otherUser) => {
let otherUsersTask = otherUser.todos[0];
return api.get(`/user/tasks/${otherUsersTask.id}`);
return user.get(`/user/tasks/${otherUsersTask.id}`);
})).to.eventually.be.rejected.and.eql({
code: 404,
text: t('messageTaskNotFound'),
+7 -9
View File
@@ -1,33 +1,31 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('POST /user/tasks', () => {
let api, user;
let user;
beforeEach(() => {
return generateUser().then((_user) => {
user = _user;
api = requester(user);
});
});
it('creates a task', () => {
return api.post('/user/tasks').then((task) => {
return user.post('/user/tasks').then((task) => {
expect(task.id).to.exist;
});
});
it('creates a habit by default', () => {
return expect(api.post('/user/tasks'))
return expect(user.post('/user/tasks'))
.to.eventually.have.property('type', 'habit');
});
it('creates a task with specified values', () => {
return api.post('/user/tasks', {
return user.post('/user/tasks', {
type: 'daily',
text: 'My task',
notes: 'My notes',
@@ -43,7 +41,7 @@ describe('POST /user/tasks', () => {
it('does not create a task with an id that already exists', () => {
let todo = user.todos[0];
return expect(api.post('/user/tasks', {
return expect(user.post('/user/tasks', {
id: todo.id,
})).to.eventually.be.rejected.and.eql({
code: 409,
@@ -52,7 +50,7 @@ describe('POST /user/tasks', () => {
});
xit('TODO: no error is thrown - throws a 500 validation error if invalid type is posted', () => {
return expect(api.post('/user/tasks', {
return expect(user.post('/user/tasks', {
type: 'not-valid',
})).to.eventually.be.rejected.and.eql({
code: 500,
@@ -61,7 +59,7 @@ describe('POST /user/tasks', () => {
});
xit('TODO: no error is thrown - throws a 500 validation error if invalid data is posted', () => {
return expect(api.post('/user/tasks', {
return expect(user.post('/user/tasks', {
frequency: 'not-valid',
})).to.eventually.be.rejected.and.eql({
code: 500,
+6 -8
View File
@@ -1,22 +1,20 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('PUT /user/tasks/:id', () => {
let api, user, task;
let user, task;
beforeEach(() => {
return generateUser().then((_user) => {
user = _user;
api = requester(user);
task = user.todos[0];
});
});
it('does not update the id of the task', () => {
return api.put(`/user/tasks/${task.id}`, {
return user.put(`/user/tasks/${task.id}`, {
id: 'some-thing',
}).then((updatedTask) => {
expect(updatedTask.id).to.eql(task.id);
@@ -25,7 +23,7 @@ describe('PUT /user/tasks/:id', () => {
});
it('does not update the type of the task', () => {
return api.put(`/user/tasks/${task.id}`, {
return user.put(`/user/tasks/${task.id}`, {
type: 'habit',
}).then((updatedTask) => {
expect(updatedTask.type).to.eql(task.type);
@@ -34,7 +32,7 @@ describe('PUT /user/tasks/:id', () => {
});
it('updates text, attribute, priority, value and notes', () => {
return api.put(`/user/tasks/${task.id}`, {
return user.put(`/user/tasks/${task.id}`, {
text: 'new text',
notes: 'new notes',
value: 10000,
@@ -50,7 +48,7 @@ describe('PUT /user/tasks/:id', () => {
});
it('returns an error if the task does not exist', () => {
return expect(api.put('/user/tasks/task-id-that-does-not-exist'))
return expect(user.put('/user/tasks/task-id-that-does-not-exist'))
.to.eventually.be.rejected.and.eql({
code: 404,
text: 'Task not found.',
@@ -60,7 +58,7 @@ describe('PUT /user/tasks/:id', () => {
it('does not update another user\'s task', () => {
return expect(generateUser().then((otherUser) => {
let otherUsersTask = otherUser.todos[0];
return api.put(`/user/tasks/${otherUsersTask._id}`, {
return user.put(`/user/tasks/${otherUsersTask._id}`, {
name: 'some name',
});
})).to.eventually.be.rejected.and.eql({
@@ -1,15 +1,13 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('DELETE /tags/:tagId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
@@ -17,16 +15,16 @@ describe('DELETE /tags/:tagId', () => {
let length;
let tag;
return api.post('/tags', {name: 'Tag 1'})
return user.post('/tags', {name: 'Tag 1'})
.then((createdTag) => {
tag = createdTag;
return api.get(`/tags`);
return user.get(`/tags`);
})
.then((tags) => {
length = tags.length;
return api.del(`/tags/${tag._id}`);
return user.del(`/tags/${tag._id}`);
})
.then(() => api.get(`/tags`))
.then(() => user.get(`/tags`))
.then((tags) => {
expect(tags.length).to.equal(length - 1);
expect(tags[tags.length - 1].name).to.not.equal('Tag 1');
@@ -1,22 +1,20 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('GET /tags', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('returns all user\'s tags', () => {
return api.post('/tags', {name: 'Tag 1'})
.then(() => api.post('/tags', {name: 'Tag 2'}))
.then(() => api.get('/tags'))
return user.post('/tags', {name: 'Tag 1'})
.then(() => user.post('/tags', {name: 'Tag 2'}))
.then(() => user.get('/tags'))
.then((tags) => {
expect(tags.length).to.equal(2 + 3); // + 3 because 1 is a default task
expect(tags[tags.length - 2].name).to.equal('Tag 1');
@@ -1,25 +1,23 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('GET /tags/:tagId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('returns a tag given it\'s id', () => {
let createdTag;
return api.post('/tags', {name: 'Tag 1'})
return user.post('/tags', {name: 'Tag 1'})
.then((tag) => {
createdTag = tag;
return api.get(`/tags/${createdTag._id}`)
return user.get(`/tags/${createdTag._id}`)
})
.then((tag) => {
expect(tag).to.deep.equal(createdTag);
@@ -1,29 +1,29 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('POST /tags', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('creates a tag correctly', () => {
let createdTag;
return api.post('/tags', {
return user.post('/tags', {
name: 'Tag 1',
ignored: false,
}).then((tag) => {
createdTag = tag;
expect(tag.name).to.equal('Tag 1');
expect(tag.ignored).to.be.a('undefined');
return api.get(`/tags/${createdTag._id}`)
return user.get(`/tags/${createdTag._id}`);
})
.then((tag) => {
expect(tag).to.deep.equal(createdTag);
@@ -1,24 +1,22 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('PUT /tags/:tagId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('updates a tag given it\'s id', () => {
let length;
return api.post('/tags', {name: 'Tag 1'})
return user.post('/tags', {name: 'Tag 1'})
.then((createdTag) => {
return api.put(`/tags/${createdTag._id}`, {
return user.put(`/tags/${createdTag._id}`, {
name: 'Tag updated',
ignored: true
});
@@ -26,7 +24,8 @@ describe('PUT /tags/:tagId', () => {
.then((updatedTag) => {
expect(updatedTag.name).to.equal('Tag updated');
expect(updatedTag.ignored).to.be.a('undefined');
return api.get(`/tags/${updatedTag._id}`);
return user.get(`/tags/${updatedTag._id}`);
})
.then((tag) => {
expect(tag.name).to.equal('Tag updated');
@@ -1,16 +1,14 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
describe('DELETE /tasks/:id', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
@@ -18,7 +16,7 @@ describe('DELETE /tasks/:id', () => {
let task;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
}).then((createdTask) => {
@@ -27,9 +25,9 @@ describe('DELETE /tasks/:id', () => {
});
it('deletes a user\'s task', () => {
return api.del('/tasks/' + task._id)
return user.del('/tasks/' + task._id)
.then(() => {
return expect(api.get('/tasks/' + task._id)).to.eventually.be.rejected.and.eql({
return expect(user.get('/tasks/' + task._id)).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -40,7 +38,7 @@ describe('DELETE /tasks/:id', () => {
context('task cannot be deleted', () => {
it('cannot delete a non-existant task', () => {
return expect(api.del('/tasks/550e8400-e29b-41d4-a716-446655440000')).to.eventually.be.rejected.and.eql({
return expect(user.del('/tasks/550e8400-e29b-41d4-a716-446655440000')).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -49,14 +47,14 @@ describe('DELETE /tasks/:id', () => {
it('cannot delete a task owned by someone else', () => {
return generateUser()
.then((user2) => {
return requester(user2).post('/tasks', {
.then((anotherUser) => {
return anotherUser.post('/tasks', {
text: 'test habit',
type: 'habit',
})
});
})
.then((task2) => {
return expect(api.del('/tasks/' + task2._id)).to.eventually.be.rejected.and.eql({
return expect(user.del('/tasks/' + task2._id)).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -1,28 +1,26 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
import Q from 'q';
describe('GET /tasks', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('returns all user\'s tasks', () => {
let length;
return Q.all([
api.post('/tasks', {text: 'test habit', type: 'habit'}),
user.post('/tasks', {text: 'test habit', type: 'habit'}),
])
.then((createdTasks) => {
length = createdTasks.length;
return api.get('/tasks');
return user.get('/tasks');
})
.then((tasks) => {
expect(tasks.length).to.equal(length + 1); // + 1 because 1 is a default task
@@ -31,10 +29,10 @@ describe('GET /tasks', () => {
it('returns only a type of user\'s tasks if req.query.type is specified', () => {
let habitId;
api.post('/tasks', {text: 'test habit', type: 'habit'})
user.post('/tasks', {text: 'test habit', type: 'habit'})
.then((task) => {
habitId = task._id;
return api.get('/tasks?type=habit');
return user.get('/tasks?type=habit');
})
.then((tasks) => {
expect(tasks.length).to.equal(1);
@@ -1,17 +1,15 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('GET /tasks/:id', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
@@ -19,7 +17,7 @@ describe('GET /tasks/:id', () => {
let task;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
}).then((createdTask) => {
@@ -28,7 +26,7 @@ describe('GET /tasks/:id', () => {
});
it('gets specified task', () => {
return api.get('/tasks/' + task._id)
return user.get('/tasks/' + task._id)
.then((getTask) => {
expect(getTask).to.eql(task);
});
@@ -38,9 +36,9 @@ describe('GET /tasks/:id', () => {
it('can get active challenge task that user does not own'); // Yes?
});
context('task cannot accessed', () => {
context('task cannot be accessed', () => {
it('cannot get a non-existant task', () => {
return expect(api.get('/tasks/' + generateUUID())).to.eventually.be.rejected.and.eql({
return expect(user.get('/tasks/' + generateUUID())).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -48,17 +46,18 @@ describe('GET /tasks/:id', () => {
});
it('cannot get a task owned by someone else', () => {
let api2;
let anotherUser;
return generateUser()
.then((user2) => {
api2 = requester(user2);
return api.post('/tasks', {
anotherUser = user2;
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
})
});
}).then((task) => {
return expect(api2.get('/tasks/' + task._id)).to.eventually.be.rejected.and.eql({
return expect(anotherUser.get('/tasks/' + task._id)).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -1,24 +1,20 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
import { v4 as generateRandomUserName } from 'uuid';
import { each } from 'lodash';
describe('POST /tasks', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
context('validates params', () => {
it('returns an error if req.body.type is absent', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
notType: 'habit',
})).to.eventually.be.rejected.and.eql({
code: 400,
@@ -28,7 +24,7 @@ describe('POST /tasks', () => {
});
it('returns an error if req.body.type is not valid', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habitF',
})).to.eventually.be.rejected.and.eql({
code: 400,
@@ -38,7 +34,7 @@ describe('POST /tasks', () => {
});
it('returns an error if req.body.text is absent', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
})).to.eventually.be.rejected.and.eql({
code: 400,
@@ -48,7 +44,7 @@ describe('POST /tasks', () => {
});
it('automatically sets "task.userId" to user\'s uuid', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
}).then((task) => {
@@ -59,7 +55,7 @@ describe('POST /tasks', () => {
it(`ignores setting userId, history, createdAt,
updatedAt, challenge, completed, streak,
dateCompleted fields`, () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
userId: 123,
@@ -83,7 +79,7 @@ describe('POST /tasks', () => {
});
it('ignores invalid fields', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
notValid: true,
@@ -95,7 +91,7 @@ describe('POST /tasks', () => {
context('habits', () => {
it('creates a habit', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
up: false,
@@ -112,7 +108,7 @@ describe('POST /tasks', () => {
});
it('defaults to setting up and down to true', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
notes: 1976,
@@ -123,7 +119,7 @@ describe('POST /tasks', () => {
});
it('cannot create checklists', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
checklist: [
@@ -137,7 +133,7 @@ describe('POST /tasks', () => {
context('todos', () => {
it('creates a todo', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test todo',
type: 'todo',
notes: 1976,
@@ -150,7 +146,7 @@ describe('POST /tasks', () => {
});
it('can create checklists', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test todo',
type: 'todo',
checklist: [
@@ -171,7 +167,7 @@ describe('POST /tasks', () => {
it('creates a daily', () => {
let now = new Date();
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
notes: 1976,
@@ -190,7 +186,7 @@ describe('POST /tasks', () => {
});
it('defaults to a weekly frequency, with every day set', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
}).then((task) => {
@@ -209,7 +205,7 @@ describe('POST /tasks', () => {
});
it('allows repeat field to be configured', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
repeat: {
@@ -233,7 +229,7 @@ describe('POST /tasks', () => {
it('defaults startDate to today', () => {
let today = (new Date()).getDay();
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
}).then((task) => {
@@ -242,7 +238,7 @@ describe('POST /tasks', () => {
});
it('can create checklists', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
checklist: [
@@ -261,7 +257,7 @@ describe('POST /tasks', () => {
context('rewards', () => {
it('creates a reward', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test reward',
type: 'reward',
notes: 1976,
@@ -276,7 +272,7 @@ describe('POST /tasks', () => {
});
it('defaults to a 0 value', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test reward',
type: 'reward',
}).then((task) => {
@@ -285,7 +281,7 @@ describe('POST /tasks', () => {
});
it('requires value to be coerced into a number', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test reward',
type: 'reward',
value: "10",
@@ -295,7 +291,7 @@ describe('POST /tasks', () => {
});
it('cannot create checklists', () => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test reward',
type: 'reward',
checklist: [
@@ -1,25 +1,23 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('POST /tasks/:id/score/:direction', () => {
let user, api;
let user;
beforeEach(() => {
return generateUser({
'stats.gp': 100,
}).then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
context('all', () => {
it('requires a task id', () => {
return expect(api.post('/tasks/123/score/up')).to.eventually.be.rejected.and.eql({
return expect(user.post('/tasks/123/score/up')).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: t('invalidReqParams'),
@@ -27,7 +25,7 @@ describe('POST /tasks/:id/score/:direction', () => {
});
it('requires a task direction', () => {
return expect(api.post(`/tasks/${generateUUID()}/score/tt`)).to.eventually.be.rejected.and.eql({
return expect(user.post(`/tasks/${generateUUID()}/score/tt`)).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: t('invalidReqParams'),
@@ -39,7 +37,7 @@ describe('POST /tasks/:id/score/:direction', () => {
let todo;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test todo',
type: 'todo',
}).then((task) => {
@@ -48,20 +46,20 @@ describe('POST /tasks/:id/score/:direction', () => {
});
it('completes todo when direction is up', () => {
return api.post(`/tasks/${todo._id}/score/up`)
.then((res) => api.get(`/tasks/${todo._id}`))
return user.post(`/tasks/${todo._id}/score/up`)
.then((res) => user.get(`/tasks/${todo._id}`))
.then((task) => expect(task.completed).to.equal(true));
});
it('moves completed todos out of user.tasksOrder.todos', () => {
return api.get('/user')
return user.get('/user')
.then(user => {
expect(user.tasksOrder.todos.indexOf(todo._id)).to.not.equal(-1)
}).then(() => api.post(`/tasks/${todo._id}/score/up`))
.then(() => api.get(`/tasks/${todo._id}`))
}).then(() => user.post(`/tasks/${todo._id}/score/up`))
.then(() => user.get(`/tasks/${todo._id}`))
.then((updatedTask) => {
expect(updatedTask.completed).to.equal(true);
return api.get('/user');
return user.get('/user');
})
.then((user) => {
expect(user.tasksOrder.todos.indexOf(todo._id)).to.equal(-1)
@@ -69,15 +67,15 @@ describe('POST /tasks/:id/score/:direction', () => {
});
it('moves un-completed todos back into user.tasksOrder.todos', () => {
return api.get('/user')
return user.get('/user')
.then(user => {
expect(user.tasksOrder.todos.indexOf(todo._id)).to.not.equal(-1)
}).then(() => api.post(`/tasks/${todo._id}/score/up`))
.then(() => api.post(`/tasks/${todo._id}/score/down`))
.then(() => api.get(`/tasks/${todo._id}`))
}).then(() => user.post(`/tasks/${todo._id}/score/up`))
.then(() => user.post(`/tasks/${todo._id}/score/down`))
.then(() => user.get(`/tasks/${todo._id}`))
.then((updatedTask) => {
expect(updatedTask.completed).to.equal(false);
return api.get('/user');
return user.get('/user');
})
.then((user) => {
let l = user.tasksOrder.todos.length;
@@ -87,8 +85,8 @@ describe('POST /tasks/:id/score/:direction', () => {
});
it('uncompletes todo when direction is down', () => {
return api.post(`/tasks/${todo._id}/score/down`)
.then((res) => api.get(`/tasks/${todo._id}`))
return user.post(`/tasks/${todo._id}/score/down`)
.then((res) => user.get(`/tasks/${todo._id}`))
.then((updatedTask) => {
expect(updatedTask.completed).to.equal(false);
});
@@ -99,48 +97,48 @@ describe('POST /tasks/:id/score/:direction', () => {
it('scores down todo even if it is already uncompleted'); // Yes?
it('increases user\'s mp when direction is up', () => {
return api.post(`/tasks/${todo._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${todo._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.mp).to.be.greaterThan(user.stats.mp);
});
});
it('decreases user\'s mp when direction is down', () => {
return api.post(`/tasks/${todo._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${todo._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.mp).to.be.lessThan(user.stats.mp);
});
});
it('increases user\'s exp when direction is up', () => {
return api.post(`/tasks/${todo._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${todo._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.exp).to.be.greaterThan(user.stats.exp);
});
});
it('decreases user\'s exp when direction is down', () => {
return api.post(`/tasks/${todo._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${todo._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.exp).to.be.lessThan(user.stats.exp);
});
});
it('increases user\'s gold when direction is up', () => {
return api.post(`/tasks/${todo._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${todo._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.gp).to.be.greaterThan(user.stats.gp);
});
});
it('decreases user\'s gold when direction is down', () => {
return api.post(`/tasks/${todo._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${todo._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.gp).to.be.lessThan(user.stats.gp);
});
@@ -151,7 +149,7 @@ describe('POST /tasks/:id/score/:direction', () => {
let daily;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
}).then((task) => {
@@ -160,14 +158,14 @@ describe('POST /tasks/:id/score/:direction', () => {
});
it('completes daily when direction is up', () => {
return api.post(`/tasks/${daily._id}/score/up`)
.then((res) => api.get(`/tasks/${daily._id}`))
return user.post(`/tasks/${daily._id}/score/up`)
.then((res) => user.get(`/tasks/${daily._id}`))
.then((task) => expect(task.completed).to.equal(true));
});
it('uncompletes daily when direction is down', () => {
return api.post(`/tasks/${daily._id}/score/down`)
.then((res) => api.get(`/tasks/${daily._id}`))
return user.post(`/tasks/${daily._id}/score/down`)
.then((res) => user.get(`/tasks/${daily._id}`))
.then((task) => expect(task.completed).to.equal(false));
});
@@ -176,48 +174,48 @@ describe('POST /tasks/:id/score/:direction', () => {
it('scores down daily even if it is already uncompleted'); // Yes?
it('increases user\'s mp when direction is up', () => {
return api.post(`/tasks/${daily._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${daily._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.mp).to.be.greaterThan(user.stats.mp);
});
});
it('decreases user\'s mp when direction is down', () => {
return api.post(`/tasks/${daily._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${daily._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.mp).to.be.lessThan(user.stats.mp);
});
});
it('increases user\'s exp when direction is up', () => {
return api.post(`/tasks/${daily._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${daily._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.exp).to.be.greaterThan(user.stats.exp);
});
});
it('decreases user\'s exp when direction is down', () => {
return api.post(`/tasks/${daily._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${daily._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.exp).to.be.lessThan(user.stats.exp);
});
});
it('increases user\'s gold when direction is up', () => {
return api.post(`/tasks/${daily._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${daily._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.gp).to.be.greaterThan(user.stats.gp);
});
});
it('decreases user\'s gold when direction is down', () => {
return api.post(`/tasks/${daily._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${daily._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.gp).to.be.lessThan(user.stats.gp);
});
@@ -228,26 +226,26 @@ describe('POST /tasks/:id/score/:direction', () => {
let habit, minusHabit, plusHabit, neitherHabit;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
}).then((task) => {
habit = task;
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test min habit',
type: 'habit',
up: false,
});
}).then((task) => {
minusHabit = task;
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test plus habit',
type: 'habit',
down: false,
})
}).then((task) => {
plusHabit = task;
api.post('/tasks', {
user.post('/tasks', {
text: 'test neither habit',
type: 'habit',
up: false,
@@ -263,32 +261,32 @@ describe('POST /tasks/:id/score/:direction', () => {
it('prevents minus only habit from scoring up'); // Yes?
it('increases user\'s mp when direction is up', () => {
return api.post(`/tasks/${habit._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${habit._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.mp).to.be.greaterThan(user.stats.mp);
});
});
it('decreases user\'s mp when direction is down', () => {
return api.post(`/tasks/${habit._id}/score/down`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${habit._id}/score/down`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.mp).to.be.lessThan(user.stats.mp);
});
});
it('increases user\'s exp when direction is up', () => {
return api.post(`/tasks/${habit._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${habit._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.exp).to.be.greaterThan(user.stats.exp);
});
});
it('increases user\'s gold when direction is up', () => {
return api.post(`/tasks/${habit._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${habit._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(updatedUser.stats.gp).to.be.greaterThan(user.stats.gp);
});
@@ -299,7 +297,7 @@ describe('POST /tasks/:id/score/:direction', () => {
let reward;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test reward',
type: 'reward',
value: 5,
@@ -309,32 +307,32 @@ describe('POST /tasks/:id/score/:direction', () => {
});
it('purchases reward', () => {
return api.post(`/tasks/${reward._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${reward._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(user.stats.gp).to.equal(updatedUser.stats.gp + 5);
});
});
it('does not change user\'s mp', () => {
return api.post(`/tasks/${reward._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${reward._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(user.stats.mp).to.equal(updatedUser.stats.mp);
});
});
it('does not change user\'s exp', () => {
return api.post(`/tasks/${reward._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${reward._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(user.stats.exp).to.equal(updatedUser.stats.exp);
});
});
it('does not allow a down direction', () => {
return api.post(`/tasks/${reward._id}/score/up`)
.then((res) => api.get(`/user`))
return user.post(`/tasks/${reward._id}/score/up`)
.then((res) => user.get(`/user`))
.then((updatedUser) => {
expect(user.stats.mp).to.equal(updatedUser.stats.mp);
});
@@ -1,17 +1,15 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('PUT /tasks/:id', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
@@ -19,7 +17,7 @@ describe('PUT /tasks/:id', () => {
let task;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
}).then((createdTask) => {
@@ -30,7 +28,7 @@ describe('PUT /tasks/:id', () => {
it(`ignores setting _id, type, userId, history, createdAt,
updatedAt, challenge, completed, streak,
dateCompleted fields`, () => {
api.put('/tasks/' + task._id, {
user.put('/tasks/' + task._id, {
_id: 123,
type: 'daily',
userId: 123,
@@ -56,7 +54,7 @@ describe('PUT /tasks/:id', () => {
});
it('ignores invalid fields', () => {
api.put('/tasks/' + task._id, {
user.put('/tasks/' + task._id, {
notValid: true,
}).then((savedTask) => {
expect(savedTask.notValid).to.be.a('undefined');
@@ -68,7 +66,7 @@ describe('PUT /tasks/:id', () => {
let habit;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test habit',
type: 'habit',
notes: 1976,
@@ -78,7 +76,7 @@ describe('PUT /tasks/:id', () => {
});
it('updates a habit', () => {
return api.put(`/tasks/${habit._id}`, {
return user.put(`/tasks/${habit._id}`, {
text: 'some new text',
up: false,
down: false,
@@ -96,7 +94,7 @@ describe('PUT /tasks/:id', () => {
let todo;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test todo',
type: 'todo',
notes: 1976,
@@ -106,7 +104,7 @@ describe('PUT /tasks/:id', () => {
});
it('updates a todo', () => {
return api.put(`/tasks/${todo._id}`, {
return user.put(`/tasks/${todo._id}`, {
text: 'some new text',
notes: 'some new notes',
}).then((task) => {
@@ -116,13 +114,13 @@ describe('PUT /tasks/:id', () => {
});
it('can update checklists (replace it)', () => {
return api.put(`/tasks/${todo._id}`, {
return user.put(`/tasks/${todo._id}`, {
checklist: [
{text: 123, completed: false},
{text: 456, completed: true},
]
}).then((savedTodo) => {
return api.put(`/tasks/${todo._id}`, {
return user.put(`/tasks/${todo._id}`, {
checklist: [
{text: 789, completed: false},
]
@@ -136,10 +134,10 @@ describe('PUT /tasks/:id', () => {
it('can update tags (replace them)', () => {
let finalUUID = generateUUID();
return api.put(`/tasks/${todo._id}`, {
return user.put(`/tasks/${todo._id}`, {
tags: [generateUUID(), generateUUID()],
}).then((savedTodo) => {
return api.put(`/tasks/${todo._id}`, {
return user.put(`/tasks/${todo._id}`, {
tags: [finalUUID]
});
}).then((savedTodo2) => {
@@ -153,7 +151,7 @@ describe('PUT /tasks/:id', () => {
let daily;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test daily',
type: 'daily',
notes: 1976,
@@ -165,7 +163,7 @@ describe('PUT /tasks/:id', () => {
it('updates a daily', () => {
let now = new Date();
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
text: 'some new text',
notes: 'some new notes',
frequency: 'daily',
@@ -179,13 +177,13 @@ describe('PUT /tasks/:id', () => {
});
it('can update checklists (replace it)', () => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
checklist: [
{text: 123, completed: false},
{text: 456, completed: true},
]
}).then((savedDaily) => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
checklist: [
{text: 789, completed: false},
]
@@ -199,10 +197,10 @@ describe('PUT /tasks/:id', () => {
it('can update tags (replace them)', () => {
let finalUUID = generateUUID();
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
tags: [generateUUID(), generateUUID()],
}).then((savedDaily) => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
tags: [finalUUID]
});
}).then((savedDaily2) => {
@@ -212,10 +210,10 @@ describe('PUT /tasks/:id', () => {
});
it('updates repeat, even if frequency is set to daily', () => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
frequency: 'daily',
}).then((savedDaily) => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
repeat: {
m: false,
su: false
@@ -235,10 +233,10 @@ describe('PUT /tasks/:id', () => {
});
it('updates everyX, even if frequency is set to weekly', () => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
frequency: 'weekly',
}).then((savedDaily) => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
everyX: 5,
});
}).then((savedDaily2) => {
@@ -247,7 +245,7 @@ describe('PUT /tasks/:id', () => {
});
it('defaults startDate to today if none date object is passed in', () => {
return api.put(`/tasks/${daily._id}`, {
return user.put(`/tasks/${daily._id}`, {
frequency: 'weekly',
}).then((savedDaily2) => {
expect((new Date(savedDaily2.startDate)).getDay()).to.eql((new Date()).getDay());
@@ -259,7 +257,7 @@ describe('PUT /tasks/:id', () => {
let reward;
beforeEach(() => {
return api.post('/tasks', {
return user.post('/tasks', {
text: 'test reward',
type: 'reward',
notes: 1976,
@@ -270,7 +268,7 @@ describe('PUT /tasks/:id', () => {
});
it('updates a reward', () => {
return api.put(`/tasks/${reward._id}`, {
return user.put(`/tasks/${reward._id}`, {
text: 'some new text',
notes: 'some new notes',
value: 10,
@@ -282,7 +280,7 @@ describe('PUT /tasks/:id', () => {
});
it('requires value to be coerced into a number', () => {
return api.put(`/tasks/${reward._id}`, {
return user.put(`/tasks/${reward._id}`, {
value: "100",
}).then((task) => {
expect(task.value).to.eql(100);
@@ -1,33 +1,31 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('DELETE /tasks/:taskId/checklist/:itemId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('deletes a checklist item', () => {
let task;
return api.post('/tasks', {
return user.post('/tasks', {
type: 'daily',
text: 'Daily with checklist',
}).then(createdTask => {
task = createdTask;
return api.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false});
return user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false});
}).then((savedTask) => {
return api.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0]._id}`);
return user.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0]._id}`);
}).then(() => {
return api.get(`/tasks/${task._id}`);
return user.get(`/tasks/${task._id}`);
}).then((savedTask) => {
expect(savedTask.checklist.length).to.equal(0);
});
@@ -35,12 +33,12 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => {
it('does not work with habits', () => {
let habit;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'habit with checklist',
}).then(createdTask => {
habit = createdTask;
return api.del(`/tasks/${habit._id}/checklist/${generateUUID()}`);
return user.del(`/tasks/${habit._id}/checklist/${generateUUID()}`);
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -50,12 +48,12 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => {
it('does not work with rewards', () => {
let reward;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'reward',
text: 'reward with checklist',
}).then(createdTask => {
reward = createdTask;
return api.del(`/tasks/${reward._id}/checklist/${generateUUID()}`);
return user.del(`/tasks/${reward._id}/checklist/${generateUUID()}`);
}).then(checklistItem => {})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -64,7 +62,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => {
});
it('fails on task not found', () => {
return expect(api.del(`/tasks/${generateUUID()}/checklist/${generateUUID()}`)).to.eventually.be.rejected.and.eql({
return expect(user.del(`/tasks/${generateUUID()}/checklist/${generateUUID()}`)).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -72,11 +70,11 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => {
});
it('fails on checklist item not found', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'daily',
text: 'daily with checklist',
}).then(createdTask => {
return api.del(`/tasks/${createdTask._id}/checklist/${generateUUID()}`);
return user.del(`/tasks/${createdTask._id}/checklist/${generateUUID()}`);
})).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
@@ -1,29 +1,28 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('POST /tasks/:taskId/checklist/', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('adds a checklist item to a task', () => {
let task;
return api.post('/tasks', {
return user.post('/tasks', {
type: 'daily',
text: 'Daily with checklist',
}).then(createdTask => {
task = createdTask;
return api.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', ignored: false, _id: 123});
return user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', ignored: false, _id: 123});
}).then((savedTask) => {
expect(savedTask.checklist.length).to.equal(1);
expect(savedTask.checklist[0].text).to.equal('Checklist Item 1');
@@ -36,12 +35,13 @@ describe('POST /tasks/:taskId/checklist/', () => {
it('does not add a checklist to habits', () => {
let habit;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'habit with checklist',
}).then(createdTask => {
habit = createdTask;
return api.post(`/tasks/${habit._id}/checklist`, {text: 'Checklist Item 1'});
return user.post(`/tasks/${habit._id}/checklist`, {text: 'Checklist Item 1'});
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -51,12 +51,12 @@ describe('POST /tasks/:taskId/checklist/', () => {
it('does not add a checklist to rewards', () => {
let reward;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'reward',
text: 'reward with checklist',
}).then(createdTask => {
reward = createdTask;
return api.post(`/tasks/${reward._id}/checklist`, {text: 'Checklist Item 1'});
return user.post(`/tasks/${reward._id}/checklist`, {text: 'Checklist Item 1'});
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -65,7 +65,7 @@ describe('POST /tasks/:taskId/checklist/', () => {
});
it('fails on task not found', () => {
return expect(api.post(`/tasks/${generateUUID()}/checklist`, {
return expect(user.post(`/tasks/${generateUUID()}/checklist`, {
text: 'Checklist Item 1'
})).to.eventually.be.rejected.and.eql({
code: 404,
@@ -1,31 +1,29 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('POST /tasks/:taskId/checklist/:itemId/score', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('scores a checklist item', () => {
let task;
return api.post('/tasks', {
return user.post('/tasks', {
type: 'daily',
text: 'Daily with checklist',
}).then(createdTask => {
task = createdTask;
return api.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false});
return user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false});
}).then((savedTask) => {
return api.post(`/tasks/${task._id}/checklist/${savedTask.checklist[0]._id}/score`);
return user.post(`/tasks/${task._id}/checklist/${savedTask.checklist[0]._id}/score`);
}).then((savedTask) => {
expect(savedTask.checklist.length).to.equal(1);
expect(savedTask.checklist[0].completed).to.equal(true);
@@ -34,12 +32,12 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => {
it('fails on habits', () => {
let habit;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'habit with checklist',
}).then(createdTask => {
habit = createdTask;
return api.post(`/tasks/${habit._id}/checklist/${generateUUID()}/score`, {text: 'Checklist Item 1'});
return user.post(`/tasks/${habit._id}/checklist/${generateUUID()}/score`, {text: 'Checklist Item 1'});
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -49,12 +47,12 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => {
it('fails on rewards', () => {
let reward;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'reward',
text: 'reward with checklist',
}).then(createdTask => {
reward = createdTask;
return api.post(`/tasks/${reward._id}/checklist/${generateUUID()}/score`);
return user.post(`/tasks/${reward._id}/checklist/${generateUUID()}/score`);
}).then(checklistItem => {})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -63,7 +61,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => {
});
it('fails on task not found', () => {
return expect(api.post(`/tasks/${generateUUID()}/checklist/${generateUUID()}/score`)).to.eventually.be.rejected.and.eql({
return expect(user.post(`/tasks/${generateUUID()}/checklist/${generateUUID()}/score`)).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -71,11 +69,11 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => {
});
it('fails on checklist item not found', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'daily',
text: 'daily with checklist',
}).then(createdTask => {
return api.post(`/tasks/${createdTask._id}/checklist/${generateUUID()}/score`);
return user.post(`/tasks/${createdTask._id}/checklist/${generateUUID()}/score`);
})).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
@@ -1,31 +1,29 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('PUT /tasks/:taskId/checklist/:itemId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('updates a checklist item', () => {
let task;
return api.post('/tasks', {
return user.post('/tasks', {
type: 'daily',
text: 'Daily with checklist',
}).then(createdTask => {
task = createdTask;
return api.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false});
return user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false});
}).then((savedTask) => {
return api.put(`/tasks/${task._id}/checklist/${savedTask.checklist[0]._id}`, {text: 'updated', completed: true, _id: 123});
return user.put(`/tasks/${task._id}/checklist/${savedTask.checklist[0]._id}`, {text: 'updated', completed: true, _id: 123});
}).then((savedTask) => {
expect(savedTask.checklist.length).to.equal(1);
expect(savedTask.checklist[0].text).to.equal('updated');
@@ -36,12 +34,12 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => {
it('fails on habits', () => {
let habit;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'habit with checklist',
}).then(createdTask => {
habit = createdTask;
return api.put(`/tasks/${habit._id}/checklist/${generateUUID()}`);
return user.put(`/tasks/${habit._id}/checklist/${generateUUID()}`);
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -51,12 +49,12 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => {
it('fails on rewards', () => {
let reward;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'reward',
text: 'reward with checklist',
}).then(createdTask => {
reward = createdTask;
return api.put(`/tasks/${reward._id}/checklist/${generateUUID()}`);
return user.put(`/tasks/${reward._id}/checklist/${generateUUID()}`);
}).then(checklistItem => {})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -65,7 +63,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => {
});
it('fails on task not found', () => {
return expect(api.put(`/tasks/${generateUUID()}/checklist/${generateUUID()}`)).to.eventually.be.rejected.and.eql({
return expect(user.put(`/tasks/${generateUUID()}/checklist/${generateUUID()}`)).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('taskNotFound'),
@@ -73,11 +71,11 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => {
});
it('fails on checklist item not found', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'daily',
text: 'daily with checklist',
}).then(createdTask => {
return api.put(`/tasks/${createdTask._id}/checklist/${generateUUID()}`);
return user.put(`/tasks/${createdTask._id}/checklist/${generateUUID()}`);
})).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
@@ -1,17 +1,15 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('DELETE /tasks/:taskId/tags/:tagId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
@@ -19,18 +17,18 @@ describe('DELETE /tasks/:taskId/tags/:tagId', () => {
let tag;
let task;
return api.post('/tasks', {
return user.post('/tasks', {
type: 'habit',
text: 'Task with tag',
}).then(createdTask => {
task = createdTask;
return api.post('/tags', {name: 'Tag 1'});
return user.post('/tags', {name: 'Tag 1'});
}).then(createdTag => {
tag = createdTag;
return api.post(`/tasks/${task._id}/tags/${tag._id}`);
return user.post(`/tasks/${task._id}/tags/${tag._id}`);
}).then(savedTask => {
return api.del(`/tasks/${task._id}/tags/${tag._id}`);
}).then(() => api.get(`/tasks/${task._id}`))
return user.del(`/tasks/${task._id}/tags/${tag._id}`);
}).then(() => user.get(`/tasks/${task._id}`))
.then(updatedTask => {
expect(updatedTask.tags.length).to.equal(0);
});
@@ -39,11 +37,11 @@ describe('DELETE /tasks/:taskId/tags/:tagId', () => {
it('only deletes existing tags', () => {
let task;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'Task with tag',
}).then(createdTask => {
return api.del(`/tasks/${createdTask._id}/tags/${generateUUID()}`);
return user.del(`/tasks/${createdTask._id}/tags/${generateUUID()}`);
})).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
@@ -1,17 +1,15 @@
import {
generateUser,
requester,
translate as t,
} from '../../../../../helpers/api-integration.helper';
import { v4 as generateUUID } from 'uuid';
describe('POST /tasks/:taskId/tags/:tagId', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
@@ -19,15 +17,15 @@ describe('POST /tasks/:taskId/tags/:tagId', () => {
let tag;
let task;
return api.post('/tasks', {
return user.post('/tasks', {
type: 'habit',
text: 'Task with tag',
}).then(createdTask => {
task = createdTask;
return api.post('/tags', {name: 'Tag 1'});
return user.post('/tags', {name: 'Tag 1'});
}).then(createdTag => {
tag = createdTag;
return api.post(`/tasks/${task._id}/tags/${tag._id}`);
return user.post(`/tasks/${task._id}/tags/${tag._id}`);
}).then(savedTask => {
expect(savedTask.tags[0]).to.equal(tag._id);
});
@@ -37,17 +35,17 @@ describe('POST /tasks/:taskId/tags/:tagId', () => {
let tag;
let task;
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'Task with tag',
}).then(createdTask => {
task = createdTask;
return api.post('/tags', {name: 'Tag 1'});
return user.post('/tags', {name: 'Tag 1'});
}).then(createdTag => {
tag = createdTag;
return api.post(`/tasks/${task._id}/tags/${tag._id}`);
return user.post(`/tasks/${task._id}/tags/${tag._id}`);
}).then(() => {
return api.post(`/tasks/${task._id}/tags/${tag._id}`);
return user.post(`/tasks/${task._id}/tags/${tag._id}`);
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -56,11 +54,11 @@ describe('POST /tasks/:taskId/tags/:tagId', () => {
});
it('does not add a non existing tag to a task', () => {
return expect(api.post('/tasks', {
return expect(user.post('/tasks', {
type: 'habit',
text: 'Task with tag',
}).then((task) => {
return api.post(`/tasks/${task._id}/tags/${generateUUID()}`);
return user.post(`/tasks/${task._id}/tags/${generateUUID()}`);
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
@@ -1,31 +1,29 @@
import {
generateUser,
requester,
} from '../../../../helpers/api-integration.helper';
describe('GET /user', () => {
let user, api;
let user;
before(() => {
return generateUser().then((generatedUser) => {
user = generatedUser;
api = requester(user);
});
});
it('returns the authenticated user', () => {
return api.get('/user')
return user.get('/user')
.then(returnedUser => {
expect(returnedUser._id).to.equal(user._id);
});
});
it('does not return private paths (and apiToken)', () => {
return api.get('/user')
return user.get('/user')
.then(returnedUser => {
expect(returnedUser.auth.local.hashed_password).to.be.a('undefined');
expect(returnedUser.auth.local.salt).to.be.a('undefined');
expect(returnedUser.apiToken).to.be.a('undefined');
expect(returnedUser.auth.local.hashed_password).to.not.exist;
expect(returnedUser.auth.local.salt).to.not.exist;
expect(returnedUser.apiToken).to.not.exist;
});
});
});
+16 -3
View File
@@ -1,9 +1,10 @@
/* eslint-disable no-use-before-define */
import {
set,
assign,
each,
isEmpty,
set,
times,
} from 'lodash';
import { MongoClient as mongo } from 'mongodb';
@@ -23,6 +24,17 @@ const ROUTES = {
},
};
class ApiUser {
constructor (options) {
assign(this, options);
this.get = _requestMaker(this, 'get');
this.post = _requestMaker(this, 'post');
this.put = _requestMaker(this, 'put');
this.del = _requestMaker(this, 'del');
}
}
// Sets up an abject that can make all REST requests
// If a user is passed in, the uuid and api token of
// the user are used to make the requests
@@ -94,7 +106,9 @@ export function generateUser (update = {}) {
confirmPassword: password,
}).then((user) => {
_updateDocument('users', user, update, () => {
resolve(user);
let apiUser = new ApiUser(user);
resolve(apiUser);
});
}).catch(reject);
});
@@ -277,7 +291,6 @@ function _updateDocument (collectionName, doc, update, cb) {
return cb();
}
// TODO use config for db url?
mongo.connect('mongodb://localhost/habitrpg_test', (connectErr, db) => {
if (connectErr) throw new Error(`Error connecting to database when updating ${collectionName} collection: ${connectErr}`);