RSS uses correct links when dated permalinks are enabled

closes #1777
- Uses coreHelpers.url to resolve post url instead of assuming it is siteUrl + post.slug
- Functional feed tests now check for content instead of just rss tags
This commit is contained in:
Mark Berger 2013-12-28 19:15:14 -05:00
parent 64cf2b1b24
commit 0b8fbbb68a
2 changed files with 79 additions and 26 deletions

View File

@ -12,6 +12,7 @@ var config = require('../config'),
when = require('when'), when = require('when'),
url = require('url'), url = require('url'),
filters = require('../../server/filters'), filters = require('../../server/filters'),
coreHelpers = require('../helpers'),
frontendControllers; frontendControllers;
@ -132,7 +133,8 @@ frontendControllers = {
} }
api.posts.browse({page: pageParam}).then(function (page) { api.posts.browse({page: pageParam}).then(function (page) {
var maxPage = page.pages; var maxPage = page.pages,
feedItems = [];
// A bit of a hack for situations with no content. // A bit of a hack for situations with no content.
if (maxPage === 0) { if (maxPage === 0) {
@ -147,10 +149,13 @@ frontendControllers = {
filters.doFilter('prePostsRender', page.posts).then(function (posts) { filters.doFilter('prePostsRender', page.posts).then(function (posts) {
posts.forEach(function (post) { posts.forEach(function (post) {
var deferred = when.defer();
post.url = coreHelpers.url;
post.url().then(function (postUrl) {
var item = { var item = {
title: _.escape(post.title), title: _.escape(post.title),
guid: post.uuid, guid: post.uuid,
url: siteUrl + '/' + post.slug + '/', url: siteUrl + postUrl,
date: post.published_at, date: post.published_at,
categories: _.pluck(post.tags, 'name') categories: _.pluck(post.tags, 'name')
}, },
@ -170,7 +175,12 @@ frontendControllers = {
}); });
item.description = content; item.description = content;
feed.item(item); feed.item(item);
deferred.resolve();
}); });
feedItems.push(deferred.promise);
});
});
when.all(feedItems).then(function () {
res.set('Content-Type', 'text/xml'); res.set('Content-Type', 'text/xml');
res.send(feed.xml()); res.send(feed.xml());
}); });

View File

@ -2,10 +2,53 @@
* Tests if RSS exists and is working * Tests if RSS exists and is working
*/ */
/*globals CasperTest, casper */ /*globals CasperTest, casper */
CasperTest.begin('Ensure that RSS is available', 3, function suite(test) { CasperTest.begin('Ensure that RSS is available', 11, function suite(test) {
casper.thenOpen(url + 'rss/', function (response) { casper.thenOpen(url + 'rss/', function (response) {
var content = this.getPageContent(),
siteTitle = '<title><![CDATA[Ghost]]></title',
siteDescription = '<description><![CDATA[Just a blogging platform.]]></description>',
siteUrl = '<link>http://127.0.0.1:2369</link>',
postTitle = '<![CDATA[Welcome to Ghost]]>',
postStart = '<description><![CDATA[<p>You\'re live!',
postEnd = 'you think :)</p>]]></description>',
postLink = '<link>http://127.0.0.1:2369/welcome-to-ghost/</link>',
postCreator = '<dc:creator><![CDATA[Test User]]>';
test.assertEqual(response.status, 200, 'Response status should be 200.'); test.assertEqual(response.status, 200, 'Response status should be 200.');
test.assert(this.getPageContent().indexOf('<rss') >= 0, 'Feed should contain <rss'); test.assert(content.indexOf('<rss') >= 0, 'Feed should contain <rss');
test.assert(this.getPageContent().indexOf('</rss>') >= 0, 'Feed should contain </rss>'); test.assert(content.indexOf(siteTitle) >= 0, 'Feed should contain blog title.');
test.assert(content.indexOf(siteDescription) >= 0, 'Feed should contain blog description.');
test.assert(content.indexOf(siteUrl) >= 0, 'Feed should contain link to blog.');
test.assert(content.indexOf(postTitle) >= 0, 'Feed should contain welcome post title.');
test.assert(content.indexOf(postStart) >= 0, 'Feed should contain start of welcome post content.');
test.assert(content.indexOf(postEnd) >= 0, 'Feed should contain end of welcome post content.');
test.assert(content.indexOf(postLink) >= 0, 'Feed should have link to the welcome post.');
test.assert(content.indexOf(postCreator) >= 0, 'Welcome post should have Test User as the creator.');
test.assert(content.indexOf('</rss>') >= 0, 'Feed should contain </rss>');
});
});
CasperTest.begin('Ensures dated permalinks works with RSS', 4, function suite(test) {
casper.thenOpen(url + "ghost/settings/", function testTitleAndUrl() {
test.assertTitle("Ghost Admin", "Ghost admin has no title");
test.assertUrlMatch(/ghost\/settings\/general\/$/, "Ghost doesn't require login this time");
});
casper.thenClick('#permalinks');
casper.thenClick('.button-save');
casper.waitFor(function successNotification() {
return this.evaluate(function () {
return document.querySelectorAll('.js-bb-notification section').length > 0;
});
});
casper.thenOpen(url + 'rss/', function (response) {
var content = this.getPageContent(),
today = new Date(),
dd = ("0" + today.getDate()).slice(-2),
mm = ("0" + (today.getMonth() + 1)).slice(-2),
yyyy = today.getFullYear(),
postLink = '/' + yyyy + '/' + mm + '/' + dd + '/welcome-to-ghost/';
test.assertEqual(response.status, 200, 'Response status should be 200.');
test.assert(content.indexOf(postLink) >= 0, 'Feed should have dated permalink.');
}); });
}); });