diff options
Diffstat (limited to 'test/lib')
-rw-r--r-- | test/lib/composite.js | 33 | ||||
-rw-r--r-- | test/lib/content-function.js | 18 | ||||
-rw-r--r-- | test/lib/index.js | 1 | ||||
-rw-r--r-- | test/lib/wiki-data.js | 115 |
4 files changed, 148 insertions, 19 deletions
diff --git a/test/lib/composite.js b/test/lib/composite.js new file mode 100644 index 00000000..359d364d --- /dev/null +++ b/test/lib/composite.js @@ -0,0 +1,33 @@ +import {compositeFrom} from '#composite'; + +export function quickCheckCompositeOutputs(t, dependencies) { + return (step, outputDict) => { + t.same( + Object.keys(step.toDescription().outputs), + Object.keys(outputDict)); + + const composite = compositeFrom({ + compose: false, + steps: [ + step, + + { + dependencies: Object.keys(outputDict), + + // Access all dependencies by their expected keys - + // the composition runner actually provides a proxy + // and is checking that *we* access the dependencies + // we've specified. + compute: dependencies => + Object.fromEntries( + Object.keys(outputDict) + .map(key => [key, dependencies[key]])), + }, + ], + }); + + t.same( + composite.expose.compute(dependencies), + outputDict); + }; +} diff --git a/test/lib/content-function.js b/test/lib/content-function.js index 7bc62139..a46d18c9 100644 --- a/test/lib/content-function.js +++ b/test/lib/content-function.js @@ -17,8 +17,23 @@ 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)) { + if (spec.prefix) { + // Strip out STATIC_VERSION. This updates fairly regularly and we + // don't want it to affect snapshot tests. + spec.prefix = spec.prefix + .replace(/static-\d+[a-z]\d+/i, 'static'); + } + } + + return prepared; +} + export function testContentFunctions(t, message, fn) { - const urls = generateURLs(urlSpec); + const urls = generateURLs(cleanURLSpec(urlSpec)); t.test(message, async t => { let loadedContentDependencies; @@ -52,7 +67,6 @@ export function testContentFunctions(t, message, fn) { to, urls, - cachebust: 413, pagePath: ['home'], appendIndexHTML: false, getColors: c => getColors(c, {chroma}), diff --git a/test/lib/index.js b/test/lib/index.js index 5fb5bf78..4c9ee23f 100644 --- a/test/lib/index.js +++ b/test/lib/index.js @@ -1,5 +1,6 @@ Error.stackTraceLimit = Infinity; +export * from './composite.js'; export * from './content-function.js'; export * from './generic-mock.js'; export * from './wiki-data.js'; diff --git a/test/lib/wiki-data.js b/test/lib/wiki-data.js index d2d860ce..7c3d2147 100644 --- a/test/lib/wiki-data.js +++ b/test/lib/wiki-data.js @@ -1,6 +1,8 @@ import CacheableObject from '#cacheable-object'; import find from '#find'; import {withEntries} from '#sugar'; +import Thing from '#thing'; +import thingConstructors from '#things'; import {linkWikiDataArrays} from '#yaml'; export function linkAndBindWikiData(wikiData, { @@ -12,23 +14,6 @@ export function linkAndBindWikiData(wikiData, { ? withEntries(wikiData, entries => entries .map(([key, value]) => [key, value.slice()])) : wikiData)); - - // If albumData is present, automatically set albums' ownTrackData values - // by resolving track sections' references against the full array. This is - // just a nicety for working with albums throughout tests. - if (inferAlbumsOwnTrackData && wikiData.albumData && wikiData.trackData) { - for (const album of wikiData.albumData) { - const trackSections = - CacheableObject.getUpdateValue(album, 'trackSections'); - - const trackRefs = - trackSections.flatMap(section => section.tracks); - - album.ownTrackData = - trackRefs.map(ref => - find.track(ref, wikiData.trackData, {mode: 'error'})); - } - } } customLinkWikiDataArrays(wikiData); @@ -70,3 +55,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}; +} |