UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

227 lines (226 loc) 13.8 kB
import { TimeReplacer } from "./TimeReplacer.js"; import { cmsTestUtil } from "../../test/index.js"; import { describe, expect, test } from "@javarome/testscript"; import { TimeRenderer } from "./TimeRenderer.js"; import { TimeElementFactory } from "./TimeElementFactory.js"; import { TimeTextBuilder } from "../text/TimeTextBuilder.js"; import path from "path"; import { TimeUrlBuilder } from "../TimeUrlBuilder.js"; describe("TimeReplacer", async () => { const timeRoot = cmsTestUtil.time.timeOptions.rootDir; const timeOptions = { rootDir: timeRoot, files: [ path.join(timeRoot, "1/9/4/7/07/02/index.html"), path.join(timeRoot, "2/0/0/3/index.html"), path.join(timeRoot, "2/0/0/3/12/24/index.html"), path.join(timeRoot, "2/0/0/4/index.html"), path.join(timeRoot, "2/0/0/4/09/index.html"), path.join(timeRoot, "2/0/0/5/index.html"), path.join(timeRoot, "2/0/0/5/08/23/index.html"), path.join(timeRoot, "2/0/0/6/index.html"), path.join(timeRoot, "2/0/0/6/07/14/index.html"), path.join(timeRoot, "2/0/0/7/06/15/index.html") ] }; const textBuilder = new TimeTextBuilder(cmsTestUtil.intlOptions); const timeRenderer = new TimeRenderer(new TimeUrlBuilder(timeOptions), textBuilder); const timeElementFactory = new TimeElementFactory(timeRenderer); const replacer = new TimeReplacer(timeElementFactory); function timeUrl(pathStr) { return path.join("/", timeOptions.rootDir, pathStr, "index.html"); } test("parses year", async () => { { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const timeEl = context.file.document.createElement("time"); timeEl.textContent = "2003"; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML).toBe(`<span class="time-resolved"><a href="${path.join("/", cmsTestUtil.time.filePath("2/0/0/3/"))}"><time datetime="2003">2003</time></a></span>`); expect(context.time.getYear()).toBe(2003); expect(context.time.getMonth()).toBe(undefined); expect(context.time.getDayOfMonth()).toBe(undefined); expect(context.time.getHour()).toBe(undefined); expect(context.time.getMinutes()).toBe(undefined); expect(context.time.getTimeZone()).toBe(undefined); } { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08", ""); const timeEl = context.file.document.createElement("time"); timeEl.innerHTML = "2003\n "; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML).toBe(`<span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/3/")}"><time datetime="2003">2003</time></a></span>`); expect(context.time.getYear()).toBe(2003); expect(context.time.getMonth()).toBe(undefined); expect(context.time.getDayOfMonth()).toBe(undefined); expect(context.time.getHour()).toBe(undefined); expect(context.time.getMinutes()).toBe(undefined); expect(context.time.getTimeZone()).toBe(undefined); } }); test("parses interval", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const interval = "2003/2004"; const original = context.file.document.createElement("time"); original.textContent = interval; const replaced = await replacer.replacement(context, original); expect(replaced.outerHTML) .toBe(`<span class="time-interval"><span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/3/")}"><time datetime="2003">2003</time></a></span> à <span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/4/")}"><time datetime="2004">2004</time></a></span></span>`); expect(context.time.getYear()).toBe(2004); expect(context.time.getMonth()).toBe(undefined); expect(context.time.getDayOfMonth()).toBe(undefined); expect(context.time.getHour()).toBe(undefined); expect(context.time.getMinutes()).toBe(undefined); expect(context.time.getTimeZone()).toBe(undefined); }); test("parses unsupported", async () => { const interval = "moi"; const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const original = context.file.document.createElement("time"); original.textContent = interval; const replacement = await replacer.replacement(context, original); expect(replacement.outerHTML).toBe(`<time>moi</time>`); expect(context.time.getYear()).toBe(1990); expect(context.time.getMonth()).toBe(8); expect(context.time.getDayOfMonth()).toBe(undefined); expect(context.time.getHour()).toBe(undefined); expect(context.time.getMinutes()).toBe(undefined); expect(context.time.getTimeZone()).toBe(undefined); }); test("parses timezone", async () => { { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08", ""); const original = context.file.document.createElement("time"); original.textContent = "2003-12-24T10:22CDT"; const replacement = await replacer.replacement(context, original); expect(replacement.outerHTML) .toBe(`<span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/3/12/24/")}"><time datetime="2003-12-24T10:22-05">mercredi 24 décembre 2003 à 10:22</time></a></span>`); // TODO: Text should have timezone info expect(context.time.getYear()).toBe(2003); expect(context.time.getMonth()).toBe(12); expect(context.time.getDayOfMonth()).toBe(24); expect(context.time.getHour()).toBe(10); expect(context.time.getMinutes()).toBe(22); expect(context.time.getTimeshift()).toBe("-05"); } /*{ const context = cmsTestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "") const interval = "2003-12-24 (CDT)" const replacer = new TimeReplacer(["time/2/0/0/3/12/24"]) expect(replacer.replacement(context, `<time>${interval}</time>`, interval)) .toBe(`<a href="/time/2/0/0/3/12/24/">mercredi 24 décembre 2003</a>`) // TODO: Text should have timezone info expect(context.time.getYear()).toBe(2003) expect(context.time.getMonth()).toBe(12) expect(context.time.getDayOfMonth()).toBe(24) expect(context.time.getHour()).toBe(undefined) expect(context.time.getMinutes()).toBe(undefined) expect(context.time.getTimeZone()).toBe("CDT") }*/ }); test("parses month", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08", ""); const original = context.file.document.createElement("time"); original.textContent = "2004-09"; const replacement = await replacer.replacement(context, original); expect(replacement.outerHTML).toBe(`<span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/4/09/")}"><time datetime="2004-09">septembre 2004</time></a></span>`); expect(context.time.getYear()).toBe(2004); expect(context.time.getMonth()).toBe(9); expect(context.time.getDayOfMonth()).toBe(undefined); expect(context.time.getHour()).toBe(undefined); expect(context.time.getMinutes()).toBe(undefined); }); describe("parses day", () => { test("from full date", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08", ""); const timeEl = context.file.document.createElement("time"); timeEl.textContent = "2005-08-23"; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML).toBe(`<span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/5/08/23/")}"><time datetime="2005-08-23">mardi 23 août 2005</time></a></span>`); expect(context.time.getYear()).toBe(2005); expect(context.time.getMonth()).toBe(8); expect(context.time.getDayOfMonth()).toBe(23); expect(context.time.getHour()).toBe(undefined); expect(context.time.getMinutes()).toBe(undefined); }); }); test("reset context", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const timeEl = context.file.document.createElement("time"); timeEl.textContent = "2005"; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML).toBe(`<span class="time-resolved"><a href="${cmsTestUtil.time.url("2/0/0/5/")}"><time datetime="2005">2005</time></a></span>`); const original = context.file.document.createElement("time"); const datetime = "2006"; original.textContent = datetime; const replacement2 = await replacer.replacement(context, original); expect(replacement2.outerHTML).toBe(`<span class="time-resolved"><a href="${cmsTestUtil.time.url("2/0/0/6/")}"><time datetime="${datetime}" title="2006">l'année suivante</time></a></span>`); }); test("avoids linking to current file", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const timeEl = context.file.document.createElement("time"); const datetime = "1954-10-01"; timeEl.textContent = datetime; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML) .toBe(`<span class="time-resolved"><time datetime="${datetime}">vendredi 1 octobre 1954</time></span>`); }); describe("parse duration", () => { test("with days, hours, minutes and seconds", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const timeEl = context.file.document.createElement("time"); const datetime = "P2D10H23M45S"; timeEl.textContent = datetime; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML).toBe(`<time datetime="${datetime}" class="duration">2 jours, 10 heures, 23 minutes et 45 secondes</time>`); }); test("with context", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); { const ctxElement = context.file.document.createElement("time"); ctxElement.textContent = "1947-07-02"; const replacement1 = await replacer.replacement(context, ctxElement); expect(replacement1.outerHTML).toBe(`<span class="time-resolved"><a href="${cmsTestUtil.time.url("1/9/4/7/07/02/")}"><time datetime="1947-07-02">mercredi 2 juillet 1947</time></a></span>`); } { const element = context.file.document.createElement("time"); element.textContent = "P20M"; const replacement = await replacer.replacement(context, element); expect(replacement.outerHTML).toBe(`<time datetime="P20M" class="duration">20 minutes</time>`); } }); test("with approximation", async () => { const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const original = context.file.document.createElement("time"); original.textContent = "P~2H"; const replacement = await replacer.replacement(context, original); expect(replacement.outerHTML).toBe(`<time datetime="P2H" class="duration">environ 2 heures</time>`); }); }); describe("parses hour", () => { test("with context", async () => { // Empty context const context = cmsTestUtil.time.newHtmlContext("1/9/9/0/08/index.html", ""); const timeEl = context.file.document.createElement("time"); timeEl.textContent = "2006-07-14 17:56"; const replacement = await replacer.replacement(context, timeEl); expect(replacement.outerHTML).toBe(`<span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/6/07/14/")}"><time datetime="2006-07-14T17:56">vendredi 14 juillet 2006 à 17:56</time></a></span>`); expect(context.time.getYear()).toBe(2006); expect(context.time.getMonth()).toBe(7); expect(context.time.getDayOfMonth()).toBe(14); expect(context.time.getHour()).toBe(17); expect(context.time.getMinutes()).toBe(56); // Change day + hour const timeEl1 = context.file.document.createElement("time"); timeEl1.textContent = "2007-06-15 18:47"; const replacement1 = await replacer.replacement(context, timeEl1); expect(replacement1.outerHTML).toBe(`<span class="time-resolved"><a href="${path.join("/", timeOptions.rootDir, "2/0/0/7/06/15/")}"><time datetime="2007-06-15T18:47">vendredi 15 juin 2007 à 18:47</time></a></span>`); expect(context.time.getYear()).toBe(2007); expect(context.time.getMonth()).toBe(6); expect(context.time.getDayOfMonth()).toBe(15); expect(context.time.getHour()).toBe(18); expect(context.time.getMinutes()).toBe(47); // TODO: Change hour only }); test("with approximation", async () => { }); }); });