Files
habitica/test/api/groups/POST-groups.test.js
2015-10-25 11:21:19 -05:00

143 lines
3.9 KiB
JavaScript

import {
generateGroup,
generateUser,
requester,
} from '../../helpers/api.helper';
describe('POST /groups', () => {
context('All groups', () => {
let api, 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) => {
expect(group._id).to.exist;
expect(group.name).to.eql(`${leader.profile.name}'s group`);
expect(group.type).to.eql('party');
expect(group.privacy).to.eql('private');
});
});
it('returns a group object', () => {
let group = {
name: 'Test Group',
type: 'party',
leaderOnly: { challenges: true },
description: 'Test Group Description',
leaderMessage: 'Test Group Message',
};
return expect(api.post('/groups', group))
.to.eventually.shallowDeepEqual({
leader: leader._id,
name: group.name,
description: group.description,
leaderMessage: group.leaderMessage,
leaderOnly: group.leaderOnly,
memberCount: 1,
}).and.to.have.property('_id');
});
it('returns a populated members array', () => {
return expect(api.post('/groups', {
type: 'party',
})).to.eventually.have.deep.property('members[0]')
.and.to.shallowDeepEqual({
_id: leader._id,
profile: leader.profile,
contributor: leader.contributor,
});
});
});
context('Parties', () => {
let api, leader;
beforeEach(() => {
return generateUser().then((user) => {
leader = user;
api = requester(user);
});
});
it('allows party creation without gems', () => {
return expect(api.post('/groups', {
type: 'party',
})).to.eventually.have.property('_id');
});
it('prevents party creation if user is already in party', () => {
return expect(generateGroup(leader, {
type: 'party',
}).then((group) => {
return api.post('/groups', {
type: 'party',
});
})).to.be.rejectedWith('Already in a party, try refreshing.');
})
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', {
type: 'party',
privacy: 'public',
})).to.be.rejectedWith('Parties must be private');
});
});
context('Guilds', () => {
let api, leader;
beforeEach(() => {
return generateUser({
balance: 2,
}).then((user) => {
leader = user;
api = requester(user);
});
});
it('prevents guild creation when user does not have enough gems', () => {
return expect(generateUser({
balance: 0.75,
}).then((user) => {
api = requester(user);
return api.post('/groups', {
type: 'guild',
});
})).to.be.rejectedWith('Not enough gems!');
});
it('can create a public guild', () => {
return expect(api.post('/groups', {
type: 'guild',
privacy: 'public',
})).to.eventually.have.property('leader', leader._id);
});
it('can create a private guild', () => {
return expect(api.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', {
type: 'guild',
privacy: 'private',
}).then((group) => {
expect(group.balance).to.eql(1);
return api.get('/user');
})).to.eventually.have.deep.property('balance', 1);
});
});
});