UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

152 lines 21.3 kB
import { load } from "../../file_systems.mjs"; import { assert } from "chai"; import { Plugin } from "../agenda-00011/index.mjs"; import fetchMock from "fetch-mock"; const id = "00011"; suite(`Plugin${id}`); test(`#Plugin${id}FindSession`, async function () { const plugin = new Plugin({}); const sessions = [{ debut: "2019-09-10", fin: "2019-09-27" }, { debut: "2019-10-01", fin: "2020-06-30" }, { debut: "2020-06-31", fin: "2020-07-31" }, { debut: "2020-08-01", fin: "2020-08-31" }, { debut: "2020-09-01", fin: "2020-09-30" }]; plugin.sessions = sessions.slice(0, 2); // between sessions assert.strictEqual(plugin.lookupSession("2019-09-28"), null); assert.strictEqual(plugin.lookupSession("2017-01-01"), null); assert.deepEqual(plugin.lookupSession("2019-09-15"), plugin.sessions[0]); assert.deepEqual(plugin.lookupSession("2020-02-02"), plugin.sessions[1]); assert.strictEqual(plugin.lookupSession("2022-01-01"), null); plugin.sessions = sessions.slice(0, 1); assert.strictEqual(plugin.lookupSession("2017-01-01"), null); assert.deepEqual(plugin.lookupSession("2019-09-15"), plugin.sessions[0]); assert.strictEqual(plugin.lookupSession("2020-02-02"), null); assert.strictEqual(plugin.lookupSession("2022-01-01"), null); plugin.sessions = sessions; assert.strictEqual(plugin.lookupSession("2017-01-01"), null); assert.deepEqual(plugin.lookupSession("2019-09-15"), plugin.sessions[0]); assert.deepEqual(plugin.lookupSession("2020-02-02"), plugin.sessions[1]); assert.deepEqual(plugin.lookupSession("2020-09-01"), plugin.sessions[4]); assert.deepEqual(plugin.lookupSession("2020-09-30"), plugin.sessions[4]); assert.strictEqual(plugin.lookupSession("2022-01-01"), null); }); test(`#Plugin${id}Load`, async function () { const plugin = new Plugin({}); const d = `src/bugs/agenda-${id}`; const wikidata = load(`${d}/wikidata.json`); plugin.fetch = fetchMock.route(/query\.wikidata\.org/, { body: wikidata, status: 200 }); await plugin.preFix(); const expected = [{ debut: "2019-09-10", fin: "2019-09-27", label: "SESSION02" }, { debut: "2019-10-01", fin: "2020-06-30", label: "SESSION01" }]; assert.deepEqual(plugin.sessions, expected); }); test(`#Plugin${id}Fix`, async function () { const plugin = new Plugin({}); const d = `src/bugs/agenda-${id}`; const wikidata = load(`${d}/wikidata.json`); plugin.fetch = fetchMock.route(/query\.wikidata\.org/, { body: wikidata, status: 200 }); await plugin.preFix(); assert(plugin.sessions != undefined); { const f = `${d}/ok.json`; const content = load(f); assert("sessionRef" in content, content); assert.equal(await plugin.fix(content, f), true, f); assert(!("sessionRef" in content), content); assert(content.session.label, "SESSION01"); } { const f = `${d}/oldschema.json`; const content = load(f); assert.equal(content.schemaVersion, "agenda-1.0"); assert.equal(await plugin.fix(content, f), true, f); assert.equal(content.schemaVersion, "agenda-1.1"); } { const f = `${d}/noschema.json`; const content = load(f); assert.strictEqual(content.schemaVersion, undefined); assert.equal(await plugin.fix(content, f), true, f); assert.equal(content.schemaVersion, "agenda-1.1"); } { const f = `${d}/nosessionref.json`; const content = load(f); assert.equal(await plugin.fix(content, f), true, f); assert.equal(content.session.label, "SESSION01"); } { const f = `${d}/session.json`; const content = load(f); assert.equal(content.session.label, "SOMETHING"); assert.equal(await plugin.fix(content, f), true, f); assert.equal(content.session.label, "SESSION01"); } { const f = `${d}/not_seance_type.json`; const content = load(f); assert.equal(await plugin.fix(content, f), null, f); } }); test(`#Plugin${id}Check`, async function () { const plugin = new Plugin({}); const d = `src/bugs/agenda-${id}`; const wikidata = load(`${d}/wikidata.json`); plugin.fetch = fetchMock.route(/query\.wikidata\.org/, { body: wikidata, status: 200 }); await plugin.preCheck(); assert(plugin.sessions != undefined); { const f = `${d}/ok.json`; const content = load(f); const result = await plugin.check(content, f); assert.deepEqual(result, { status: "ok", info: [""] }, f); } { const f = `${d}/badtimestamp.json`; const content = load(f); const result = await plugin.check(content, f); assert.deepEqual(result, { status: "needs-fixing", info: ["2017-06-20 is not in a session"] }, f); } }); test(`#Plugin${id}FetchFail`, async function () { const plugin = new Plugin({}); plugin.fetch = fetchMock.route(/query\.wikidata\.org/, 500); let status = "unexpected"; await plugin.preFix().then(() => status = "exception not thrown").catch(e => status = String(e.status)); assert.equal(status, "500"); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2FkIiwiYXNzZXJ0IiwiUGx1Z2luIiwiZmV0Y2hNb2NrIiwiaWQiLCJzdWl0ZSIsInRlc3QiLCJwbHVnaW4iLCJzZXNzaW9ucyIsImRlYnV0IiwiZmluIiwic2xpY2UiLCJzdHJpY3RFcXVhbCIsImxvb2t1cFNlc3Npb24iLCJkZWVwRXF1YWwiLCJkIiwid2lraWRhdGEiLCJmZXRjaCIsInJvdXRlIiwiYm9keSIsInN0YXR1cyIsInByZUZpeCIsImV4cGVjdGVkIiwibGFiZWwiLCJ1bmRlZmluZWQiLCJmIiwiY29udGVudCIsImVxdWFsIiwiZml4Iiwic2Vzc2lvbiIsInNjaGVtYVZlcnNpb24iLCJwcmVDaGVjayIsInJlc3VsdCIsImNoZWNrIiwiaW5mbyIsInRoZW4iLCJjYXRjaCIsImUiLCJTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVncy9hZ2VuZGEtMDAwMTEvcGx1Z2luLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZCB9IGZyb20gXCIuLi8uLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4uL2FnZW5kYS0wMDAxMVwiXG5pbXBvcnQgZmV0Y2hNb2NrIGZyb20gXCJmZXRjaC1tb2NrXCJcblxuY29uc3QgaWQgPSBcIjAwMDExXCJcblxuc3VpdGUoYFBsdWdpbiR7aWR9YClcblxudGVzdChgI1BsdWdpbiR7aWR9RmluZFNlc3Npb25gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe30pXG5cbiAgY29uc3Qgc2Vzc2lvbnMgPSBbXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAxOS0wOS0xMFwiLFxuICAgICAgZmluOiBcIjIwMTktMDktMjdcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlYnV0OiBcIjIwMTktMTAtMDFcIixcbiAgICAgIGZpbjogXCIyMDIwLTA2LTMwXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWJ1dDogXCIyMDIwLTA2LTMxXCIsXG4gICAgICBmaW46IFwiMjAyMC0wNy0zMVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAyMC0wOC0wMVwiLFxuICAgICAgZmluOiBcIjIwMjAtMDgtMzFcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlYnV0OiBcIjIwMjAtMDktMDFcIixcbiAgICAgIGZpbjogXCIyMDIwLTA5LTMwXCIsXG4gICAgfSxcbiAgXVxuXG4gIHBsdWdpbi5zZXNzaW9ucyA9IHNlc3Npb25zLnNsaWNlKDAsIDIpXG4gIC8vIGJldHdlZW4gc2Vzc2lvbnNcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAxOS0wOS0yOFwiKSwgbnVsbClcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAxNy0wMS0wMVwiKSwgbnVsbClcbiAgYXNzZXJ0LmRlZXBFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMTktMDktMTVcIiksIHBsdWdpbi5zZXNzaW9uc1swXSlcbiAgYXNzZXJ0LmRlZXBFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMjAtMDItMDJcIiksIHBsdWdpbi5zZXNzaW9uc1sxXSlcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAyMi0wMS0wMVwiKSwgbnVsbClcblxuICBwbHVnaW4uc2Vzc2lvbnMgPSBzZXNzaW9ucy5zbGljZSgwLCAxKVxuICBhc3NlcnQuc3RyaWN0RXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDE3LTAxLTAxXCIpLCBudWxsKVxuICBhc3NlcnQuZGVlcEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAxOS0wOS0xNVwiKSwgcGx1Z2luLnNlc3Npb25zWzBdKVxuICBhc3NlcnQuc3RyaWN0RXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTAyLTAyXCIpLCBudWxsKVxuICBhc3NlcnQuc3RyaWN0RXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIyLTAxLTAxXCIpLCBudWxsKVxuXG4gIHBsdWdpbi5zZXNzaW9ucyA9IHNlc3Npb25zXG4gIGFzc2VydC5zdHJpY3RFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMTctMDEtMDFcIiksIG51bGwpXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDE5LTA5LTE1XCIpLCBwbHVnaW4uc2Vzc2lvbnNbMF0pXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTAyLTAyXCIpLCBwbHVnaW4uc2Vzc2lvbnNbMV0pXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTA5LTAxXCIpLCBwbHVnaW4uc2Vzc2lvbnNbNF0pXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTA5LTMwXCIpLCBwbHVnaW4uc2Vzc2lvbnNbNF0pXG4gIGFzc2VydC5zdHJpY3RFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMjItMDEtMDFcIiksIG51bGwpXG59KVxuXG50ZXN0KGAjUGx1Z2luJHtpZH1Mb2FkYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHt9KVxuICBjb25zdCBkID0gYHNyYy9idWdzL2FnZW5kYS0ke2lkfWBcblxuICBjb25zdCB3aWtpZGF0YSA9IGxvYWQoYCR7ZH0vd2lraWRhdGEuanNvbmApXG4gIHBsdWdpbi5mZXRjaCA9IGZldGNoTW9jay5yb3V0ZSgvcXVlcnlcXC53aWtpZGF0YVxcLm9yZy8sIHtcbiAgICBib2R5OiB3aWtpZGF0YSxcbiAgICBzdGF0dXM6IDIwMCxcbiAgfSlcbiAgYXdhaXQgcGx1Z2luLnByZUZpeCgpXG5cbiAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAxOS0wOS0xMFwiLFxuICAgICAgZmluOiBcIjIwMTktMDktMjdcIixcbiAgICAgIGxhYmVsOiBcIlNFU1NJT04wMlwiLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAxOS0xMC0wMVwiLFxuICAgICAgZmluOiBcIjIwMjAtMDYtMzBcIixcbiAgICAgIGxhYmVsOiBcIlNFU1NJT04wMVwiLFxuICAgIH0sXG4gIF1cbiAgYXNzZXJ0LmRlZXBFcXVhbChwbHVnaW4uc2Vzc2lvbnMsIGV4cGVjdGVkKVxufSlcblxudGVzdChgI1BsdWdpbiR7aWR9Rml4YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHt9KVxuICBjb25zdCBkID0gYHNyYy9idWdzL2FnZW5kYS0ke2lkfWBcblxuICBjb25zdCB3aWtpZGF0YSA9IGxvYWQoYCR7ZH0vd2lraWRhdGEuanNvbmApXG4gIHBsdWdpbi5mZXRjaCA9IGZldGNoTW9jay5yb3V0ZSgvcXVlcnlcXC53aWtpZGF0YVxcLm9yZy8sIHtcbiAgICBib2R5OiB3aWtpZGF0YSxcbiAgICBzdGF0dXM6IDIwMCxcbiAgfSlcblxuICBhd2FpdCBwbHVnaW4ucHJlRml4KClcbiAgYXNzZXJ0KHBsdWdpbi5zZXNzaW9ucyAhPSB1bmRlZmluZWQpXG5cbiAge1xuICAgIGNvbnN0IGYgPSBgJHtkfS9vay5qc29uYFxuICAgIGNvbnN0IGNvbnRlbnQgPSBsb2FkKGYpXG4gICAgYXNzZXJ0KFwic2Vzc2lvblJlZlwiIGluIGNvbnRlbnQsIGNvbnRlbnQpXG4gICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHBsdWdpbi5maXgoY29udGVudCwgZiksIHRydWUsIGYpXG4gICAgYXNzZXJ0KCEoXCJzZXNzaW9uUmVmXCIgaW4gY29udGVudCksIGNvbnRlbnQpXG4gICAgYXNzZXJ0KGNvbnRlbnQuc2Vzc2lvbi5sYWJlbCwgXCJTRVNTSU9OMDFcIilcbiAgfVxuXG4gIHtcbiAgICBjb25zdCBmID0gYCR7ZH0vb2xkc2NoZW1hLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zY2hlbWFWZXJzaW9uLCBcImFnZW5kYS0xLjBcIilcbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgcGx1Z2luLmZpeChjb250ZW50LCBmKSwgdHJ1ZSwgZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zY2hlbWFWZXJzaW9uLCBcImFnZW5kYS0xLjFcIilcbiAgfVxuXG4gIHtcbiAgICBjb25zdCBmID0gYCR7ZH0vbm9zY2hlbWEuanNvbmBcbiAgICBjb25zdCBjb250ZW50ID0gbG9hZChmKVxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb250ZW50LnNjaGVtYVZlcnNpb24sIHVuZGVmaW5lZClcbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgcGx1Z2luLmZpeChjb250ZW50LCBmKSwgdHJ1ZSwgZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zY2hlbWFWZXJzaW9uLCBcImFnZW5kYS0xLjFcIilcbiAgfVxuXG4gIHtcbiAgICBjb25zdCBmID0gYCR7ZH0vbm9zZXNzaW9ucmVmLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgcGx1Z2luLmZpeChjb250ZW50LCBmKSwgdHJ1ZSwgZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zZXNzaW9uLmxhYmVsLCBcIlNFU1NJT04wMVwiKVxuICB9XG5cbiAge1xuICAgIGNvbnN0IGYgPSBgJHtkfS9zZXNzaW9uLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zZXNzaW9uLmxhYmVsLCBcIlNPTUVUSElOR1wiKVxuICAgIGFzc2VydC5lcXVhbChhd2FpdCBwbHVnaW4uZml4KGNvbnRlbnQsIGYpLCB0cnVlLCBmKVxuICAgIGFzc2VydC5lcXVhbChjb250ZW50LnNlc3Npb24ubGFiZWwsIFwiU0VTU0lPTjAxXCIpXG4gIH1cblxuICB7XG4gICAgY29uc3QgZiA9IGAke2R9L25vdF9zZWFuY2VfdHlwZS5qc29uYFxuICAgIGNvbnN0IGNvbnRlbnQgPSBsb2FkKGYpXG4gICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHBsdWdpbi5maXgoY29udGVudCwgZiksIG51bGwsIGYpXG4gIH1cbn0pXG5cbnRlc3QoYCNQbHVnaW4ke2lkfUNoZWNrYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHt9KVxuICBjb25zdCBkID0gYHNyYy9idWdzL2FnZW5kYS0ke2lkfWBcblxuICBjb25zdCB3aWtpZGF0YSA9IGxvYWQoYCR7ZH0vd2lraWRhdGEuanNvbmApXG4gIHBsdWdpbi5mZXRjaCA9IGZldGNoTW9jay5yb3V0ZSgvcXVlcnlcXC53aWtpZGF0YVxcLm9yZy8sIHtcbiAgICBib2R5OiB3aWtpZGF0YSxcbiAgICBzdGF0dXM6IDIwMCxcbiAgfSlcblxuICBhd2FpdCBwbHVnaW4ucHJlQ2hlY2soKVxuICBhc3NlcnQocGx1Z2luLnNlc3Npb25zICE9IHVuZGVmaW5lZClcblxuICB7XG4gICAgY29uc3QgZiA9IGAke2R9L29rLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4uY2hlY2soY29udGVudCwgZilcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3VsdCwgeyBzdGF0dXM6IFwib2tcIiwgaW5mbzogW1wiXCJdIH0sIGYpXG4gIH1cblxuICB7XG4gICAgY29uc3QgZiA9IGAke2R9L2JhZHRpbWVzdGFtcC5qc29uYFxuICAgIGNvbnN0IGNvbnRlbnQgPSBsb2FkKGYpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmNoZWNrKGNvbnRlbnQsIGYpXG4gICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgIHJlc3VsdCxcbiAgICAgIHsgc3RhdHVzOiBcIm5lZWRzLWZpeGluZ1wiLCBpbmZvOiBbXCIyMDE3LTA2LTIwIGlzIG5vdCBpbiBhIHNlc3Npb25cIl0gfSxcbiAgICAgIGYsXG4gICAgKVxuICB9XG59KVxuXG50ZXN0KGAjUGx1Z2luJHtpZH1GZXRjaEZhaWxgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe30pXG5cbiAgcGx1Z2luLmZldGNoID0gZmV0Y2hNb2NrLnJvdXRlKC9xdWVyeVxcLndpa2lkYXRhXFwub3JnLywgNTAwKVxuXG4gIGxldCBzdGF0dXMgPSBcInVuZXhwZWN0ZWRcIlxuICBhd2FpdCBwbHVnaW5cbiAgICAucHJlRml4KClcbiAgICAudGhlbigoKSA9PiAoc3RhdHVzID0gXCJleGNlcHRpb24gbm90IHRocm93blwiKSlcbiAgICAuY2F0Y2goKGUpID0+IChzdGF0dXMgPSBTdHJpbmcoZS5zdGF0dXMpKSlcbiAgYXNzZXJ0LmVxdWFsKHN0YXR1cywgXCI1MDBcIilcbn0pXG4iXSwibWFwcGluZ3MiOiJTQUFTQSxJQUFJO0FBQ2IsU0FBU0MsTUFBTSxRQUFRLE1BQU07QUFBQSxTQUNwQkMsTUFBTTtBQUNmLE9BQU9DLFNBQVMsTUFBTSxZQUFZO0FBRWxDLE1BQU1DLEVBQUUsR0FBRyxPQUFPO0FBRWxCQyxLQUFLLENBQUMsU0FBU0QsRUFBRSxFQUFFLENBQUM7QUFFcEJFLElBQUksQ0FBQyxVQUFVRixFQUFFLGFBQWEsRUFBRSxrQkFBa0I7RUFDaEQsTUFBTUcsTUFBTSxHQUFHLElBQUlMLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUU3QixNQUFNTSxRQUFRLEdBQUcsQ0FDZjtJQUNFQyxLQUFLLEVBQUUsWUFBWTtJQUNuQkMsR0FBRyxFQUFFO0VBQ1AsQ0FBQyxFQUNEO0lBQ0VELEtBQUssRUFBRSxZQUFZO0lBQ25CQyxHQUFHLEVBQUU7RUFDUCxDQUFDLEVBQ0Q7SUFDRUQsS0FBSyxFQUFFLFlBQVk7SUFDbkJDLEdBQUcsRUFBRTtFQUNQLENBQUMsRUFDRDtJQUNFRCxLQUFLLEVBQUUsWUFBWTtJQUNuQkMsR0FBRyxFQUFFO0VBQ1AsQ0FBQyxFQUNEO0lB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