diff --git a/chrome/content/zotero/xpcom/feedReader.js b/chrome/content/zotero/xpcom/feedReader.js index 167b71be7..66022bab1 100644 --- a/chrome/content/zotero/xpcom/feedReader.js +++ b/chrome/content/zotero/xpcom/feedReader.js @@ -407,9 +407,12 @@ Zotero.FeedReader._getFeedItem = function(feedEntry, feedInfo) { let date = Zotero.FeedReader._getFeedField(feedEntry, 'publicationDate', 'prism') || Zotero.FeedReader._getFeedField(feedEntry, 'date', 'dc') + // DEBUG: Why not get these from the feedEntry? || Zotero.FeedReader._getFeedField(feedEntry, 'pubDate') // RSS - || Zotero.FeedReader._getFeedField(feedEntry, 'published') // Atom - || Zotero.FeedReader._getFeedField(feedEntry, 'updated'); // Atom + || Zotero.FeedReader._getFeedField(feedEntry, 'updated', 'atom') // Atom + || Zotero.FeedReader._getFeedField(feedEntry, 'published', 'atom'); // Atom + + if (date) item.date = date; let publicationTitle = Zotero.FeedReader._getFeedField(feedEntry, 'publicationName', 'prism') diff --git a/test/tests/data/feed.atom b/test/tests/data/feed.atom new file mode 100644 index 000000000..de53a09f6 --- /dev/null +++ b/test/tests/data/feed.atom @@ -0,0 +1,32 @@ + + + + ArXiv Query: search_query=cat:math.MG&id_list=&start=0&max_results=99 + http://arxiv.org/api/t16YHIbuctl2Omz/1ISTPDEQFkU + 2017-10-30T00:00:00-04:00 + 6030 + 0 + 99 + + http://www.example.com/item1 + 2017-10-27T12:27:09Z + 2016-02-15T11:36:40Z + Title 1 + Abstract 1 + + Author1 A. T. Rohtua + + + Author2 A. Auth + + 10.12345/example + + 33 pages, 24 Figures + + + + + + + + diff --git a/test/tests/feedReaderTest.js b/test/tests/feedReaderTest.js index 3e40e5f07..6eaceab27 100644 --- a/test/tests/feedReaderTest.js +++ b/test/tests/feedReaderTest.js @@ -4,8 +4,8 @@ describe("Zotero.FeedReader", function () { var htmlUrl = getTestDataUrl("test.html"); - var feedUrl = getTestDataUrl("feed.rss"); - var feedInfo = { + var rssFeedURL = getTestDataUrl("feed.rss"); + var rssFeedInfo = { title: 'Liftoff News', subtitle: 'Liftoff to Space Exploration.', updated: new Date("Tue, 10 Jun 2003 09:41:01 GMT"), @@ -18,8 +18,8 @@ describe("Zotero.FeedReader", function () { language: 'en-us' }; - var detailedFeedUrl = getTestDataUrl("feedDetailed.rss"); - var detailedFeedInfo = { + var detailedRSSFeedURL = getTestDataUrl("feedDetailed.rss"); + var detailedRSSFeedInfo = { title: 'Feed', subtitle: 'Feed Description', creators: [{firstName: 'Feed', lastName: 'Author', creatorType: 'author'}], @@ -29,7 +29,20 @@ describe("Zotero.FeedReader", function () { ISSN: '0000-0000', language: 'en' }; - + + var atomFeedURL = getTestDataUrl("feed.atom"); + var atomFeedInfo = { + title: 'Incircular nets and confocal conics', + updated: new Date("Tue, 10 Jun 2003 09:41:01 GMT"), + creators: [{ + firstName: '', + lastName: 'editor@example.com', + creatorType: 'author', + fieldMode: 1 + }], + language: 'en-us' + }; + after(function* () { yield clearFeeds(); }); @@ -54,7 +67,7 @@ describe("Zotero.FeedReader", function () { }); it('should set #feedProperties on FeedReader object', function* () { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); assert.throw(() => fr.feedProperties); yield fr.process(); assert.ok(fr.feedProperties); @@ -63,7 +76,7 @@ describe("Zotero.FeedReader", function () { describe('#terminate()', function() { it('should reject last feed item and feed processing promise if feed not processed yet', function* () { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); fr.terminate("test"); let e = yield getPromiseError(fr.process()); assert.ok(e); @@ -72,7 +85,7 @@ describe("Zotero.FeedReader", function () { }); it('should reject last feed item if feed processed', function* () { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); yield fr.process(); fr.terminate("test"); let e = yield getPromiseError(fr._feedItems[fr._feedItems.length-1].promise); @@ -82,30 +95,30 @@ describe("Zotero.FeedReader", function () { describe('#feedProperties', function() { it('should throw if accessed before feed is processed', function () { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); assert.throw(() => fr.feedProperties); }); it('should have correct values for a sparse feed', function* () { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); yield fr.process(); - assert.deepEqual(fr.feedProperties, feedInfo); + assert.deepEqual(fr.feedProperties, rssFeedInfo); }); it('should have correct values for a detailed feed', function* () { - let fr = new Zotero.FeedReader(detailedFeedUrl); + let fr = new Zotero.FeedReader(detailedRSSFeedURL); yield fr.process(); - assert.deepEqual(fr.feedProperties, detailedFeedInfo); + assert.deepEqual(fr.feedProperties, detailedRSSFeedInfo); }); }); describe('#ItemIterator()', function() { it('should throw if called before feed is resolved', function() { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); assert.throw(() => new fr.ItemIterator); }); - it('should parse items correctly for a sparse feed', function* () { + it('should parse items correctly for a sparse RSS feed', function* () { let expected = { guid: 'http://liftoff.msfc.nasa.gov/2003/06/03.html#item573', title: 'Star City', abstractNote: 'How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia\'s Star City.', @@ -117,14 +130,14 @@ describe("Zotero.FeedReader", function () { enclosedItems: [{ url: 'http://www.example.com/example.pdf', contentType: 'application/pdf' }] }; - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); yield fr.process(); let itemIterator = new fr.ItemIterator(); let item = yield itemIterator.next().value; assert.deepEqual(item, expected); }); - it('should parse items correctly for a detailed feed', function* () { + it('should parse items correctly for a detailed RSS feed', function* () { let expected = { guid: 'http://www.example.com/item1', title: 'Title 1', @@ -148,14 +161,39 @@ describe("Zotero.FeedReader", function () { enclosedItems: [] }; - let fr = new Zotero.FeedReader(detailedFeedUrl); + let fr = new Zotero.FeedReader(detailedRSSFeedURL); yield fr.process(); let itemIterator = new fr.ItemIterator(); let item = yield itemIterator.next().value; assert.deepEqual(item, expected); }); + + it("should parse item from an Atom feed", function* () { + let expected = { + guid: 'http://www.example.com/item1', + title: 'Title 1', + abstractNote: 'Abstract 1', + url: 'http://www.example.com/item1', + creators: [ + { firstName: 'Author1 A. T.', lastName: 'Rohtua', creatorType: 'author' }, + { firstName: 'Author2 A.', lastName: 'Auth', creatorType: 'author' } + ], + // TODO: DOI? + date: '2017-10-27T12:27:09Z', + itemType: 'journalArticle', + enclosedItems: [] + }; + + let fr = new Zotero.FeedReader(atomFeedURL); + yield fr.process(); + let itemIterator = new fr.ItemIterator(); + let item = yield itemIterator.next().value; + + assert.deepEqual(item, expected); + }); + it('should resolve last item with null', function* () { - let fr = new Zotero.FeedReader(feedUrl); + let fr = new Zotero.FeedReader(rssFeedURL); yield fr.process(); let itemIterator = new fr.ItemIterator(); let item;