diff --git a/test/api/v3/integration/groups/POST-groups_groupId_join.js b/test/api/v3/integration/groups/POST-groups_groupId_join.js index aa26c10289..2c36d12f19 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_join.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_join.js @@ -1,8 +1,20 @@ import { generateUser, + translate as t, } from '../../../../helpers/api-integration.helper'; +import { v4 as generateUUID } from 'uuid'; describe('POST /group/:groupId/join', () => { + it('returns error when groupId is not for a valid group', async () => { + let joiningUser = await generateUser(); + + await expect(joiningUser.post(`/groups/${generateUUID()}/join`)).to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('groupNotFound'), + }); + }); + context('Accepting invitation to a guild', () => { let user, invitedUser, guild; @@ -11,24 +23,68 @@ describe('POST /group/:groupId/join', () => { guild = await user.post('/groups', { name: 'Test Guild', type: 'guild', - }); - invitedUser = await generateUser({ - 'invitations.guilds': [{ id: guild._id}], + privacy: 'private', }); }); - it('does not give basilist quest to inviter when joining a guild', async () => { - await invitedUser.post(`/groups/${guild._id}/join`); + it('returns error when user is not invited to private guild', async () => { + let joiningUser = await generateUser(); - await expect(user.get('/user')).to.eventually.not.have.deep.property('items.quests.basilist'); + await expect(joiningUser.post(`/groups/${guild._id}/join`)).to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('messageGroupRequiresInvite'), + }); }); - it('does not increment basilist quest count to inviter with basilist when joining a guild', async () => { - user.update({ 'items.quests.basilist': 1 }); + it('allows non-invited users to join public guilds', async () => { + await user.update({balance: 1}); + guild = await user.post('/groups', { + name: 'Test Guild', + type: 'guild', + privacy: 'public', + }); - await invitedUser.post(`/groups/${guild._id}/join`); + let joiningUser = await generateUser(); + await joiningUser.post(`/groups/${guild._id}/join`); - await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + await expect(joiningUser.get('/user')).to.eventually.have.property('guilds').to.include(guild._id); + }); + + context('User is invited', () => { + beforeEach(async () => { + invitedUser = await generateUser({ + 'invitations.guilds': [{ id: guild._id}], + }); + }); + + it('allows invited user to join private guilds', async () => { + await invitedUser.post(`/groups/${guild._id}/join`); + + await expect(invitedUser.get('/user')).to.eventually.have.property('guilds').to.include(guild._id); + }); + + it('clears invitation from user when joining guilds', async () => { + await invitedUser.post(`/groups/${guild._id}/join`); + + await expect(invitedUser.get('/user')) + .to.eventually.have.deep.property('invitations.guilds') + .to.not.include({id: guild._id}); + }); + + it('does not give basilist quest to inviter when joining a guild', async () => { + await invitedUser.post(`/groups/${guild._id}/join`); + + await expect(user.get('/user')).to.eventually.not.have.deep.property('items.quests.basilist'); + }); + + it('does not increment basilist quest count to inviter with basilist when joining a guild', async () => { + await user.update({ 'items.quests.basilist': 1 }); + + await invitedUser.post(`/groups/${guild._id}/join`); + + await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + }); }); }); @@ -41,23 +97,50 @@ describe('POST /group/:groupId/join', () => { name: 'Test Party', type: 'party', }); - invitedUser = await generateUser({ - 'invitations.party': { id: party._id, inviter: user._id }, + }); + + it('returns error when user is not invited to party', async () => { + let joiningUser = await generateUser(); + + await expect(joiningUser.post(`/groups/${party._id}/join`)).to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('messageGroupRequiresInvite'), }); }); - it('gives basilist quest item to the inviter when joining a party', async () => { - await invitedUser.post(`/groups/${party._id}/join`); + context('User is invited', () => { + beforeEach(async () => { + invitedUser = await generateUser({ + 'invitations.party': { id: party._id, inviter: user._id }, + }); + }); - await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); - }); + it('allows invited user to join party', async () => { + await invitedUser.post(`/groups/${party._id}/join`); - it('increments basilist quest item count to inviter when joining a party', async () => { - user.update({'items.quests.basilist': 1 }); + await expect(invitedUser.get('/user')).to.eventually.have.deep.property('party._id', party._id); + }); - await invitedUser.post(`/groups/${party._id}/join`); + it('clears invitation from user when joining party', async () => { + await invitedUser.post(`/groups/${party._id}/join`); - await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 2); + await expect(invitedUser.get('/user')).to.eventually.not.have.deep.property('invitations.party.id'); + }); + + it('gives basilist quest item to the inviter when joining a party', async () => { + await invitedUser.post(`/groups/${party._id}/join`); + + await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 1); + }); + + it('increments basilist quest item count to inviter when joining a party', async () => { + await user.update({'items.quests.basilist': 1 }); + + await invitedUser.post(`/groups/${party._id}/join`); + + await expect(user.get('/user')).to.eventually.have.deep.property('items.quests.basilist', 2); + }); }); }); }); diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index a61c56e26c..80b2972217 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -228,7 +228,7 @@ api.joinGroup = { user.party._id = group._id; // Set group as user's party isUserInvited = true; - } else if (group.type === 'guild' && user.invitations.guilds) { + } else if (group.type === 'guild') { let i = _.findIndex(user.invitations.guilds, {id: group._id}); if (i !== -1) {