« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/test/lib
diff options
context:
space:
mode:
Diffstat (limited to 'test/lib')
-rw-r--r--test/lib/content-function.js30
-rw-r--r--test/lib/wiki-data.js113
2 files changed, 130 insertions, 13 deletions
diff --git a/test/lib/content-function.js b/test/lib/content-function.js
index a46d18c9..49fe5c95 100644
--- a/test/lib/content-function.js
+++ b/test/lib/content-function.js
@@ -11,16 +11,21 @@ import {quickEvaluate} from '#content-function';
 import * as html from '#html';
 import {internalDefaultStringsFile, processLanguageFile} from '#language';
 import {empty} from '#sugar';
-import {generateURLs, thumb, urlSpec} from '#urls';
+
+import {
+  applyLocalizedWithBaseDirectory,
+  generateURLs,
+  internalDefaultURLSpecFile,
+  processURLSpecFromFileSync,
+  thumb,
+} from '#urls';
 
 import mock from './generic-mock.js';
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
 
-function cleanURLSpec(reference) {
-  const prepared = structuredClone(reference);
-
-  for (const spec of Object.values(prepared)) {
+function cleanURLSpec(urlSpec) {
+  for (const spec of Object.values(urlSpec)) {
     if (spec.prefix) {
       // Strip out STATIC_VERSION. This updates fairly regularly and we
       // don't want it to affect snapshot tests.
@@ -28,12 +33,23 @@ function cleanURLSpec(reference) {
         .replace(/static-\d+[a-z]\d+/i, 'static');
     }
   }
+}
+
+function urlsPlease() {
+  const {aggregate: urlsAggregate, result: urlSpec} =
+    processURLSpecFromFileSync(internalDefaultURLSpecFile);
+
+  urlsAggregate.close();
+
+  applyLocalizedWithBaseDirectory(urlSpec);
+
+  cleanURLSpec(urlSpec);
 
-  return prepared;
+  return generateURLs(urlSpec);
 }
 
 export function testContentFunctions(t, message, fn) {
-  const urls = generateURLs(cleanURLSpec(urlSpec));
+  const urls = urlsPlease();
 
   t.test(message, async t => {
     let loadedContentDependencies;
diff --git a/test/lib/wiki-data.js b/test/lib/wiki-data.js
index c373aadd..f0ee0ef5 100644
--- a/test/lib/wiki-data.js
+++ b/test/lib/wiki-data.js
@@ -1,17 +1,22 @@
 import CacheableObject from '#cacheable-object';
-import find from '#find';
+import find, {bindFind} from '#find';
+import {bindReverse} from '#reverse';
 import {withEntries} from '#sugar';
+import Thing from '#thing';
+import thingConstructors from '#things';
 import {linkWikiDataArrays} from '#yaml';
 
 export function linkAndBindWikiData(wikiData, {
   inferAlbumsOwnTrackData = true,
 } = {}) {
   function customLinkWikiDataArrays(wikiData, options = {}) {
-    linkWikiDataArrays(
-      (options.XXX_decacheWikiData
-        ? withEntries(wikiData, entries => entries
-            .map(([key, value]) => [key, value.slice()]))
-        : wikiData));
+    if (options.XXX_decacheWikiData) {
+      wikiData =
+        withEntries(wikiData, entries => entries
+          .map(([key, value]) => [key, value.slice()]));
+    }
+
+    linkWikiDataArrays(wikiData, {bindFind, bindReverse});
   }
 
   customLinkWikiDataArrays(wikiData);
@@ -53,3 +58,99 @@ export function linkAndBindWikiData(wikiData, {
         .bind(null, wikiData, {XXX_decacheWikiData: true}),
   };
 }
+
+export function stubWikiData() {
+  return {
+    albumData: [],
+    artistData: [],
+    artTagData: [],
+    flashData: [],
+    flashActData: [],
+    flashSideData: [],
+    groupData: [],
+    groupCategoryData: [],
+    newsData: [],
+    staticPageData: [],
+    trackData: [],
+    trackSectionData: [],
+  };
+}
+
+export function stubThing(wikiData, constructor, properties = {}) {
+  const thing = Reflect.construct(constructor, []);
+  Object.assign(thing, properties);
+
+  const wikiDataSpec = {
+    Album: 'albumData',
+    Artist: 'artistData',
+    ArtTag: 'artTagData',
+    Flash: 'flashData',
+    FlashAct: 'flashActData',
+    FlashSide: 'flashSideData',
+    Group: 'groupData',
+    GroupCategory: 'groupCategoryData',
+    NewsEntry: 'newsData',
+    StaticPage: 'staticPageData',
+    Track: 'trackData',
+    TrackSection: 'trackSectionData',
+  };
+
+  const wikiDataMap =
+    new Map(
+      Object.entries(wikiDataSpec)
+        .map(([thingKey, wikiDataKey]) => [
+          thingConstructors[thingKey],
+          wikiData[wikiDataKey],
+        ]));
+
+  const wikiDataArray =
+    wikiDataMap.get(constructor);
+
+  wikiDataArray.push(thing);
+
+  return thing;
+}
+
+export function stubTrackAndAlbum(wikiData, trackDirectory = null, albumDirectory = null) {
+  const {Track, TrackSection, Album} = thingConstructors;
+
+  const track =
+    stubThing(wikiData, Track, {directory: trackDirectory});
+
+  const section =
+    stubThing(wikiData, TrackSection, {tracks: [track]});
+
+  const album =
+    stubThing(wikiData, Album, {directory: albumDirectory, trackSections: [section]});
+
+  return {track, album, section};
+}
+
+export function stubArtistAndContribs(wikiData, artistName = `Test Artist`) {
+  const {Artist} = thingConstructors;
+
+  const artist =
+    stubThing(wikiData, Artist, {name: artistName});
+
+  const contribs =
+    [{artist: artistName, annotation: null}];
+
+  const badContribs =
+    [{artist: `Figment of Your Imagination`, annotation: null}];
+
+  return {artist, contribs, badContribs};
+}
+
+export function stubFlashAndAct(wikiData, flashDirectory = null) {
+  const {Flash, FlashAct} = thingConstructors;
+
+  const flash =
+    stubThing(wikiData, Flash, {directory: flashDirectory});
+
+  const flashAct =
+    stubThing(wikiData, FlashAct, {
+      flashes: [Thing.getReference(flash)],
+    });
+
+  return {flash, flashAct};
+}