mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-19 00:11:49 +03:00
e060a4f811
no issue 🎨 simplify loader - use loadOneTheme for init - use loadOneTheme for init - move updateThemeList to the one place that it is used - this just reduces the surface area of the loader 🎨 Move init up to index temporarily - need to figure out what stuff goes in here as well as loading themes - will move it again later once I've got it figured out 🎨 Reorder & cleanup theme middleware - move the order in blog/app.js so that theme middleware isn't called for shared assets - add comments & cleanup in the middleware itself, for clarity 🎨 Simplify the logic in themes middleware - Separate out config dependent on settings changing and config dependent on request - Move blogApp.set('views') - no reason why this isn't in the theme activation method as it's actually simpler if it is there, we already know the active theme exists & can remove the if-guard 🎨 Improve error handling for missing theme - ensure we display a warning - don't have complex logic for handling errors - move loading of an empty hbs object into the error-handler as this will support more cases 🐛 Fix assetHash clearing bug on theme switch - asset hash wasn't correctly being set on theme switch 🎨 Remove themes.read & test loader instead - Previously, we've simplified loader & improved error handling - We are now able to completely remove theme.read as it's nothing more than a wrapper for package.read - This also means we can change our tests from testing the theme reader to loader
134 lines
4.6 KiB
JavaScript
134 lines
4.6 KiB
JavaScript
var sinon = require('sinon'),
|
|
should = require('should'),
|
|
express = require('express'),
|
|
fs = require('fs'),
|
|
hbs = require('express-hbs'),
|
|
themeList = require('../../../server/themes').list,
|
|
themeHandler = require('../../../server/middleware/theme-handler'),
|
|
settingsCache = require('../../../server/settings/cache'),
|
|
|
|
sandbox = sinon.sandbox.create();
|
|
|
|
describe('Theme Handler', function () {
|
|
var req, res, next, blogApp;
|
|
|
|
beforeEach(function () {
|
|
req = sinon.spy();
|
|
res = sinon.spy();
|
|
next = sinon.spy();
|
|
blogApp = express();
|
|
req.app = blogApp;
|
|
});
|
|
|
|
afterEach(function () {
|
|
sandbox.restore();
|
|
themeList.init();
|
|
});
|
|
|
|
describe('activateTheme', function () {
|
|
it('should activate new theme with partials', function () {
|
|
var fsStub = sandbox.stub(fs, 'stat', function (path, cb) {
|
|
cb(null, {isDirectory: function () { return true; }});
|
|
}),
|
|
hbsStub = sandbox.spy(hbs, 'express3');
|
|
|
|
themeHandler.activateTheme(blogApp, 'casper');
|
|
|
|
fsStub.calledOnce.should.be.true();
|
|
hbsStub.calledOnce.should.be.true();
|
|
hbsStub.firstCall.args[0].should.be.an.Object().and.have.property('partialsDir');
|
|
hbsStub.firstCall.args[0].partialsDir.should.have.lengthOf(2);
|
|
blogApp.get('activeTheme').should.equal('casper');
|
|
});
|
|
|
|
it('should activate new theme without partials', function () {
|
|
var fsStub = sandbox.stub(fs, 'stat', function (path, cb) {
|
|
cb(null, null);
|
|
}),
|
|
hbsStub = sandbox.spy(hbs, 'express3');
|
|
|
|
themeHandler.activateTheme(blogApp, 'casper');
|
|
|
|
fsStub.calledOnce.should.be.true();
|
|
hbsStub.calledOnce.should.be.true();
|
|
hbsStub.firstCall.args[0].should.be.an.Object().and.have.property('partialsDir');
|
|
hbsStub.firstCall.args[0].partialsDir.should.have.lengthOf(1);
|
|
blogApp.get('activeTheme').should.equal('casper');
|
|
});
|
|
});
|
|
|
|
describe('configHbsForContext', function () {
|
|
it('handles non secure context', function () {
|
|
res.locals = {};
|
|
themeHandler.configHbsForContext(req, res, next);
|
|
|
|
should.not.exist(res.locals.secure);
|
|
next.called.should.be.true();
|
|
});
|
|
|
|
it('sets view path', function () {
|
|
req.secure = true;
|
|
res.locals = {};
|
|
blogApp.set('activeTheme', 'casper');
|
|
|
|
themeHandler.configHbsForContext(req, res, next);
|
|
|
|
blogApp.get('views').should.not.be.undefined();
|
|
});
|
|
|
|
it('sets view path', function () {
|
|
req.secure = true;
|
|
res.locals = {};
|
|
blogApp.set('activeTheme', 'casper');
|
|
|
|
themeHandler.configHbsForContext(req, res, next);
|
|
|
|
blogApp.get('views').should.not.be.undefined();
|
|
});
|
|
});
|
|
|
|
describe('updateActiveTheme', function () {
|
|
beforeEach(function () {
|
|
themeList.init({casper: {}});
|
|
});
|
|
|
|
it('updates the active theme if changed', function (done) {
|
|
var activateThemeSpy = sandbox.spy(themeHandler, 'activateTheme');
|
|
|
|
sandbox.stub(settingsCache, 'get').withArgs('activeTheme').returns('casper');
|
|
blogApp.set('activeTheme', 'not-casper');
|
|
|
|
themeHandler.updateActiveTheme(req, res, function () {
|
|
activateThemeSpy.called.should.be.true();
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('does not update the active theme if not changed', function (done) {
|
|
var activateThemeSpy = sandbox.spy(themeHandler, 'activateTheme');
|
|
|
|
sandbox.stub(settingsCache, 'get').withArgs('activeTheme').returns('casper');
|
|
blogApp.set('activeTheme', 'casper');
|
|
|
|
themeHandler.updateActiveTheme(req, res, function () {
|
|
activateThemeSpy.called.should.be.false();
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('throws error if theme is missing', function (done) {
|
|
var activateThemeSpy = sandbox.spy(themeHandler, 'activateTheme');
|
|
|
|
sandbox.stub(settingsCache, 'get').withArgs('activeTheme').returns('rasper');
|
|
blogApp.set('activeTheme', 'not-casper');
|
|
|
|
themeHandler.updateActiveTheme(req, res, function (err) {
|
|
should.exist(err);
|
|
activateThemeSpy.called.should.be.false();
|
|
err.message.should.eql('The currently active theme "rasper" is missing.');
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|