1
0
mirror of synced 2025-12-23 11:54:18 -05:00
Files
docs/tests/helpers/data-directory.js
2022-11-10 13:17:18 +00:00

89 lines
2.5 KiB
JavaScript

import fs from 'fs'
import os from 'os'
import path from 'path'
import yaml from 'js-yaml'
// This helper class exists so you can create a temporary root directory
// full of data files.
// For example, if you want to unit test with files that are not part
// of the git repo but should only "temporarily" exist for the duration
// of the tests.
// This class takes an object and generates that as files on disk. E.g.
//
// const dataDirectory = new DataDirectory({
// data: {
// reusables: {
// example: 'a rose by any other name\nwould smell as sweet',
// },
// },
// })
// process.env.ROOT = dataDirectory.root
// ...
// try {
// ...unit tests here...
// } finally {
// dataDirectory.destroy()
// }
//
// Note that it's very specific about keys. For example, if the nested
// object has a key called 'ui' it doesn't create a depper nested structure
// but takes the nested structure and writes it to a single .yml file.
// For example:
//
// const dataDirectory = new DataDirectory({
// data: {
// ui: {
// key: "Value",
// deep: {
// er: "Stuff"
//
// will create a single <tempdir>/data/ui.yml file.
//
export class DataDirectory {
constructor(data, root) {
this.root = root || this.createTempRoot('data-directory')
this.create(data)
}
createTempRoot(prefix) {
const fullPath = path.join(os.tmpdir(), prefix)
return fs.mkdtempSync(fullPath)
}
create(data, root = null, isVariables = false, isReusables = false) {
const here = root || this.root
for (const [key, value] of Object.entries(data)) {
if (isReusables) {
if (typeof value === 'string') {
fs.writeFileSync(path.join(here, `${key}.md`), value, 'utf-8')
} else {
fs.mkdirSync(path.join(here, key))
this.create(value, path.join(here, key), false, true)
}
} else if (isVariables) {
fs.writeFileSync(path.join(here, `${key}.yml`), yaml.dump(value), 'utf-8')
} else {
if (key === 'ui') {
fs.writeFileSync(path.join(here, `${key}.yml`), yaml.dump(value), 'utf-8')
} else {
const there = path.join(here, key)
fs.mkdirSync(there)
if (key === 'reusables') {
this.create(value, there, false, true)
} else if (key === 'variables') {
this.create(value, there, true, false)
} else {
this.create(value, there)
}
}
}
}
}
destroy() {
fs.rmSync(this.root, { recursive: true })
}
}