From fe42d81ec8ec21be29e4e4e6de6866ddc947fb28 Mon Sep 17 00:00:00 2001 From: Dominique Hazael-Massieux Date: Tue, 14 Nov 2023 09:23:12 +0100 Subject: [PATCH] Add support for fetching data on the history of a single wikimedia page --- lib/wiki-activity.js | 8 ++++++-- test/wiki-activity.js | 13 +++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/wiki-activity.js b/lib/wiki-activity.js index a1b8e271f..8543bc449 100644 --- a/lib/wiki-activity.js +++ b/lib/wiki-activity.js @@ -6,8 +6,12 @@ module.exports.fetchWiki = async function fetchWiki(url) { // based on https://stackoverflow.com/a/8573941 return fetchRSS(url + ".atom"); } - // TODO: handle case of a single wiki page - // handle case of Main_Page + // from there on, this assume we're dealing with a wikimedia instance + url = url.replace(/Main_Page$/, ''); + if (url.match(/\/wiki\/.+$/)) { // a specific page of the wiki + const [base, page] = url.split('/wiki/'); + return fetchRSS(`${base}/wiki/index.php?title=${page}&feed=atom&action=history&days=1000&limit=1000`); + } return fetchRSS(url + '/api.php?action=feedrecentchanges&days=1000&limit=1000'); }; diff --git a/test/wiki-activity.js b/test/wiki-activity.js index 6787ae2a7..7a09c9a72 100644 --- a/test/wiki-activity.js +++ b/test/wiki-activity.js @@ -53,6 +53,19 @@ describe('The Wiki Activity monitor', function () { assert.equal(data[0].isoDate, '2023-11-10T13:24:37.000Z', 'RSS feed item wiki date correctly identified'); }); + it('detects activity on a single wiki page', async function() { + const feed = await fs.readFile('test/mock-content/feed.rss', 'utf-8'); + const u = new URL("https://example.test/wiki/Test_Page"); + agent + .get(u.origin) + .intercept({path: `/wiki/index.php?title=Test_Page&feed=atom&action=history&days=1000&limit=1000`, method: "GET"}) + .reply(200, feed); + const { items: data} = await fetchWiki(u.href); + assert.equal(data.length, 1, 'RSS Feed from wikimedia has one item'); + assert.equal(data[0].isoDate, '2023-11-10T13:24:37.000Z', 'RSS feed item wiki date correctly identified'); + }); + + it("returns an error when the feed doesn't exist", async function() { const u = testUrl(); agent