mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-10 23:36:14 -05:00
- This is part of the quest to separate the frontend and server & get rid of all the places where there are cross-requires - At the moment the settings cache is one big shared cache used by the frontend and server liberally - This change doesn't really solve the fundamental problems, as we still depend on events, and requires from inside frontend - However it allows us to control the misuse slightly better by getting rid of restricted requires and turning on that eslint ruleset
121 lines
4.4 KiB
JavaScript
121 lines
4.4 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/shared/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({
|
|
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/');
|
|
});
|
|
});
|
|
});
|