From 33a52d5850c0161c749c7c070292a9826e5ae7b2 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 30 Mar 2021 17:54:27 +1300 Subject: [PATCH] Added test coverage for send_email in members API no issue - During an investigation of a possible Zapier bug discovered there was no coverage at all for sending emails for new member signups. This changeset adds coverage for basic case of `send_email` and `email_type` behavior --- .../api/canary/admin/members_spec.js | 54 +++++++++++++++++++ test/regression/api/v3/admin/members_spec.js | 54 +++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/test/regression/api/canary/admin/members_spec.js b/test/regression/api/canary/admin/members_spec.js index 1398ed7e40..1bcbafd0b3 100644 --- a/test/regression/api/canary/admin/members_spec.js +++ b/test/regression/api/canary/admin/members_spec.js @@ -1,4 +1,5 @@ const path = require('path'); +const querystring = require('querystring'); const should = require('should'); const supertest = require('supertest'); const sinon = require('sinon'); @@ -6,6 +7,7 @@ const testUtils = require('../../../../utils'); const localUtils = require('./utils'); const config = require('../../../../../core/shared/config'); const labs = require('../../../../../core/server/services/labs'); +const mailService = require('../../../../../core/server/services/mail'); const ghost = testUtils.startGhost; @@ -30,6 +32,58 @@ describe('Members API', function () { }); }); + beforeEach(function () { + sinon.stub(mailService.GhostMailer.prototype, 'send').resolves('Mail is disabled'); + }); + + afterEach(function () { + sinon.restore(); + }); + + it('Can add and send a signup confirmation email', async function () { + const member = { + name: 'Send Me Confirmation', + email: 'member_getting_confirmation@test.com', + subscribed: true + }; + + const queryParams = { + send_email: true, + email_type: 'signup' + }; + + const res = await request + .post(localUtils.API.getApiQuery(`members/?${querystring.stringify(queryParams)}`)) + .send({members: [member]}) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(201); + + should.not.exist(res.headers['x-cache-invalidate']); + const jsonResponse = res.body; + should.exist(jsonResponse); + should.exist(jsonResponse.members); + jsonResponse.members.should.have.length(1); + + jsonResponse.members[0].name.should.equal(member.name); + jsonResponse.members[0].email.should.equal(member.email); + jsonResponse.members[0].subscribed.should.equal(member.subscribed); + testUtils.API.isISO8601(jsonResponse.members[0].created_at).should.be.true(); + + should.exist(res.headers.location); + res.headers.location.should.equal(`http://127.0.0.1:2369${localUtils.API.getApiQuery('members/')}${res.body.members[0].id}/`); + + mailService.GhostMailer.prototype.send.called.should.be.true(); + mailService.GhostMailer.prototype.send.args[0][0].to.should.equal('member_getting_confirmation@test.com'); + + await request + .delete(localUtils.API.getApiQuery(`members/${jsonResponse.members[0].id}/`)) + .set('Origin', config.get('url')) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(204); + }); + it('Can order by email_open_rate', async function () { await request .get(localUtils.API.getApiQuery('members/?order=email_open_rate%20desc')) diff --git a/test/regression/api/v3/admin/members_spec.js b/test/regression/api/v3/admin/members_spec.js index 027df9b08a..0627239504 100644 --- a/test/regression/api/v3/admin/members_spec.js +++ b/test/regression/api/v3/admin/members_spec.js @@ -1,4 +1,5 @@ const path = require('path'); +const querystring = require('querystring'); const should = require('should'); const supertest = require('supertest'); const sinon = require('sinon'); @@ -6,6 +7,7 @@ const testUtils = require('../../../../utils'); const localUtils = require('./utils'); const config = require('../../../../../core/shared/config'); const labs = require('../../../../../core/server/services/labs'); +const mailService = require('../../../../../core/server/services/mail'); const ghost = testUtils.startGhost; @@ -30,6 +32,58 @@ describe('Members API', function () { }); }); + beforeEach(function () { + sinon.stub(mailService.GhostMailer.prototype, 'send').resolves('Mail is disabled'); + }); + + afterEach(function () { + sinon.restore(); + }); + + it('Can add and send a signup confirmation email', async function () { + const member = { + name: 'Send Me Confirmation', + email: 'member_getting_confirmation@test.com', + subscribed: true + }; + + const queryParams = { + send_email: true, + email_type: 'signup' + }; + + const res = await request + .post(localUtils.API.getApiQuery(`members/?${querystring.stringify(queryParams)}`)) + .send({members: [member]}) + .set('Origin', config.get('url')) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(201); + + should.not.exist(res.headers['x-cache-invalidate']); + const jsonResponse = res.body; + should.exist(jsonResponse); + should.exist(jsonResponse.members); + jsonResponse.members.should.have.length(1); + + jsonResponse.members[0].name.should.equal(member.name); + jsonResponse.members[0].email.should.equal(member.email); + jsonResponse.members[0].subscribed.should.equal(member.subscribed); + testUtils.API.isISO8601(jsonResponse.members[0].created_at).should.be.true(); + + should.exist(res.headers.location); + res.headers.location.should.equal(`http://127.0.0.1:2369${localUtils.API.getApiQuery('members/')}${res.body.members[0].id}/`); + + mailService.GhostMailer.prototype.send.called.should.be.true(); + mailService.GhostMailer.prototype.send.args[0][0].to.should.equal('member_getting_confirmation@test.com'); + + await request + .delete(localUtils.API.getApiQuery(`members/${jsonResponse.members[0].id}/`)) + .set('Origin', config.get('url')) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(204); + }); + it('Can order by email_open_rate', async function () { await request .get(localUtils.API.getApiQuery('members/?order=email_open_rate%20desc'))