aboutsummaryrefslogtreecommitdiff
path: root/dev/lib/handlebars/src/spec/index.strict.test.ts
diff options
context:
space:
mode:
authorDarius Jahandarie <djahandarie@gmail.com>2023-11-04 18:45:57 +0900
committerDarius Jahandarie <djahandarie@gmail.com>2023-11-04 18:45:57 +0900
commitef79eab44bfd000792c610b968b5ceefd41e76a0 (patch)
tree48b04f30f6248caedbd880801aa49402a9e8066a /dev/lib/handlebars/src/spec/index.strict.test.ts
parent376151096431d4362e4baaacf0cef4a534e169f7 (diff)
Modernize codebase
- Use ES modules - Remove vendored libs and build them from npm using esbuild - Switch from JSZip to zip.js
Diffstat (limited to 'dev/lib/handlebars/src/spec/index.strict.test.ts')
-rw-r--r--dev/lib/handlebars/src/spec/index.strict.test.ts164
1 files changed, 164 insertions, 0 deletions
diff --git a/dev/lib/handlebars/src/spec/index.strict.test.ts b/dev/lib/handlebars/src/spec/index.strict.test.ts
new file mode 100644
index 00000000..a8f294b9
--- /dev/null
+++ b/dev/lib/handlebars/src/spec/index.strict.test.ts
@@ -0,0 +1,164 @@
+/*
+ * This file is forked from the handlebars project (https://github.com/handlebars-lang/handlebars.js),
+ * and may include modifications made by Elasticsearch B.V.
+ * Elasticsearch B.V. licenses this file to you under the MIT License.
+ * See `packages/kbn-handlebars/LICENSE` for more information.
+ */
+
+import { expectTemplate } from '../__jest__/test_bench';
+
+describe('strict', () => {
+ describe('strict mode', () => {
+ it('should error on missing property lookup', () => {
+ expectTemplate('{{hello}}')
+ .withCompileOptions({ strict: true })
+ .toThrow(/"hello" not defined in/);
+ });
+
+ it('should error on missing child', () => {
+ expectTemplate('{{hello.bar}}')
+ .withCompileOptions({ strict: true })
+ .withInput({ hello: { bar: 'foo' } })
+ .toCompileTo('foo');
+
+ expectTemplate('{{hello.bar}}')
+ .withCompileOptions({ strict: true })
+ .withInput({ hello: {} })
+ .toThrow(/"bar" not defined in/);
+ });
+
+ it('should handle explicit undefined', () => {
+ expectTemplate('{{hello.bar}}')
+ .withCompileOptions({ strict: true })
+ .withInput({ hello: { bar: undefined } })
+ .toCompileTo('');
+ });
+
+ it('should error on missing property lookup in known helpers mode', () => {
+ expectTemplate('{{hello}}')
+ .withCompileOptions({
+ strict: true,
+ knownHelpersOnly: true,
+ })
+ .toThrow(/"hello" not defined in/);
+ });
+
+ it('should error on missing context', () => {
+ expectTemplate('{{hello}}').withCompileOptions({ strict: true }).toThrow(Error);
+ });
+
+ it('should error on missing data lookup', () => {
+ const xt = expectTemplate('{{@hello}}').withCompileOptions({
+ strict: true,
+ });
+
+ xt.toThrow(Error);
+
+ xt.withRuntimeOptions({ data: { hello: 'foo' } }).toCompileTo('foo');
+ });
+
+ it('should not run helperMissing for helper calls', () => {
+ expectTemplate('{{hello foo}}')
+ .withCompileOptions({ strict: true })
+ .withInput({ foo: true })
+ .toThrow(/"hello" not defined in/);
+
+ expectTemplate('{{#hello foo}}{{/hello}}')
+ .withCompileOptions({ strict: true })
+ .withInput({ foo: true })
+ .toThrow(/"hello" not defined in/);
+ });
+
+ it('should throw on ambiguous blocks', () => {
+ expectTemplate('{{#hello}}{{/hello}}')
+ .withCompileOptions({ strict: true })
+ .toThrow(/"hello" not defined in/);
+
+ expectTemplate('{{^hello}}{{/hello}}')
+ .withCompileOptions({ strict: true })
+ .toThrow(/"hello" not defined in/);
+
+ expectTemplate('{{#hello.bar}}{{/hello.bar}}')
+ .withCompileOptions({ strict: true })
+ .withInput({ hello: {} })
+ .toThrow(/"bar" not defined in/);
+ });
+
+ it('should allow undefined parameters when passed to helpers', () => {
+ expectTemplate('{{#unless foo}}success{{/unless}}')
+ .withCompileOptions({ strict: true })
+ .toCompileTo('success');
+ });
+
+ it('should allow undefined hash when passed to helpers', () => {
+ expectTemplate('{{helper value=@foo}}')
+ .withCompileOptions({
+ strict: true,
+ })
+ .withHelpers({
+ helper(options) {
+ expect('value' in options.hash).toEqual(true);
+ expect(options.hash.value).toBeUndefined();
+ return 'success';
+ },
+ })
+ .toCompileTo('success');
+ });
+
+ it('should show error location on missing property lookup', () => {
+ expectTemplate('\n\n\n {{hello}}')
+ .withCompileOptions({ strict: true })
+ .toThrow('"hello" not defined in [object Object] - 4:5');
+ });
+
+ it('should error contains correct location properties on missing property lookup', () => {
+ try {
+ expectTemplate('\n\n\n {{hello}}')
+ .withCompileOptions({ strict: true })
+ .toCompileTo('throw before asserting this');
+ } catch (error) {
+ expect(error.lineNumber).toEqual(4);
+ expect(error.endLineNumber).toEqual(4);
+ expect(error.column).toEqual(5);
+ expect(error.endColumn).toEqual(10);
+ }
+ });
+ });
+
+ describe('assume objects', () => {
+ it('should ignore missing property', () => {
+ expectTemplate('{{hello}}').withCompileOptions({ assumeObjects: true }).toCompileTo('');
+ });
+
+ it('should ignore missing child', () => {
+ expectTemplate('{{hello.bar}}')
+ .withCompileOptions({ assumeObjects: true })
+ .withInput({ hello: {} })
+ .toCompileTo('');
+ });
+
+ it('should error on missing object', () => {
+ expectTemplate('{{hello.bar}}').withCompileOptions({ assumeObjects: true }).toThrow(Error);
+ });
+
+ it('should error on missing context', () => {
+ expectTemplate('{{hello}}')
+ .withCompileOptions({ assumeObjects: true })
+ .withInput(undefined)
+ .toThrow(Error);
+ });
+
+ it('should error on missing data lookup', () => {
+ expectTemplate('{{@hello.bar}}')
+ .withCompileOptions({ assumeObjects: true })
+ .withInput(undefined)
+ .toThrow(Error);
+ });
+
+ it('should execute blockHelperMissing', () => {
+ expectTemplate('{{^hello}}foo{{/hello}}')
+ .withCompileOptions({ assumeObjects: true })
+ .toCompileTo('foo');
+ });
+ });
+});