Ghost/test/unit/services/theme-engine/active_spec.js
Hannah Wolfe 9ce407966f Improved theme locale handling
- when activating a theme, we need to load the current locale
- this request used to be buried deep in the themeI18n init call
- now we surface it in the bridge and pass it down, which is closer to what we want to do with eventually initialising the frontend
with everything it needs up front (or not initialising it, if it isn't needed)

- in the related helpers we depend on the site.locale value instead of proxy -> themeI18n -> settingsCache drastically simplifying the code and removing deep requires
- site.locale is updated via middleware and can be relied upon
2021-05-05 16:13:26 +01:00

113 lines
4.0 KiB
JavaScript

const should = require('should');
const sinon = require('sinon');
const config = require('../../../../core/shared/config');
// is only exposed via themeEngine.getActive()
const activeTheme = require('../../../../core/frontend/services/theme-engine/active');
const engine = require('../../../../core/frontend/services/theme-engine/engine');
describe('Themes', function () {
afterEach(function () {
sinon.restore();
});
describe('Active', function () {
describe('Mount', function () {
let engineStub;
let configStub;
let fakeSettings;
let fakeBlogApp;
let fakeLoadedTheme;
let fakeCheckedTheme;
beforeEach(function () {
engineStub = sinon.stub(engine, 'configure');
configStub = sinon.stub(config, 'set');
fakeSettings = {
locale: 'en'
};
fakeBlogApp = {
cache: ['stuff'],
set: sinon.stub(),
engine: sinon.stub()
};
fakeLoadedTheme = {
name: 'casper',
path: 'my/fake/theme/path'
};
fakeCheckedTheme = {
templates: {
all: ['post', 'about', 'post-hey', 'custom-test'],
custom: ['custom-test', 'post-hey']
}
};
});
it('should mount active theme with partials', function () {
// setup partials
fakeCheckedTheme.partials = ['loop', 'navigation'];
const theme = activeTheme.set(fakeSettings, fakeLoadedTheme, fakeCheckedTheme);
// Check the theme is not yet mounted
activeTheme.get().mounted.should.be.false();
// Call mount!
theme.mount(fakeBlogApp);
// Check the asset hash gets reset
configStub.calledOnce.should.be.true();
configStub.calledWith('assetHash', null).should.be.true();
// Check te view cache was cleared
fakeBlogApp.cache.should.eql({});
// Check the views were set correctly
fakeBlogApp.set.calledOnce.should.be.true();
fakeBlogApp.set.calledWith('views', 'my/fake/theme/path').should.be.true();
// Check handlebars was configured correctly
engineStub.calledOnce.should.be.true();
engineStub.calledWith('my/fake/theme/path/partials').should.be.true();
// Check the theme is now mounted
activeTheme.get().mounted.should.be.true();
});
it('should mount active theme without partials', function () {
// setup partials
fakeCheckedTheme.partials = [];
const theme = activeTheme.set(fakeSettings, fakeLoadedTheme, fakeCheckedTheme);
// Check the theme is not yet mounted
activeTheme.get().mounted.should.be.false();
// Call mount!
theme.mount(fakeBlogApp);
// Check the asset hash gets reset
configStub.calledOnce.should.be.true();
configStub.calledWith('assetHash', null).should.be.true();
// Check te view cache was cleared
fakeBlogApp.cache.should.eql({});
// Check the views were set correctly
fakeBlogApp.set.calledOnce.should.be.true();
fakeBlogApp.set.calledWith('views', 'my/fake/theme/path').should.be.true();
// Check handlebars was configured correctly
engineStub.calledOnce.should.be.true();
engineStub.calledWith().should.be.true();
// Check the theme is now mounted
activeTheme.get().mounted.should.be.true();
});
});
});
});