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/'); }); }); });