Ghost/test/unit/services/members/middleware_spec.js
Fabien 'egg' O'Carroll f8b617af64
Supported redirecting externally after signup (#12391)
refs #12391

Adds support for redirecting to external URL's after successful signup for members.
2020-11-23 09:36:45 +00:00

124 lines
4.5 KiB
JavaScript

const should = require('should');
const sinon = require('sinon');
const urlUtils = require('../../../../core/shared/url-utils');
const membersService = require('../../../../core/server/services/members');
const membersMiddleware = require('../../../../core/server/services/members/middleware');
const settingsCache = require('../../../../core/server/services/settings/cache');
describe('Members Service Middleware', function () {
describe('createSessionFromMagicLink', function () {
let req;
let res;
let next;
beforeEach(function () {
req = {};
res = {};
next = sinon.stub();
res.redirect = sinon.stub().returns('');
// Stub the members Service, handle this in separate tests
membersService.ssr.exchangeTokenForSession = sinon.stub();
sinon.stub(urlUtils, 'getSubdir').returns('/blah');
sinon.stub(urlUtils, 'getSiteUrl').returns('https://site.com/blah');
});
afterEach(function () {
sinon.restore();
});
it('calls next if url does not include a token', async function () {
req.url = '/members';
req.query = {};
// Call the middleware
await membersMiddleware.createSessionFromMagicLink(req, res, next);
// Check behaviour
next.calledOnce.should.be.true();
next.firstCall.args.should.be.an.Array().with.lengthOf(0);
});
it('redirects correctly on success', async function () {
req.url = '/members?token=test&action=signup';
req.query = {token: 'test', action: 'signup'};
// Fake token handling success
membersService.ssr.exchangeTokenForSession.resolves();
// Call the middleware
await membersMiddleware.createSessionFromMagicLink(req, res, next);
// Check behaviour
next.calledOnce.should.be.false();
res.redirect.calledOnce.should.be.true();
res.redirect.firstCall.args[0].should.eql('/blah/?action=signup&success=true');
});
it('redirects correctly on failure', async function () {
req.url = '/members?token=test&action=signup';
req.query = {token: 'test', action: 'signup'};
// Fake token handling failure
membersService.ssr.exchangeTokenForSession.rejects();
// Call the middleware
await membersMiddleware.createSessionFromMagicLink(req, res, next);
// Check behaviour
next.calledOnce.should.be.false();
res.redirect.calledOnce.should.be.true();
res.redirect.firstCall.args[0].should.eql('/blah/?action=signup&success=false');
});
it('redirects to custom redirect on signup', async function () {
req.url = '/members?token=test&action=signup';
req.query = {token: 'test', action: 'signup'};
sinon.stub(settingsCache, 'get')
.withArgs('members_free_signup_redirect')
.returns('https://custom.com/redirect');
// Fake token handling failure
membersService.ssr.exchangeTokenForSession.resolves();
// Call the middleware
await membersMiddleware.createSessionFromMagicLink(req, res, next);
// Check behaviour
next.calledOnce.should.be.false();
res.redirect.calledOnce.should.be.true();
res.redirect.firstCall.args[0].should.eql('https://custom.com/redirect/');
});
it('redirects to custom redirect on signup', async function () {
req.url = '/members?token=test&action=signup';
req.query = {token: 'test', action: 'signup'};
sinon.stub(settingsCache, 'get')
.withArgs('members_paid_signup_redirect')
.returns('https://custom.com/paid');
// Fake token handling failure
membersService.ssr.exchangeTokenForSession.resolves({
stripe: {
subscriptions: [{
status: 'active'
}]
}
});
// Call the middleware
await membersMiddleware.createSessionFromMagicLink(req, res, next);
// Check behaviour
next.calledOnce.should.be.false();
res.redirect.calledOnce.should.be.true();
res.redirect.firstCall.args[0].should.eql('https://custom.com/paid/');
});
});
});