Ghost/core/test/unit/frontend_spec.js
Harry Wolff 91ca4a43e5 Fix routing of posts and static pages
closes #1757 and #1773

- switches routes.frontend for posts and pages
to use a regex with two capturing groups.  This removes
the need to dynamically remove an express route at a
later point, leaving the decision making to frontend
controller.

- added unit tests for all routing conditions that 
can arise for posts and pages.

- updated functional tests to also test for same thing
in unit tests

- removes old code from server/api/index that used
to fix this issue, but is no longer needed

- removed some un-needed require statements in routes/admin
2013-12-30 02:04:46 -05:00

221 lines
6.6 KiB
JavaScript

/*globals describe, beforeEach, afterEach, it*/
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,
apiSettingsStub;
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 () {
sandbox.stub(api.posts , 'read', function (args) {
return when(args.slug === mockStaticPost.slug ? mockStaticPost : mockPost);
});
apiSettingsStub = sandbox.stub(api.settings , 'read');
apiSettingsStub.withArgs('activeTheme').returns(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'
}
}
};
});
});
describe('permalink set to slug', function() {
beforeEach(function() {
apiSettingsStub.withArgs('permalinks').returns(when({
value: '/:slug/'
}));
});
it('can render a static page', function(done) {
var req = {
params: ['', 'test-static-page']
};
var res = {
render: function(view, context) {
assert.equal(view, 'page');
assert.equal(context.post, mockStaticPost);
done();
}
};
frontend.single(req, res, null);
});
it('won\'t render a static page accessed as a date url', function(done) {
var req = {
params: ['2012/12/30', 'test-static-page']
};
var res = {
render: sinon.spy()
};
frontend.single(req, res, function() {
res.render.called.should.be.false;
done();
});
});
it('can render a normal post', function(done) {
var req = {
params: ['', '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);
});
it('won\'t render a normal post accessed as a date url', function(done) {
var req = {
params: ['2012/12/30', 'test-normal-post']
};
var res = {
render: sinon.spy()
};
frontend.single(req, res, function() {
res.render.called.should.be.false;
done();
});
});
});
describe('permalink set to date', function() {
beforeEach(function() {
apiSettingsStub.withArgs('permalinks').returns(when({
value: '/:year/:month/:day/:slug/'
}));
});
it('can render a static page', function(done) {
var req = {
params: ['', 'test-static-page']
};
var res = {
render: function(view, context) {
assert.equal(view, 'page');
assert.equal(context.post, mockStaticPost);
done();
}
};
frontend.single(req, res, null);
});
it('won\'t render a static page accessed as a date url', function(done) {
var req = {
params: ['2012/12/30', 'test-static-page']
};
var res = {
render: sinon.spy()
};
frontend.single(req, res, function() {
res.render.called.should.be.false;
done();
});
});
it('can render a normal post', function(done) {
var req = {
params: ['2012/12/30', '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);
});
it('won\'t render a normal post accessed as a slug url', function(done) {
var req = {
params: ['', 'test-normal-post']
};
var res = {
render: sinon.spy()
};
frontend.single(req, res, function() {
res.render.called.should.be.false;
done();
});
});
});
});
});