diff --git a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js index 281d179baf..2806fffa3c 100644 --- a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js +++ b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js @@ -3,6 +3,7 @@ import { createAndPopulateGroup, translate as t, } from '../../../../helpers/api-v3-integration.helper'; +import * as email from '../../../../../website/server/libs/email'; describe('POST /groups/:groupId/removeMember/:memberId', () => { let leader; @@ -60,6 +61,14 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { }); context('Guilds', () => { + beforeEach(() => { + sandbox.spy(email, 'sendTxn'); + }); + + afterEach(() => { + sandbox.restore(); + }); + it('can remove other members', async () => { await leader.post(`/groups/${guild._id}/removeMember/${member._id}`); let memberRemoved = await member.get('/user'); @@ -80,6 +89,22 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { expect(_.findIndex(invitedUserWithoutInvite.invitations.guilds, {id: guild._id})).eql(-1); }); + + it('sends email to user with rescinded invite', async () => { + await leader.post(`/groups/${guild._id}/removeMember/${invitedUser._id}`); + + expect(email.sendTxn).to.be.calledOnce; + expect(email.sendTxn.args[0][0]._id).to.be.eql(invitedUser._id); + expect(email.sendTxn.args[0][1]).to.be.eql('guild-invite-rescinded'); + }); + + it('sends email to removed user', async () => { + await leader.post(`/groups/${guild._id}/removeMember/${member._id}`); + + expect(email.sendTxn).to.be.calledOnce; + expect(email.sendTxn.args[0][0]._id).to.be.eql(member._id); + expect(email.sendTxn.args[0][1]).to.be.eql('kicked-from-guild'); + }); }); context('Party', () => { @@ -105,6 +130,11 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { partyInvitedUser = invitees[0]; partyMember = members[0]; removedMember = members[1]; + sandbox.spy(email, 'sendTxn'); + }); + + afterEach(() => { + sandbox.restore(); }); it('can remove other members', async () => { @@ -187,5 +217,21 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { expect(party.quest.members[partyLeader._id]).to.be.true; expect(party.quest.members[partyMember._id]).to.not.exist; }); + + it('sends email to user with rescinded invite', async () => { + await partyLeader.post(`/groups/${party._id}/removeMember/${partyInvitedUser._id}`); + + expect(email.sendTxn).to.be.calledOnce; + expect(email.sendTxn.args[0][0]._id).to.be.eql(partyInvitedUser._id); + expect(email.sendTxn.args[0][1]).to.be.eql('party-invite-rescinded'); + }); + + it('sends email to removed user', async () => { + await partyLeader.post(`/groups/${party._id}/removeMember/${partyMember._id}`); + + expect(email.sendTxn).to.be.calledOnce; + expect(email.sendTxn.args[0][0]._id).to.be.eql(partyMember._id); + expect(email.sendTxn.args[0][1]).to.be.eql('kicked-from-party'); + }); }); }); diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index ec78eb3d93..8a066682b9 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -468,9 +468,10 @@ api.leaveGroup = { }; // Send an email to the removed user with an optional message from the leader -function _sendMessageToRemoved (group, removedUser, message) { +function _sendMessageToRemoved (group, removedUser, message, isInGroup) { if (removedUser.preferences.emailNotifications.kickedGroup !== false) { - sendTxnEmail(removedUser, `kicked-from-${group.type}`, [ + let subject = isInGroup ? `kicked-from-${group.type}` : `${group.type}-invite-rescinded`; + sendTxnEmail(removedUser, subject, [ {name: 'GROUP_NAME', content: group.name}, {name: 'MESSAGE', content: message}, {name: 'GUILDS_LINK', content: '/#/options/groups/guilds/public'}, @@ -575,7 +576,7 @@ api.removeGroupMember = { } let message = req.query.message; - if (message) _sendMessageToRemoved(group, member, message); + _sendMessageToRemoved(group, member, message, isInGroup); await Bluebird.all([ member.save(),