0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-11 02:12:21 -05:00

Fix loading of static pages in frontend controller

fixes #1644

- Fixes bug in controller/frontend
- Created functional test for posts API to test for this bug
- Created unit tests for frontend controller
- Fixed a global variable leak in core/test/utils/fixtures/data-generator
that was leaking the DataGenerator globally
- Resolved issue that arose from fixing above bug
This commit is contained in:
Harry Wolff 2013-12-09 22:38:25 -05:00
parent 119af63ff7
commit 9bbf400dfc
5 changed files with 136 additions and 7 deletions

View file

@ -72,7 +72,7 @@ frontendControllers = {
if (post) {
filters.doFilter('prePostsRender', post).then(function (post) {
api.settings.read('activeTheme').then(function (activeTheme) {
var paths = config.paths().availableThemes[activeTheme];
var paths = config.paths().availableThemes[activeTheme.value];
if (post.page && paths.hasOwnProperty('page')) {
res.render('page', {post: post});
} else {

View file

@ -4,7 +4,7 @@ var testUtils = require('../../utils'),
_ = require('underscore'),
request = require('request');
request = request.defaults({jar:true})
request = request.defaults({jar:true});
describe('Post API', function () {
@ -55,13 +55,27 @@ describe('Post API', function () {
});
it('can retrieve a post', function (done) {
request.get(testUtils.API.getApiURL('posts/1/'), function (error, response, body) {
request.get(testUtils.API.getApiURL('posts/5/'), function (error, response, body) {
response.should.have.status(200);
should.not.exist(response.headers['x-cache-invalidate']);
response.should.be.json;
var jsonResponse = JSON.parse(body);
jsonResponse.should.exist;
testUtils.API.checkResponse(jsonResponse, 'post');
jsonResponse.page.should.eql(0);
done();
});
});
it('can retrieve a static page', function (done) {
request.get(testUtils.API.getApiURL('posts/6/'), function (error, response, body) {
response.should.have.status(200);
should.not.exist(response.headers['x-cache-invalidate']);
response.should.be.json;
var jsonResponse = JSON.parse(body);
jsonResponse.should.exist;
testUtils.API.checkResponse(jsonResponse, 'post');
jsonResponse.page.should.eql(1);
done();
});
});

View file

@ -6,6 +6,7 @@ var testUtils = require('../../utils'),
sequence = require('when/sequence'),
// Stuff we are testing
DataGenerator = require('../../utils/fixtures/data-generator'),
Models = require('../../../server/models');
describe('Post Model', function () {

View file

@ -1,13 +1,120 @@
/*globals describe, beforeEach, afterEach, it*/
var should = require('should'),
var assert = require('assert'),
should = require('should'),
sinon = require('sinon'),
when = require('when'),
// Stuff we are testing
config = require('../../server/config'),
api = require('../../server/api'),
frontend = require('../../server/controllers/frontend');
describe('Frontend Controller', function () {
var ghost,
sandbox,
apiStub;
beforeEach(function () {
sandbox = sinon.sandbox.create();
});
afterEach(function () {
sandbox.restore();
});
describe('homepage', function () {
// No tests yet, shows up in coverage report
});
describe('single', function() {
var mockStaticPost = {
'status': 'published',
'id': 1,
'title': 'Test static page',
'slug': 'test-static-page',
'markdown': 'Test static page content',
'page': 1
};
var mockPost = {
'status': 'published',
'id': 2,
'title': 'Test normal post',
'slug': 'test-normal-post',
'markdown': 'The test normal post content',
'page': 0
};
beforeEach(function () {
apiStub = sandbox.stub(api.posts , 'read', function (args) {
return when(args.id === 1 ? mockStaticPost : mockPost);
});
sandbox.stub(api.settings , 'read', function () {
return when({
'key': 'activeTheme',
'value': 'casper'
});
});
sandbox.stub(config , 'paths', function () {
return {
'availableThemes': {
'casper': {
'assets': null,
'default': '/content/themes/casper/default.hbs',
'index': '/content/themes/casper/index.hbs',
'page': '/content/themes/casper/page.hbs',
'post': '/content/themes/casper/post.hbs'
}
}
};
});
});
it('can render a static page', function(done) {
var req = {
params: {
'id': 1,
'slug': 'test-static-page'
}
};
var res = {
render: function(view, context) {
assert.equal(view, 'page');
assert(context.post, 'Context object has post attribute');
assert.equal(context.post, mockStaticPost);
done();
}
};
frontend.single(req, res, null);
});
it('can render a normal post', function(done) {
var req = {
params: {
'id': 2,
'slug': 'test-normal-post'
}
};
var res = {
render: function(view, context) {
assert.equal(view, 'post');
assert(context.post, 'Context object has post attribute');
assert.equal(context.post, mockPost);
done();
}
};
frontend.single(req, res, null);
});
});
});

View file

@ -1,5 +1,5 @@
var _ = require('underscore'),
uuid = require('node-uuid')
uuid = require('node-uuid'),
DataGenerator = {};
DataGenerator.Content = {
@ -24,6 +24,12 @@ DataGenerator.Content = {
title: "Not so short, bit complex",
slug: "not-so-short-bit-complex",
markdown: "<p><nav><ul><li><a href=\"#nowhere\" title=\"Lorum ipsum dolor sit amet\">Lorem</a></li><li><a href=\"#nowhere\" title=\"Aliquam tincidunt mauris eu risus\">Aliquam</a></li><li><a href=\"#nowhere\" title=\"Morbi in sem quis dui placerat ornare\">Morbi</a></li><li><a href=\"#nowhere\" title=\"Praesent dapibus, neque id cursus faucibus\">Praesent</a></li><li><a href=\"#nowhere\" title=\"Pellentesque fermentum dolor\">Pellentesque</a></li></ul></nav><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p><table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th></tr></thead><tbody><tr><td>a</td><td>b</td><td>c</td><td>d</td></tr><tr><td>e</td><td>f</td><td>g</td><td>h</td></tr><tr><td>i</td><td>j</td><td>k</td><td>l</td></tr></tbody></table><dl><dt>Definition list</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd><dt>Lorem ipsum dolor sit amet</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd></dl><ul><li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li><li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li><li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li><li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li></ul></p>"
},
{
title: "This is a static page",
slug: "static-page-test",
markdown: "<h1>Static page test is what this is for.</h1><p>Hopefully you don't find it a bore.</p>",
page: 1
}
],
@ -159,7 +165,8 @@ DataGenerator.forKnex = (function () {
createPost(DataGenerator.Content.posts[0]),
createPost(DataGenerator.Content.posts[1]),
createPost(DataGenerator.Content.posts[2]),
createPost(DataGenerator.Content.posts[3])
createPost(DataGenerator.Content.posts[3]),
createPost(DataGenerator.Content.posts[4])
];
tags = [
@ -205,7 +212,7 @@ DataGenerator.forModel = (function () {
tags = DataGenerator.Content.tags;
users = _.map(DataGenerator.Content.users, function (user) {
var user = _.pick(user, 'name', 'email');
user = _.pick(user, 'name', 'email');
return _.defaults({
password: 'Sl1m3rson'