/*
use `npm test` to run tests using mocha
*/
var RSS = require('../lib/rss');
var expect = require('chai').expect;
var xml2js = require('xml2js');
var Q = require('q');
describe('rss module', function(done) {
it('should work with an empty feed', function(done) {
var feed = new RSS();
expect(feed.xml()).to.equal('\nhttp://github.com/dylan/node-rssRSS for Node' + new Date().toUTCString() +'');
feed.item();
expect(feed.xml()).to.equal('\nhttp://github.com/dylan/node-rssRSS for Node' + new Date().toUTCString() +'- No title
');
done();
});
var simpleFeed = function() {
var feed = new RSS({
title: 'title',
description: 'description',
generator: 'Example Generator',
feed_url: 'http://example.com/rss.xml',
site_url: 'http://example.com',
image_url: 'http://example.com/icon.png',
author: 'Dylan Greene',
categories: ['Category 1','Category 2','Category 3'],
pubDate: 'May 20, 2012 04:00:00 GMT',
docs: 'http://example.com/rss/docs.html',
copyright: '2013 Dylan Green',
language: 'en',
managingEditor: 'Dylan Green',
webMaster: 'Dylan Green',
ttl: '60'
});
feed.item({
title: 'item 1',
description: 'description 1',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT'
})
.item({
title: 'item 2',
description: 'description 2',
url: 'http://example.com/article2',
date: 'May 25, 2012 04:00:00 GMT'
})
.item({
title: 'item 3',
description: 'description 3',
url: 'http://example.com/article3',
guid: 'item3',
date: 'May 26, 2012 04:00:00 GMT'
})
.item({
title: 'item 4 & html test with ',
description: 'description 4 uses some html',
url: 'http://example.com/article4?this&that',
author: 'Guest Author',
date: 'May 27, 2012 04:00:00 GMT'
})
.item({
title: 'item 5 & test for categories',
description: 'description 5',
url: 'http://example.com/article5',
categories: ['Category 1','Category 2','Category 3','Category 4'],
author: 'Guest Author',
date: 'May 28, 2012 04:00:00 GMT'
});
return feed;
}
it('should work with indentation', function(done) {
var feed = simpleFeed();
var xml = feed.xml(true);
var parseString = Q.nbind(xml2js.parseString,xml2js);
var feedToXml = parseString(feed.xml());
var feedToXmlIndent = parseString(feed.xml(true));
Q.all([feedToXml,feedToXmlIndent]).spread(function (xml,xmlIndent){
expect(JSON.stringify(xml)).to.equal(JSON.stringify(xmlIndent));
}).done(done());
});
it('should work with an easy test', function(done) {
var feed = simpleFeed();
var expectedResult = '\nhttp://example.comhttp://example.com/icon.pngtitlehttp://example.comExample Generator' + new Date().toUTCString() +'Sun, 20 May 2012 04:00:00 GMThttp://example.com/rss/docs.html60- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT
- http://example.com/article2http://example.com/article2Fri, 25 May 2012 04:00:00 GMT
- http://example.com/article3item3Sat, 26 May 2012 04:00:00 GMT
- ]]>html
]]>http://example.com/article4?this&thathttp://example.com/article4?this&thatSun, 27 May 2012 04:00:00 GMT- http://example.com/article5http://example.com/article5Mon, 28 May 2012 04:00:00 GMT
';
var result = feed.xml();
expect(result).to.equal(expectedResult);
done();
});
it('should work without image_url', function(done) {
var feed = new RSS({
title: 'title',
description: 'description',
feed_url: 'http://example.com/rss.xml',
site_url: 'http://example.com',
author: 'Dylan Greene',
categories: ['Category 1','Category 2','Category 3'],
pubDate: 'May 20, 2012 04:00:00 GMT',
docs: 'http://example.com/rss/docs.html',
copyright: '2013 Dylan Green',
language: 'en',
managingEditor: 'Dylan Green',
webMaster: 'Dylan Green',
ttl: '60'
});
feed.item({
title: 'item 1',
description: 'description 1',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT'
})
.item({
title: 'item 2',
description: 'description 2',
url: 'http://example.com/article2',
date: 'May 25, 2012 04:00:00 GMT'
})
.item({
title: 'item 3',
description: 'description 3',
url: 'http://example.com/article3',
guid: 'item3',
date: 'May 26, 2012 04:00:00 GMT'
})
.item({
title: 'item 4 & html test with ',
description: 'description 4 uses some html',
url: 'http://example.com/article4?this&that',
author: 'Guest Author',
date: 'May 27, 2012 04:00:00 GMT'
})
.item({
title: 'item 5 & test for categories',
description: 'description 5',
url: 'http://example.com/article5',
categories: ['Category 1','Category 2','Category 3','Category 4'],
author: 'Guest Author',
date: 'May 28, 2012 04:00:00 GMT'
});
var expectedResult = '\nhttp://example.comRSS for Node' + new Date().toUTCString() +'Sun, 20 May 2012 04:00:00 GMThttp://example.com/rss/docs.html60- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT
- http://example.com/article2http://example.com/article2Fri, 25 May 2012 04:00:00 GMT
- http://example.com/article3item3Sat, 26 May 2012 04:00:00 GMT
- ]]>html
]]>http://example.com/article4?this&thathttp://example.com/article4?this&thatSun, 27 May 2012 04:00:00 GMT- http://example.com/article5http://example.com/article5Mon, 28 May 2012 04:00:00 GMT
';
var result = feed.xml();
expect(result).to.equal(expectedResult);
done();
});
it('should work with an enclosure', function(done) {
var feed = new RSS({
title: 'title',
description: 'description',
feed_url: 'http://example.com/rss.xml',
site_url: 'http://example.com',
author: 'Dylan Greene'
});
feed.item({
title: 'item 1',
description: 'description 1',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT',
enclosure : 'incorrect value'
});
feed.item({
title: 'item 2',
description: 'description 2',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT',
enclosure : {url: '/media/some-file.flv'}
});
feed.item({
title: 'item 3',
description: 'description 3',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT',
enclosure : {url: '/media/image.png', file : __dirname+'/image.png'}
});
var expectedResult = '\nhttp://example.comRSS for Node' + new Date().toUTCString() +''+
'' +
'- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT
'+
'- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT
'+
'- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT
'+
'';
var result = feed.xml();
expect(result).to.equal(expectedResult);
done();
});
it('should work with geoRSS', function(done) {
var feed = new RSS({
title: 'title',
description: 'description',
feed_url: 'http://example.com/rss.xml',
site_url: 'http://example.com',
author: 'Dylan Greene'
});
feed.item({
title: 'item 1',
description: 'description 1',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT',
lat: 12232,
long: 13333.23323
});
feed.item({
title: 'item 2',
description: 'description 2',
url: 'http://example.com/article1',
date: 'May 24, 2012 04:00:00 GMT'
});
var expectedResult = '\nhttp://example.comRSS for Node' + new Date().toUTCString() +''+
'' +
'- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT1223213333.23323
'+
'- http://example.com/article1http://example.com/article1Thu, 24 May 2012 04:00:00 GMT
'+
'';
var result = feed.xml();
expect(result).to.equal(expectedResult);
done();
});
it('should work with PubSubHubbub hub', function(done) {
var feed = new RSS({
title: 'title',
description: 'description',
feed_url: 'http://example.com/rss.xml',
site_url: 'http://example.com',
hub: 'http://example.com/hub'
});
var expectedResult = '\n'+
''+
''+
''+
''+
'http://example.com'+
'RSS for Node'+
'' + new Date().toUTCString() +''+
''+
''+
''+
'';
var result = feed.xml();
expect(result).to.equal(expectedResult);
done();
});
});