Merge pull request #12844 from Budibase/add-string-templates-tests
Add string templates handlebars tests
This commit is contained in:
commit
38404653f0
|
@ -1196,7 +1196,7 @@
|
||||||
"durationType"
|
"durationType"
|
||||||
],
|
],
|
||||||
"numArgs": 2,
|
"numArgs": 2,
|
||||||
"example": "{{duration timeLeft \"seconds\"}} -> a few seconds",
|
"example": "{{duration 8 \"seconds\"}} -> a few seconds",
|
||||||
"description": "<p>Produce a humanized duration left/until given an amount of time and the type of time measurement.</p>\n"
|
"description": "<p>Produce a humanized duration left/until given an amount of time and the type of time measurement.</p>\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ const ADDED_HELPERS = {
|
||||||
duration: {
|
duration: {
|
||||||
args: ["time", "durationType"],
|
args: ["time", "durationType"],
|
||||||
numArgs: 2,
|
numArgs: 2,
|
||||||
example: '{{duration timeLeft "seconds"}} -> a few seconds',
|
example: '{{duration 8 "seconds"}} -> a few seconds',
|
||||||
description:
|
description:
|
||||||
"Produce a humanized duration left/until given an amount of time and the type of time measurement.",
|
"Produce a humanized duration left/until given an amount of time and the type of time measurement.",
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
jest.mock("@budibase/handlebars-helpers/lib/math", () => {
|
||||||
|
const actual = jest.requireActual("@budibase/handlebars-helpers/lib/math")
|
||||||
|
|
||||||
|
return {
|
||||||
|
...actual,
|
||||||
|
random: () => 10,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
jest.mock("@budibase/handlebars-helpers/lib/uuid", () => {
|
||||||
|
const actual = jest.requireActual("@budibase/handlebars-helpers/lib/uuid")
|
||||||
|
|
||||||
|
return {
|
||||||
|
...actual,
|
||||||
|
uuid: () => "f34ebc66-93bd-4f7c-b79b-92b5569138bc",
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const fs = require("fs")
|
||||||
|
const { processString } = require("../src/index.cjs")
|
||||||
|
|
||||||
|
const tk = require("timekeeper")
|
||||||
|
tk.freeze("2021-01-21T12:00:00")
|
||||||
|
|
||||||
|
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.keys(manifest[collection]).filter(
|
||||||
|
fnc => manifest[collection][fnc].example
|
||||||
|
)
|
||||||
|
if (functions.length) {
|
||||||
|
acc[collection] = functions
|
||||||
|
}
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
|
||||||
|
function escapeRegExp(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("examples are valid", () => {
|
||||||
|
describe.each(Object.keys(examples))("%s", collection => {
|
||||||
|
it.each(examples[collection])("%s", async func => {
|
||||||
|
const example = manifest[collection][func].example
|
||||||
|
|
||||||
|
let [hbs, js] = example.split("->").map(x => x.trim())
|
||||||
|
|
||||||
|
const context = {
|
||||||
|
double: i => i * 2,
|
||||||
|
isString: x => typeof x === "string",
|
||||||
|
}
|
||||||
|
|
||||||
|
const arrays = hbs.match(/\[[^/\]]+\]/)
|
||||||
|
arrays?.forEach((arrayString, i) => {
|
||||||
|
hbs = hbs.replace(new RegExp(escapeRegExp(arrayString)), `array${i}`)
|
||||||
|
context[`array${i}`] = JSON.parse(arrayString.replace(/\'/g, '"'))
|
||||||
|
})
|
||||||
|
|
||||||
|
if (js === undefined) {
|
||||||
|
// The function has no return value
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = await processString(hbs, context)
|
||||||
|
// 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(",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = result.replace(/ /g, " ")
|
||||||
|
expect(result).toEqual(js)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue