Ghost/test/unit/services/routing/TaxonomyRouter_spec.js
Hannah Wolfe bd597db829
Moved settings/cache to shared/settings-cache
- 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
2021-06-30 15:49:10 +01:00

122 lines
4.6 KiB
JavaScript

const should = require('should');
const sinon = require('sinon');
const _ = require('lodash');
const settingsCache = require('../../../../core/shared/settings-cache');
const events = require('../../../../core/server/lib/common/events');
const controllers = require('../../../../core/frontend/services/routing/controllers');
const TaxonomyRouter = require('../../../../core/frontend/services/routing/TaxonomyRouter');
const RESOURCE_CONFIG_V2 = require('../../../../core/frontend/services/routing/config/v2');
const RESOURCE_CONFIG_CANARY = require('../../../../core/frontend/services/routing/config/canary');
const RESOURCE_CONFIG_V3 = require('../../../../core/frontend/services/routing/config/v3');
describe('UNIT - services/routing/TaxonomyRouter', function () {
let req;
let res;
let next;
beforeEach(function () {
sinon.stub(settingsCache, 'get').withArgs('permalinks').returns('/:slug/');
sinon.stub(events, 'emit');
sinon.stub(events, 'on');
sinon.spy(TaxonomyRouter.prototype, 'mountRoute');
sinon.spy(TaxonomyRouter.prototype, 'mountRouter');
req = sinon.stub();
res = sinon.stub();
next = sinon.stub();
res.locals = {};
});
afterEach(function () {
sinon.restore();
});
it('instantiate', function () {
const taxonomyRouter = new TaxonomyRouter('tag', '/tag/:slug/');
should.exist(taxonomyRouter.router);
should.exist(taxonomyRouter.rssRouter);
taxonomyRouter.taxonomyKey.should.eql('tag');
taxonomyRouter.getPermalinks().getValue().should.eql('/tag/:slug/');
events.emit.calledOnce.should.be.true();
events.emit.calledWith('router.created', taxonomyRouter).should.be.true();
taxonomyRouter.mountRouter.callCount.should.eql(1);
taxonomyRouter.mountRouter.args[0][0].should.eql('/tag/:slug/');
taxonomyRouter.mountRouter.args[0][1].should.eql(taxonomyRouter.rssRouter.router());
taxonomyRouter.mountRoute.callCount.should.eql(3);
// permalink route
taxonomyRouter.mountRoute.args[0][0].should.eql('/tag/:slug/');
taxonomyRouter.mountRoute.args[0][1].should.eql(controllers.channel);
// pagination feature
taxonomyRouter.mountRoute.args[1][0].should.eql('/tag/:slug/page/:page(\\d+)');
taxonomyRouter.mountRoute.args[1][1].should.eql(controllers.channel);
// edit feature
taxonomyRouter.mountRoute.args[2][0].should.eql('/tag/:slug/edit');
taxonomyRouter.mountRoute.args[2][1].should.eql(taxonomyRouter._redirectEditOption.bind(taxonomyRouter));
});
it('v2:fn: _prepareContext', function () {
const taxonomyRouter = new TaxonomyRouter('tag', '/tag/:slug/', RESOURCE_CONFIG_V2);
taxonomyRouter._prepareContext(req, res, next);
next.calledOnce.should.eql(true);
res.routerOptions.should.eql({
type: 'channel',
name: 'tag',
permalinks: '/tag/:slug/',
resourceType: RESOURCE_CONFIG_V2.QUERY.tag.resource,
data: {tag: RESOURCE_CONFIG_V2.QUERY.tag},
filter: RESOURCE_CONFIG_V2.TAXONOMIES.tag.filter,
context: ['tag'],
slugTemplate: true,
identifier: taxonomyRouter.identifier
});
});
it('canary:fn: _prepareContext', function () {
const taxonomyRouter = new TaxonomyRouter('tag', '/tag/:slug/', RESOURCE_CONFIG_CANARY);
taxonomyRouter._prepareContext(req, res, next);
next.calledOnce.should.eql(true);
res.routerOptions.should.eql({
type: 'channel',
name: 'tag',
permalinks: '/tag/:slug/',
resourceType: RESOURCE_CONFIG_V2.QUERY.tag.resource,
data: {tag: RESOURCE_CONFIG_V2.QUERY.tag},
filter: RESOURCE_CONFIG_V2.TAXONOMIES.tag.filter,
context: ['tag'],
slugTemplate: true,
identifier: taxonomyRouter.identifier
});
});
it('v3:fn: _prepareContext', function () {
const taxonomyRouter = new TaxonomyRouter('tag', '/tag/:slug/', RESOURCE_CONFIG_V3);
taxonomyRouter._prepareContext(req, res, next);
next.calledOnce.should.eql(true);
res.routerOptions.should.eql({
type: 'channel',
name: 'tag',
permalinks: '/tag/:slug/',
resourceType: RESOURCE_CONFIG_V2.QUERY.tag.resource,
data: {tag: RESOURCE_CONFIG_V2.QUERY.tag},
filter: RESOURCE_CONFIG_V2.TAXONOMIES.tag.filter,
context: ['tag'],
slugTemplate: true,
identifier: taxonomyRouter.identifier
});
});
});