UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

81 lines (80 loc) 4.57 kB
import { expect } from "@javarome/testscript"; import { CaseSummaryRenderer } from "../CaseSummaryRenderer.js"; import { TimeTextBuilder } from "../text/TimeTextBuilder.js"; import { SourceFactory, SourceRenderer } from "../../source/index.js"; import { NoteFileCounter, NoteRenderer } from "../../note/index.js"; import { HttpSource } from "./HttpSource.js"; import { TimeElementFactory } from "../html/TimeElementFactory.js"; import { TimeRenderer } from "../html/TimeRenderer.js"; import { cmsTestUtil } from "../../test/index.js"; import { AllDataService } from "@rr0/data"; import { PlaceRenderer } from "../../place/PlaceRenderer.js"; export class DatasourceTestCase { constructor(mapping, sourceCases, intlOptions = { year: "numeric", month: "long", day: "numeric", weekday: "long", hour: "2-digit", minute: "2-digit", timeZoneName: "short" }) { this.mapping = mapping; this.sourceCases = sourceCases; this.intlOptions = intlOptions; this.timeTextBuilder = new TimeTextBuilder(this.intlOptions); this.placeRenderer = new PlaceRenderer(); } checkCaseHTML(context, nativeCase, item, dataDate) { const expected = this.mapping.mapper.map(context, nativeCase, dataDate); const time = this.getTime(nativeCase); const caseContext = context.clone(); caseContext.time.date = time; const timeStr = this.timeTextBuilder.build(caseContext); const placeStr = expected.place ? this.placeRenderer.render(context, expected.place) : ""; const expectedSources = expected.sources; const sourceStr = (expectedSources === null || expectedSources === void 0 ? void 0 : expectedSources.length) > 0 ? this.expectedSourceStr(context, expectedSources, nativeCase) : ""; expect(item.innerHTML).toBe(`<span class="time-resolved">${time.day ? "le" : "en"} <time datetime="${time.toString()}">${timeStr}</time></span>${placeStr}, ${expected.description}${sourceStr}.`); } async testRender(context) { const sourceCases = await this.mapping.datasource.fetch(context); const dataDate = new Date("2024-08-12 00:00:00 GMT+1"); const cases = sourceCases.map(sourceCase => this.mapping.mapper.map(context, sourceCase, dataDate)); const dataService = new AllDataService([]); const baseUrl = "https://rr0.org"; const http = new HttpSource(); const timeService = await cmsTestUtil.time.getService(); const sourceFactory = new SourceFactory(dataService, http, baseUrl, this.intlOptions, timeService); const timeElementFactory = new TimeElementFactory(new TimeRenderer(cmsTestUtil.time.urlBuilder, this.timeTextBuilder)); const eventRenderer = new CaseSummaryRenderer(new NoteRenderer(new NoteFileCounter()), sourceFactory, new SourceRenderer(this.timeTextBuilder), timeElementFactory); const items = []; for (const c of cases) { const outDoc = context.file.document; const item = outDoc.createElement("li"); await eventRenderer.render(context, c, item); items.push(item); } expect(items.length).toBe(sourceCases.length); for (let i = 0; i < sourceCases.length; i++) { this.checkCaseHTML(context, sourceCases[i], items[i], dataDate); } } async testFetch(context) { const fetched = await this.mapping.datasource.fetch(context); const fetchSlice = fetched.slice(0, this.sourceCases.length); const sortedFetch = fetchSlice.sort(this.sortComparator); const sortedTestCases = this.sourceCases.sort(this.sortComparator); expect(sortedFetch).toEqual(sortedTestCases); } expectedSourceStr(context, expectedSources, nativeCase) { const datasource = this.mapping.datasource; const source = expectedSources[0]; const sourceContext = context.clone(); sourceContext.time.date = source.publication.time; const publicationStr = source.publication ? `, ${this.timeTextBuilder.build(sourceContext)}` : ""; const indexStr = source.index ? `, ${source.index}` : ""; const authorStr = datasource.authors.map(authorStr => `<span class="people">${authorStr}</span>`).join(" &amp; "); const title = `cas n° ${nativeCase["id"]}`; return ` <span class="source">${authorStr}: <a href="${nativeCase["url"].replaceAll("&", "&amp;")}">${title}</a>, <i>${datasource.copyright}</i>${publicationStr}${indexStr}</span>`; } }