diff --git a/test/api/v3/integration/groups/POST-groups_invite.test.js b/test/api/v3/integration/groups/POST-groups_invite.test.js index 55c25d9153..d3f2b78c27 100644 --- a/test/api/v3/integration/groups/POST-groups_invite.test.js +++ b/test/api/v3/integration/groups/POST-groups_invite.test.js @@ -3,6 +3,7 @@ import { translate as t, } from '../../../../helpers/api-v3-integration.helper'; import { v4 as generateUUID } from 'uuid'; +import * as email from '../../../../../website/src/libs/api-v3/email'; const INVITES_LIMIT = 100; @@ -19,6 +20,10 @@ describe('Post /groups/:groupId/invite', () => { }); }); + afterEach(() => { + if (email.sendTxn.restore) email.sendTxn.restore(); + }); + describe('user id invites', () => { it('returns an error when invited user is not found', async () => { let fakeID = generateUUID(); @@ -70,9 +75,10 @@ describe('Post /groups/:groupId/invite', () => { }); }); - it('invites a user to a group by uuid', async () => { + it.only('invites a user to a group by uuid', async () => { let userToInvite = await generateUser(); + sandbox.stub(email, 'sendTxn'); await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], })).to.eventually.deep.equal([{ @@ -80,6 +86,13 @@ describe('Post /groups/:groupId/invite', () => { name: groupName, inviter: inviter._id, }]); + + expect(email.sendTxn).to.be.calledOnce; + expect(email.sendTxn[0][0]._id).to.equal(userToInvite._id); + expect(email.sendTxn[0][1]).to.equal('invited-guild'); + expect(email.sendTxn[0][2]).to.have.all.keys(['GUILD_NAME', 'GUILD_URL', 'INVITER']); + expect(email.sendTxn[0][2].INVITER).to.equal(inviter.profile.name); + await expect(userToInvite.get('/user')) .to.eventually.have.deep.property('invitations.guilds[0].id', group._id); }); @@ -102,6 +115,8 @@ describe('Post /groups/:groupId/invite', () => { inviter: inviter._id, }, ]); + expect(email.sendTxn).to.be.calledTwice; + await expect(userToInvite.get('/user')).to.eventually.have.deep.property('invitations.guilds[0].id', group._id); await expect(userToInvite2.get('/user')).to.eventually.have.deep.property('invitations.guilds[0].id', group._id); }); @@ -173,13 +188,23 @@ describe('Post /groups/:groupId/invite', () => { it('invites a user to a group by email', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { emails: [testInvite], + inviter: 'inviter name', })).to.exist; + + expect(email.sendTxn).to.be.calledOnce; + expect(email.sendTxn[0][0]).to.eql(testInvite); + expect(email.sendTxn[0][1]).to.equal('invite-friend-guild'); + expect(email.sendTxn[0][2]).to.have.all.keys(['GUILD_NAME', 'LINK', 'INVITER']); + expect(email.sendTxn[0][2].INVITER).to.equal('inviter name'); }); it('invites multiple users to a group by email', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { emails: [testInvite, {name: 'test2', email: 'test2@habitica.com'}], })).to.exist; + + expect(email.sendTxn).to.be.calledTwice; + expect(email.sendTxn[0][2].INVITER).to.equal(inviter.profile.name); }); }); @@ -226,6 +251,7 @@ describe('Post /groups/:groupId/invite', () => { expect(invite).to.exist; expect(invitedUser.invitations.guilds[0].id).to.equal(group._id); + expect(email.sendTxn).to.be.calledTwice; }); }); @@ -320,6 +346,8 @@ describe('Post /groups/:groupId/invite', () => { uuids: [userToInvite._id], }); expect((await userToInvite.get('/user')).invitations.party.id).to.equal(party._id); + + expect(email.sendTxn).to.be.calledOnce; }); }); }); diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index a078092a7e..b4580d0491 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -548,14 +548,13 @@ async function _inviteByEmail (invite, group, inviter, req, res) { let variables = [ {name: 'LINK', content: link}, - {name: 'INVITER', content: inviter.profile.name}, + {name: 'INVITER', content: req.body.inviter || inviter.profile.name}, ]; if (group.type === 'guild') { variables.push({name: 'GUILD_NAME', content: group.name}); } - // TODO implement "users can only be invited once" // Check for the email address not to be unsubscribed let userIsUnsubscribed = await EmailUnsubscription.findOne({email: invite.email}).exec(); let groupLabel = group.type === 'guild' ? '-guild' : ''; @@ -598,7 +597,7 @@ api.inviteToGroup = { let emails = req.body.emails; let uuidsIsArray = Array.isArray(uuids); - let emailsIsArray = Array.isArray(emails); + let emailsIsArray = Array.isArray(emails); if (!uuids && !emails) { throw new BadRequest(res.t('canOnlyInviteEmailUuid')); diff --git a/website/src/controllers/api-v3/quests.js b/website/src/controllers/api-v3/quests.js index e7f728c74a..f2a95db29f 100644 --- a/website/src/controllers/api-v3/quests.js +++ b/website/src/controllers/api-v3/quests.js @@ -116,7 +116,6 @@ api.inviteToQuest = { sendTxnEmail(membersToEmail, `invite-${quest.boss ? 'boss' : 'collection'}-quest`, [ {name: 'QUEST_NAME', content: quest.text()}, {name: 'INVITER', content: inviterVars.name}, - {name: 'REPLY_TO_ADDRESS', content: inviterVars.email}, {name: 'PARTY_URL', content: '/#/options/groups/party'}, ]);