Files
habitica/test/api/v2/user/DELETE-user.test.js
2016-01-02 22:19:47 -06:00

169 lines
4.3 KiB
JavaScript

import {
checkExistence,
createAndPopulateGroup,
generateGroup,
generateUser,
} from '../../../helpers/api-integration.helper';
import { find } from 'lodash';
describe('DELETE /user', () => {
let user;
beforeEach(async () => {
user = await generateUser();
});
it('deletes the user', async () => {
return expect(user.del('/user').then(() => {
return checkExistence('users', user._id);
})).to.eventually.eql(false);
});
context('user has active subscription', () => {
it('does not delete account');
});
context('last member of a party', () => {
let party;
beforeEach(async () => {
return generateGroup(user, {
type: 'party',
privacy: 'private',
}).then((group) => {
party = group;
});
});
it('deletes party when user is the only member', async () => {
return expect(user.del('/user').then(() => {
return checkExistence('groups', party._id);
})).to.eventually.eql(false);
});
});
context('last member of a private guild', () => {
let guild;
beforeEach(async () => {
return generateGroup(user, {
type: 'guild',
privacy: 'private',
}).then((group) => {
guild = group;
});
});
it('deletes guild when user is the only member', async () => {
return expect(user.del('/user').then(() => {
return checkExistence('groups', guild._id);
})).to.eventually.eql(false);
});
});
context('groups user is leader of', () => {
let group, oldLeader, newLeader;
beforeEach(async () => {
return createAndPopulateGroup({
groupDetails: {
type: 'guild',
privacy: 'public',
},
members: 3,
}).then((res) => {
group = res.group;
newLeader = res.members[0];
oldLeader = res.leader;
});
});
it('chooses new group leader for any group user was the leader of', async () => {
return oldLeader.del('/user').then(() => {
return newLeader.get(`/groups/${group._id}`);
}).then((guild) => {
expect(guild.leader).to.exist;
expect(guild.leader._id).to.not.eql(oldLeader._id);
});
});
});
context('groups user is a part of', () => {
let group1, group2, userToDelete, otherUser;
beforeEach(async () => {
return generateUser({
balance: 10,
}).then((_user) => {
userToDelete = _user;
return generateGroup(userToDelete, {
type: 'guild',
privacy: 'public',
});
}).then((newGroup) => {
group1 = newGroup;
return createAndPopulateGroup({
groupDetails: {
type: 'guild',
privacy: 'public',
},
members: 3,
});
}).then((res) => {
group2 = res.group;
otherUser = res.members[0];
return userToDelete.post(`/groups/${group2._id}/join`);
});
});
it('removes user from all groups user was a part of', async () => {
return userToDelete.del('/user').then(() => {
return otherUser.get(`/groups/${group1._id}`);
}).then((fetchedGroup1) => {
expect(fetchedGroup1.members).to.be.empty;
return otherUser.get(`/groups/${group2._id}`);
}).then((fetchedGroup2) => {
expect(fetchedGroup2.members).to.not.be.empty;
let userInGroup = find(fetchedGroup2.members, (member) => {
return member._id === userToDelete._id;
});
expect(userInGroup).to.not.be.ok;
});
});
});
context('pending invitation to group', () => {
let group, userToDelete, otherUser;
beforeEach(async () => {
return createAndPopulateGroup({
groupDetails: {
type: 'guild',
privacy: 'public',
},
members: 3,
invites: 2,
}).then((res) => {
group = res.group;
otherUser = res.members[0];
userToDelete = res.invitees[0];
});
});
it('removes invitations from groups', async () => {
return userToDelete.del('/user').then(() => {
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);
});
});
});
});