From 0b8fbbb68a803d4b9992aaf18881ae4592b9a784 Mon Sep 17 00:00:00 2001
From: Mark Berger
Date: Sat, 28 Dec 2013 19:15:14 -0500
Subject: [PATCH] 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
---
core/server/controllers/frontend.js | 54 +++++++++++++---------
core/test/functional/frontend/feed_test.js | 51 ++++++++++++++++++--
2 files changed, 79 insertions(+), 26 deletions(-)
diff --git a/core/server/controllers/frontend.js b/core/server/controllers/frontend.js
index 752b006c76..22c41cb449 100644
--- a/core/server/controllers/frontend.js
+++ b/core/server/controllers/frontend.js
@@ -12,6 +12,7 @@ var config = require('../config'),
when = require('when'),
url = require('url'),
filters = require('../../server/filters'),
+ coreHelpers = require('../helpers'),
frontendControllers;
@@ -132,7 +133,8 @@ frontendControllers = {
}
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.
if (maxPage === 0) {
@@ -147,30 +149,38 @@ frontendControllers = {
filters.doFilter('prePostsRender', page.posts).then(function (posts) {
posts.forEach(function (post) {
- var item = {
- title: _.escape(post.title),
- guid: post.uuid,
- url: siteUrl + '/' + post.slug + '/',
- date: post.published_at,
- categories: _.pluck(post.tags, 'name')
- },
- content = post.html;
+ var deferred = when.defer();
+ post.url = coreHelpers.url;
+ post.url().then(function (postUrl) {
+ var item = {
+ title: _.escape(post.title),
+ guid: post.uuid,
+ url: siteUrl + postUrl,
+ date: post.published_at,
+ categories: _.pluck(post.tags, 'name')
+ },
+ content = post.html;
- //set img src to absolute url
- content = content.replace(/src=["|'|\s]?([\w\/\?\$\.\+\-;%:@&=,_]+)["|'|\s]?/gi, function (match, p1) {
- /*jslint unparam:true*/
- p1 = url.resolve(siteUrl, p1);
- return "src='" + p1 + "' ";
+ //set img src to absolute url
+ content = content.replace(/src=["|'|\s]?([\w\/\?\$\.\+\-;%:@&=,_]+)["|'|\s]?/gi, function (match, p1) {
+ /*jslint unparam:true*/
+ p1 = url.resolve(siteUrl, p1);
+ return "src='" + p1 + "' ";
+ });
+ //set a href to absolute url
+ content = content.replace(/href=["|'|\s]?([\w\/\?\$\.\+\-;%:@&=,_]+)["|'|\s]?/gi, function (match, p1) {
+ /*jslint unparam:true*/
+ p1 = url.resolve(siteUrl, p1);
+ return "href='" + p1 + "' ";
+ });
+ item.description = content;
+ feed.item(item);
+ deferred.resolve();
});
- //set a href to absolute url
- content = content.replace(/href=["|'|\s]?([\w\/\?\$\.\+\-;%:@&=,_]+)["|'|\s]?/gi, function (match, p1) {
- /*jslint unparam:true*/
- p1 = url.resolve(siteUrl, p1);
- return "href='" + p1 + "' ";
- });
- item.description = content;
- feed.item(item);
+ feedItems.push(deferred.promise);
});
+ });
+ when.all(feedItems).then(function () {
res.set('Content-Type', 'text/xml');
res.send(feed.xml());
});
diff --git a/core/test/functional/frontend/feed_test.js b/core/test/functional/frontend/feed_test.js
index c524295b26..cb0256cf6a 100644
--- a/core/test/functional/frontend/feed_test.js
+++ b/core/test/functional/frontend/feed_test.js
@@ -2,10 +2,53 @@
* Tests if RSS exists and is working
*/
/*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) {
+ var content = this.getPageContent(),
+ siteTitle = '',
+ siteUrl = 'http://127.0.0.1:2369',
+ postTitle = '',
+ postStart = 'You\'re live!',
+ postEnd = 'you think :)
]]>',
+ postLink = 'http://127.0.0.1:2369/welcome-to-ghost/',
+ postCreator = '';
+
test.assertEqual(response.status, 200, 'Response status should be 200.');
- test.assert(this.getPageContent().indexOf('= 0, 'Feed should contain ') >= 0, 'Feed should contain ');
+ test.assert(content.indexOf('= 0, 'Feed should contain = 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('') >= 0, 'Feed should contain ');
});
-});
\ No newline at end of file
+});
+
+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.');
+ });
+});