Move code to test helpers

This commit is contained in:
Adria Navarro 2024-01-31 14:20:49 +01:00
parent 786acaa121
commit de4d7d95c3
2 changed files with 60 additions and 55 deletions

View File

@ -15,7 +15,6 @@ jest.mock("@budibase/handlebars-helpers/lib/uuid", () => {
} }
}) })
const fs = require("fs")
const { const {
processString, processString,
convertToJS, convertToJS,
@ -25,6 +24,7 @@ const {
const tk = require("timekeeper") const tk = require("timekeeper")
const { getJsHelperList } = require("../src/helpers") const { getJsHelperList } = require("../src/helpers")
const { getParsedManifest } = require("./utils")
tk.freeze("2021-01-21T12:00:00") tk.freeze("2021-01-21T12:00:00")
@ -32,64 +32,16 @@ const processJS = (js, context) => {
return processStringSync(encodeJSBinding(js), context) return processStringSync(encodeJSBinding(js), context)
} }
const manifest = JSON.parse(
fs.readFileSync(require.resolve("../manifest.json"), "utf8")
)
const collections = Object.keys(manifest)
const examples = collections.reduce((acc, collection) => {
const functions = Object.entries(manifest[collection])
.filter(([_, details]) => details.example)
.map(([name, details]) => {
const example = details.example
let [hbs, js] = example.split("->").map(x => x.trim())
if (!js) {
// The function has no return value
return
}
// Trim 's
js = js.replace(/^\'|\'$/g, "")
if ((parsedExpected = tryParseJson(js))) {
if (Array.isArray(parsedExpected)) {
if (typeof parsedExpected[0] === "object") {
js = JSON.stringify(parsedExpected)
} else {
js = parsedExpected.join(",")
}
}
}
const requiresHbsBody = details.requiresBlock
return [name, { hbs, js, requiresHbsBody }]
})
.filter(x => !!x)
if (Object.keys(functions).length) {
acc[collection] = functions
}
return acc
}, {})
function escapeRegExp(string) { function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // $& means the whole matched string return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // $& means the whole matched string
} }
function tryParseJson(str) {
if (typeof str !== "string") {
return
}
try {
return JSON.parse(str.replace(/\'/g, '"'))
} catch (e) {
return
}
}
describe("manifest", () => { describe("manifest", () => {
const manifest = getParsedManifest()
describe("examples are valid", () => { describe("examples are valid", () => {
describe.each(Object.keys(examples))("%s", collection => { describe.each(Object.keys(manifest))("%s", collection => {
it.each(examples[collection])("%s", async (_, { hbs, js }) => { it.each(manifest[collection])("%s", async (_, { hbs, js }) => {
const context = { const context = {
double: i => i * 2, double: i => i * 2,
isString: x => typeof x === "string", isString: x => typeof x === "string",
@ -110,8 +62,8 @@ describe("manifest", () => {
describe("can be parsed and run as js", () => { describe("can be parsed and run as js", () => {
const jsHelpers = getJsHelperList() const jsHelpers = getJsHelperList()
const jsExamples = Object.keys(examples).reduce((acc, v) => { const jsExamples = Object.keys(manifest).reduce((acc, v) => {
acc[v] = examples[v].filter(([key]) => jsHelpers[key]) acc[v] = manifest[v].filter(([key]) => jsHelpers[key])
return acc return acc
}, {}) }, {})

View File

@ -0,0 +1,53 @@
const { getManifest } = require("../src")
function tryParseJson(str) {
if (typeof str !== "string") {
return
}
try {
return JSON.parse(str.replace(/\'/g, '"'))
} catch (e) {
return
}
}
module.exports.getParsedManifest = () => {
const manifest = getManifest()
const collections = Object.keys(manifest)
const examples = collections.reduce((acc, collection) => {
const functions = Object.entries(manifest[collection])
.filter(([_, details]) => details.example)
.map(([name, details]) => {
const example = details.example
let [hbs, js] = example.split("->").map(x => x.trim())
if (!js) {
// The function has no return value
return
}
// Trim 's
js = js.replace(/^\'|\'$/g, "")
let parsedExpected
if ((parsedExpected = tryParseJson(js))) {
if (Array.isArray(parsedExpected)) {
if (typeof parsedExpected[0] === "object") {
js = JSON.stringify(parsedExpected)
} else {
js = parsedExpected.join(",")
}
}
}
const requiresHbsBody = details.requiresBlock
return [name, { hbs, js, requiresHbsBody }]
})
.filter(x => !!x)
if (Object.keys(functions).length) {
acc[collection] = functions
}
return acc
}, {})
return examples
}