aboutsummaryrefslogtreecommitdiff
path: root/dev/lib/handlebars/src/spec/index.partials.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dev/lib/handlebars/src/spec/index.partials.test.ts')
-rw-r--r--dev/lib/handlebars/src/spec/index.partials.test.ts591
1 files changed, 0 insertions, 591 deletions
diff --git a/dev/lib/handlebars/src/spec/index.partials.test.ts b/dev/lib/handlebars/src/spec/index.partials.test.ts
deleted file mode 100644
index 65930d06..00000000
--- a/dev/lib/handlebars/src/spec/index.partials.test.ts
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * 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 Handlebars from '../..';
-import { expectTemplate, forEachCompileFunctionName } from '../__jest__/test_bench';
-
-describe('partials', () => {
- it('basic partials', () => {
- const string = 'Dudes: {{#dudes}}{{> dude}}{{/dudes}}';
- const partial = '{{name}} ({{url}}) ';
- const hash = {
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- };
-
- expectTemplate(string)
- .withInput(hash)
- .withPartials({ dude: partial })
- .toCompileTo('Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
-
- expectTemplate(string)
- .withInput(hash)
- .withPartials({ dude: partial })
- .withRuntimeOptions({ data: false })
- .withCompileOptions({ data: false })
- .toCompileTo('Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
- });
-
- it('dynamic partials', () => {
- const string = 'Dudes: {{#dudes}}{{> (partial)}}{{/dudes}}';
- const partial = '{{name}} ({{url}}) ';
- const hash = {
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- };
- const helpers = {
- partial: () => 'dude',
- };
-
- expectTemplate(string)
- .withInput(hash)
- .withHelpers(helpers)
- .withPartials({ dude: partial })
- .toCompileTo('Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
-
- expectTemplate(string)
- .withInput(hash)
- .withHelpers(helpers)
- .withPartials({ dude: partial })
- .withRuntimeOptions({ data: false })
- .withCompileOptions({ data: false })
- .toCompileTo('Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
- });
-
- it('failing dynamic partials', () => {
- expectTemplate('Dudes: {{#dudes}}{{> (partial)}}{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withHelper('partial', () => 'missing')
- .withPartial('dude', '{{name}} ({{url}}) ')
- .toThrow('The partial missing could not be found'); // TODO: Is there a way we can test that the error is of type `Handlebars.Exception`?
- });
-
- it('partials with context', () => {
- expectTemplate('Dudes: {{>dude dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartial('dude', '{{#this}}{{name}} ({{url}}) {{/this}}')
- .toCompileTo('Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
- });
-
- it('partials with no context', () => {
- const partial = '{{name}} ({{url}}) ';
- const hash = {
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- };
-
- expectTemplate('Dudes: {{#dudes}}{{>dude}}{{/dudes}}')
- .withInput(hash)
- .withPartial('dude', partial)
- .withCompileOptions({ explicitPartialContext: true })
- .toCompileTo('Dudes: () () ');
-
- expectTemplate('Dudes: {{#dudes}}{{>dude name="foo"}}{{/dudes}}')
- .withInput(hash)
- .withPartial('dude', partial)
- .withCompileOptions({ explicitPartialContext: true })
- .toCompileTo('Dudes: foo () foo () ');
- });
-
- it('partials with string context', () => {
- expectTemplate('Dudes: {{>dude "dudes"}}')
- .withPartial('dude', '{{.}}')
- .toCompileTo('Dudes: dudes');
- });
-
- it('partials with undefined context', () => {
- expectTemplate('Dudes: {{>dude dudes}}')
- .withPartial('dude', '{{foo}} Empty')
- .toCompileTo('Dudes: Empty');
- });
-
- it('partials with duplicate parameters', () => {
- expectTemplate('Dudes: {{>dude dudes foo bar=baz}}').toThrow(
- 'Unsupported number of partial arguments: 2 - 1:7'
- );
- });
-
- it('partials with parameters', () => {
- expectTemplate('Dudes: {{#dudes}}{{> dude others=..}}{{/dudes}}')
- .withInput({
- foo: 'bar',
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartial('dude', '{{others.foo}}{{name}} ({{url}}) ')
- .toCompileTo('Dudes: barYehuda (http://yehuda) barAlan (http://alan) ');
- });
-
- it('partial in a partial', () => {
- expectTemplate('Dudes: {{#dudes}}{{>dude}}{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartials({
- dude: '{{name}} {{> url}} ',
- url: '<a href="{{url}}">{{url}}</a>',
- })
- .toCompileTo(
- 'Dudes: Yehuda <a href="http://yehuda">http://yehuda</a> Alan <a href="http://alan">http://alan</a> '
- );
- });
-
- it('rendering undefined partial throws an exception', () => {
- expectTemplate('{{> whatever}}').toThrow('The partial whatever could not be found');
- });
-
- it('registering undefined partial throws an exception', () => {
- global.kbnHandlebarsEnv = Handlebars.create();
-
- expect(() => {
- kbnHandlebarsEnv!.registerPartial('undefined_test', undefined as any);
- }).toThrow('Attempting to register a partial called "undefined_test" as undefined');
-
- global.kbnHandlebarsEnv = null;
- });
-
- it('rendering template partial in vm mode throws an exception', () => {
- expectTemplate('{{> whatever}}').toThrow('The partial whatever could not be found');
- });
-
- it('rendering function partial in vm mode', () => {
- function partial(context: any) {
- return context.name + ' (' + context.url + ') ';
- }
- expectTemplate('Dudes: {{#dudes}}{{> dude}}{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartial('dude', partial)
- .toCompileTo('Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
- });
-
- it('GH-14: a partial preceding a selector', () => {
- expectTemplate('Dudes: {{>dude}} {{anotherDude}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('dude', '{{name}}')
- .toCompileTo('Dudes: Jeepers Creepers');
- });
-
- it('Partials with slash paths', () => {
- expectTemplate('Dudes: {{> shared/dude}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('shared/dude', '{{name}}')
- .toCompileTo('Dudes: Jeepers');
- });
-
- it('Partials with slash and point paths', () => {
- expectTemplate('Dudes: {{> shared/dude.thing}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('shared/dude.thing', '{{name}}')
- .toCompileTo('Dudes: Jeepers');
- });
-
- it('Global Partials', () => {
- global.kbnHandlebarsEnv = Handlebars.create();
-
- kbnHandlebarsEnv!.registerPartial('globalTest', '{{anotherDude}}');
-
- expectTemplate('Dudes: {{> shared/dude}} {{> globalTest}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('shared/dude', '{{name}}')
- .toCompileTo('Dudes: Jeepers Creepers');
-
- kbnHandlebarsEnv!.unregisterPartial('globalTest');
- expect(kbnHandlebarsEnv!.partials.globalTest).toBeUndefined();
-
- global.kbnHandlebarsEnv = null;
- });
-
- it('Multiple partial registration', () => {
- global.kbnHandlebarsEnv = Handlebars.create();
-
- kbnHandlebarsEnv!.registerPartial({
- 'shared/dude': '{{name}}',
- globalTest: '{{anotherDude}}',
- });
-
- expectTemplate('Dudes: {{> shared/dude}} {{> globalTest}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('notused', 'notused') // trick the test bench into running with partials enabled
- .toCompileTo('Dudes: Jeepers Creepers');
-
- global.kbnHandlebarsEnv = null;
- });
-
- it('Partials with integer path', () => {
- expectTemplate('Dudes: {{> 404}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial(404, '{{name}}')
- .toCompileTo('Dudes: Jeepers');
- });
-
- it('Partials with complex path', () => {
- expectTemplate('Dudes: {{> 404/asdf?.bar}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('404/asdf?.bar', '{{name}}')
- .toCompileTo('Dudes: Jeepers');
- });
-
- it('Partials with escaped', () => {
- expectTemplate('Dudes: {{> [+404/asdf?.bar]}}')
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('+404/asdf?.bar', '{{name}}')
- .toCompileTo('Dudes: Jeepers');
- });
-
- it('Partials with string', () => {
- expectTemplate("Dudes: {{> '+404/asdf?.bar'}}")
- .withInput({ name: 'Jeepers', anotherDude: 'Creepers' })
- .withPartial('+404/asdf?.bar', '{{name}}')
- .toCompileTo('Dudes: Jeepers');
- });
-
- it('should handle empty partial', () => {
- expectTemplate('Dudes: {{#dudes}}{{> dude}}{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartial('dude', '')
- .toCompileTo('Dudes: ');
- });
-
- // Skipping test as this only makes sense when there's no `compile` function (i.e. runtime-only mode).
- // We do not support that mode with `@kbn/handlebars`, so there's no need to test it
- it.skip('throw on missing partial', () => {
- const handlebars = Handlebars.create();
- (handlebars.compile as any) = undefined;
- const template = handlebars.precompile('{{> dude}}');
- const render = handlebars.template(eval('(' + template + ')')); // eslint-disable-line no-eval
- expect(() => {
- render(
- {},
- {
- partials: {
- dude: 'fail',
- },
- }
- );
- }).toThrow(/The partial dude could not be compiled/);
- });
-
- describe('partial blocks', () => {
- it('should render partial block as default', () => {
- expectTemplate('{{#> dude}}success{{/dude}}').toCompileTo('success');
- });
-
- it('should execute default block with proper context', () => {
- expectTemplate('{{#> dude context}}{{value}}{{/dude}}')
- .withInput({ context: { value: 'success' } })
- .toCompileTo('success');
- });
-
- it('should propagate block parameters to default block', () => {
- expectTemplate('{{#with context as |me|}}{{#> dude}}{{me.value}}{{/dude}}{{/with}}')
- .withInput({ context: { value: 'success' } })
- .toCompileTo('success');
- });
-
- it('should not use partial block if partial exists', () => {
- expectTemplate('{{#> dude}}fail{{/dude}}')
- .withPartials({ dude: 'success' })
- .toCompileTo('success');
- });
-
- it('should render block from partial', () => {
- expectTemplate('{{#> dude}}success{{/dude}}')
- .withPartials({ dude: '{{> @partial-block }}' })
- .toCompileTo('success');
- });
-
- it('should be able to render the partial-block twice', () => {
- expectTemplate('{{#> dude}}success{{/dude}}')
- .withPartials({ dude: '{{> @partial-block }} {{> @partial-block }}' })
- .toCompileTo('success success');
- });
-
- it('should render block from partial with context', () => {
- expectTemplate('{{#> dude}}{{value}}{{/dude}}')
- .withInput({ context: { value: 'success' } })
- .withPartials({
- dude: '{{#with context}}{{> @partial-block }}{{/with}}',
- })
- .toCompileTo('success');
- });
-
- it('should be able to access the @data frame from a partial-block', () => {
- expectTemplate('{{#> dude}}in-block: {{@root/value}}{{/dude}}')
- .withInput({ value: 'success' })
- .withPartials({
- dude: '<code>before-block: {{@root/value}} {{> @partial-block }}</code>',
- })
- .toCompileTo('<code>before-block: success in-block: success</code>');
- });
-
- it('should allow the #each-helper to be used along with partial-blocks', () => {
- expectTemplate('<template>{{#> list value}}value = {{.}}{{/list}}</template>')
- .withInput({
- value: ['a', 'b', 'c'],
- })
- .withPartials({
- list: '<list>{{#each .}}<item>{{> @partial-block}}</item>{{/each}}</list>',
- })
- .toCompileTo(
- '<template><list><item>value = a</item><item>value = b</item><item>value = c</item></list></template>'
- );
- });
-
- it('should render block from partial with context (twice)', () => {
- expectTemplate('{{#> dude}}{{value}}{{/dude}}')
- .withInput({ context: { value: 'success' } })
- .withPartials({
- dude: '{{#with context}}{{> @partial-block }} {{> @partial-block }}{{/with}}',
- })
- .toCompileTo('success success');
- });
-
- it('should render block from partial with context [2]', () => {
- expectTemplate('{{#> dude}}{{../context/value}}{{/dude}}')
- .withInput({ context: { value: 'success' } })
- .withPartials({
- dude: '{{#with context}}{{> @partial-block }}{{/with}}',
- })
- .toCompileTo('success');
- });
-
- it('should render block from partial with block params', () => {
- expectTemplate('{{#with context as |me|}}{{#> dude}}{{me.value}}{{/dude}}{{/with}}')
- .withInput({ context: { value: 'success' } })
- .withPartials({ dude: '{{> @partial-block }}' })
- .toCompileTo('success');
- });
-
- it('should render nested partial blocks', () => {
- expectTemplate('<template>{{#> outer}}{{value}}{{/outer}}</template>')
- .withInput({ value: 'success' })
- .withPartials({
- outer:
- '<outer>{{#> nested}}<outer-block>{{> @partial-block}}</outer-block>{{/nested}}</outer>',
- nested: '<nested>{{> @partial-block}}</nested>',
- })
- .toCompileTo(
- '<template><outer><nested><outer-block>success</outer-block></nested></outer></template>'
- );
- });
-
- it('should render nested partial blocks at different nesting levels', () => {
- expectTemplate('<template>{{#> outer}}{{value}}{{/outer}}</template>')
- .withInput({ value: 'success' })
- .withPartials({
- outer:
- '<outer>{{#> nested}}<outer-block>{{> @partial-block}}</outer-block>{{/nested}}{{> @partial-block}}</outer>',
- nested: '<nested>{{> @partial-block}}</nested>',
- })
- .toCompileTo(
- '<template><outer><nested><outer-block>success</outer-block></nested>success</outer></template>'
- );
- });
-
- it('should render nested partial blocks at different nesting levels (twice)', () => {
- expectTemplate('<template>{{#> outer}}{{value}}{{/outer}}</template>')
- .withInput({ value: 'success' })
- .withPartials({
- outer:
- '<outer>{{#> nested}}<outer-block>{{> @partial-block}} {{> @partial-block}}</outer-block>{{/nested}}{{> @partial-block}}+{{> @partial-block}}</outer>',
- nested: '<nested>{{> @partial-block}}</nested>',
- })
- .toCompileTo(
- '<template><outer><nested><outer-block>success success</outer-block></nested>success+success</outer></template>'
- );
- });
-
- it('should render nested partial blocks (twice at each level)', () => {
- expectTemplate('<template>{{#> outer}}{{value}}{{/outer}}</template>')
- .withInput({ value: 'success' })
- .withPartials({
- outer:
- '<outer>{{#> nested}}<outer-block>{{> @partial-block}} {{> @partial-block}}</outer-block>{{/nested}}</outer>',
- nested: '<nested>{{> @partial-block}}{{> @partial-block}}</nested>',
- })
- .toCompileTo(
- '<template><outer>' +
- '<nested><outer-block>success success</outer-block><outer-block>success success</outer-block></nested>' +
- '</outer></template>'
- );
- });
- });
-
- describe('inline partials', () => {
- it('should define inline partials for template', () => {
- expectTemplate('{{#*inline "myPartial"}}success{{/inline}}{{> myPartial}}').toCompileTo(
- 'success'
- );
- });
-
- it('should overwrite multiple partials in the same template', () => {
- expectTemplate(
- '{{#*inline "myPartial"}}fail{{/inline}}{{#*inline "myPartial"}}success{{/inline}}{{> myPartial}}'
- ).toCompileTo('success');
- });
-
- it('should define inline partials for block', () => {
- expectTemplate(
- '{{#with .}}{{#*inline "myPartial"}}success{{/inline}}{{> myPartial}}{{/with}}'
- ).toCompileTo('success');
-
- expectTemplate(
- '{{#with .}}{{#*inline "myPartial"}}success{{/inline}}{{/with}}{{> myPartial}}'
- ).toThrow(/myPartial could not/);
- });
-
- it('should override global partials', () => {
- expectTemplate('{{#*inline "myPartial"}}success{{/inline}}{{> myPartial}}')
- .withPartials({
- myPartial: () => 'fail',
- })
- .toCompileTo('success');
- });
-
- it('should override template partials', () => {
- expectTemplate(
- '{{#*inline "myPartial"}}fail{{/inline}}{{#with .}}{{#*inline "myPartial"}}success{{/inline}}{{> myPartial}}{{/with}}'
- ).toCompileTo('success');
- });
-
- it('should override partials down the entire stack', () => {
- expectTemplate(
- '{{#with .}}{{#*inline "myPartial"}}success{{/inline}}{{#with .}}{{#with .}}{{> myPartial}}{{/with}}{{/with}}{{/with}}'
- ).toCompileTo('success');
- });
-
- it('should define inline partials for partial call', () => {
- expectTemplate('{{#*inline "myPartial"}}success{{/inline}}{{> dude}}')
- .withPartials({ dude: '{{> myPartial }}' })
- .toCompileTo('success');
- });
-
- it('should define inline partials in partial block call', () => {
- expectTemplate('{{#> dude}}{{#*inline "myPartial"}}success{{/inline}}{{/dude}}')
- .withPartials({ dude: '{{> myPartial }}' })
- .toCompileTo('success');
- });
-
- it('should render nested inline partials', () => {
- expectTemplate(
- '{{#*inline "outer"}}{{#>inner}}<outer-block>{{>@partial-block}}</outer-block>{{/inner}}{{/inline}}' +
- '{{#*inline "inner"}}<inner>{{>@partial-block}}</inner>{{/inline}}' +
- '{{#>outer}}{{value}}{{/outer}}'
- )
- .withInput({ value: 'success' })
- .toCompileTo('<inner><outer-block>success</outer-block></inner>');
- });
-
- it('should render nested inline partials with partial-blocks on different nesting levels', () => {
- expectTemplate(
- '{{#*inline "outer"}}{{#>inner}}<outer-block>{{>@partial-block}}</outer-block>{{/inner}}{{>@partial-block}}{{/inline}}' +
- '{{#*inline "inner"}}<inner>{{>@partial-block}}</inner>{{/inline}}' +
- '{{#>outer}}{{value}}{{/outer}}'
- )
- .withInput({ value: 'success' })
- .toCompileTo('<inner><outer-block>success</outer-block></inner>success');
- });
-
- it('should render nested inline partials (twice at each level)', () => {
- expectTemplate(
- '{{#*inline "outer"}}{{#>inner}}<outer-block>{{>@partial-block}} {{>@partial-block}}</outer-block>{{/inner}}{{/inline}}' +
- '{{#*inline "inner"}}<inner>{{>@partial-block}}{{>@partial-block}}</inner>{{/inline}}' +
- '{{#>outer}}{{value}}{{/outer}}'
- )
- .withInput({ value: 'success' })
- .toCompileTo(
- '<inner><outer-block>success success</outer-block><outer-block>success success</outer-block></inner>'
- );
- });
- });
-
- forEachCompileFunctionName((compileName) => {
- it(`should pass compiler flags for ${compileName} function`, () => {
- const env = Handlebars.create();
- env.registerPartial('partial', '{{foo}}');
- const compile = env[compileName].bind(env);
- const template = compile('{{foo}} {{> partial}}', { noEscape: true });
- expect(template({ foo: '<' })).toEqual('< <');
- });
- });
-
- describe('standalone partials', () => {
- it('indented partials', () => {
- expectTemplate('Dudes:\n{{#dudes}}\n {{>dude}}\n{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartial('dude', '{{name}}\n')
- .toCompileTo('Dudes:\n Yehuda\n Alan\n');
- });
-
- it('nested indented partials', () => {
- expectTemplate('Dudes:\n{{#dudes}}\n {{>dude}}\n{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartials({
- dude: '{{name}}\n {{> url}}',
- url: '{{url}}!\n',
- })
- .toCompileTo('Dudes:\n Yehuda\n http://yehuda!\n Alan\n http://alan!\n');
- });
-
- it('prevent nested indented partials', () => {
- expectTemplate('Dudes:\n{{#dudes}}\n {{>dude}}\n{{/dudes}}')
- .withInput({
- dudes: [
- { name: 'Yehuda', url: 'http://yehuda' },
- { name: 'Alan', url: 'http://alan' },
- ],
- })
- .withPartials({
- dude: '{{name}}\n {{> url}}',
- url: '{{url}}!\n',
- })
- .withCompileOptions({ preventIndent: true })
- .toCompileTo('Dudes:\n Yehuda\n http://yehuda!\n Alan\n http://alan!\n');
- });
- });
-});