diff options
Diffstat (limited to 'dev/lib/handlebars/src/spec/index.builtins.test.ts')
| -rw-r--r-- | dev/lib/handlebars/src/spec/index.builtins.test.ts | 676 | 
1 files changed, 0 insertions, 676 deletions
diff --git a/dev/lib/handlebars/src/spec/index.builtins.test.ts b/dev/lib/handlebars/src/spec/index.builtins.test.ts deleted file mode 100644 index c47ec29f..00000000 --- a/dev/lib/handlebars/src/spec/index.builtins.test.ts +++ /dev/null @@ -1,676 +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. - */ - -/* eslint-disable max-classes-per-file */ - -import Handlebars from '../..'; -import { expectTemplate } from '../__jest__/test_bench'; - -describe('builtin helpers', () => { -  describe('#if', () => { -    it('if', () => { -      const string = '{{#if goodbye}}GOODBYE {{/if}}cruel {{world}}!'; - -      expectTemplate(string) -        .withInput({ -          goodbye: true, -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye: 'dummy', -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye: false, -          world: 'world', -        }) -        .toCompileTo('cruel world!'); - -      expectTemplate(string).withInput({ world: 'world' }).toCompileTo('cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye: ['foo'], -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye: [], -          world: 'world', -        }) -        .toCompileTo('cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye: 0, -          world: 'world', -        }) -        .toCompileTo('cruel world!'); - -      expectTemplate('{{#if goodbye includeZero=true}}GOODBYE {{/if}}cruel {{world}}!') -        .withInput({ -          goodbye: 0, -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); -    }); - -    it('if with function argument', () => { -      const string = '{{#if goodbye}}GOODBYE {{/if}}cruel {{world}}!'; - -      expectTemplate(string) -        .withInput({ -          goodbye() { -            return true; -          }, -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye() { -            return this.world; -          }, -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye() { -            return false; -          }, -          world: 'world', -        }) -        .toCompileTo('cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbye() { -            return this.foo; -          }, -          world: 'world', -        }) -        .toCompileTo('cruel world!'); -    }); - -    it('should not change the depth list', () => { -      expectTemplate('{{#with foo}}{{#if goodbye}}GOODBYE cruel {{../world}}!{{/if}}{{/with}}') -        .withInput({ -          foo: { goodbye: true }, -          world: 'world', -        }) -        .toCompileTo('GOODBYE cruel world!'); -    }); -  }); - -  describe('#with', () => { -    it('with', () => { -      expectTemplate('{{#with person}}{{first}} {{last}}{{/with}}') -        .withInput({ -          person: { -            first: 'Alan', -            last: 'Johnson', -          }, -        }) -        .toCompileTo('Alan Johnson'); -    }); - -    it('with with function argument', () => { -      expectTemplate('{{#with person}}{{first}} {{last}}{{/with}}') -        .withInput({ -          person() { -            return { -              first: 'Alan', -              last: 'Johnson', -            }; -          }, -        }) -        .toCompileTo('Alan Johnson'); -    }); - -    it('with with else', () => { -      expectTemplate( -        '{{#with person}}Person is present{{else}}Person is not present{{/with}}' -      ).toCompileTo('Person is not present'); -    }); - -    it('with provides block parameter', () => { -      expectTemplate('{{#with person as |foo|}}{{foo.first}} {{last}}{{/with}}') -        .withInput({ -          person: { -            first: 'Alan', -            last: 'Johnson', -          }, -        }) -        .toCompileTo('Alan Johnson'); -    }); - -    it('works when data is disabled', () => { -      expectTemplate('{{#with person as |foo|}}{{foo.first}} {{last}}{{/with}}') -        .withInput({ person: { first: 'Alan', last: 'Johnson' } }) -        .withCompileOptions({ data: false }) -        .toCompileTo('Alan Johnson'); -    }); -  }); - -  describe('#each', () => { -    it('each', () => { -      const string = '{{#each goodbyes}}{{text}}! {{/each}}cruel {{world}}!'; - -      expectTemplate(string) -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo('goodbye! Goodbye! GOODBYE! cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbyes: [], -          world: 'world', -        }) -        .toCompileTo('cruel world!'); -    }); - -    it('each without data', () => { -      expectTemplate('{{#each goodbyes}}{{text}}! {{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .withRuntimeOptions({ data: false }) -        .withCompileOptions({ data: false }) -        .toCompileTo('goodbye! Goodbye! GOODBYE! cruel world!'); - -      expectTemplate('{{#each .}}{{.}}{{/each}}') -        .withInput({ goodbyes: 'cruel', world: 'world' }) -        .withRuntimeOptions({ data: false }) -        .withCompileOptions({ data: false }) -        .toCompileTo('cruelworld'); -    }); - -    it('each without context', () => { -      expectTemplate('{{#each goodbyes}}{{text}}! {{/each}}cruel {{world}}!') -        .withInput(undefined) -        .toCompileTo('cruel !'); -    }); - -    it('each with an object and @key', () => { -      const string = '{{#each goodbyes}}{{@key}}. {{text}}! {{/each}}cruel {{world}}!'; - -      function Clazz(this: any) { -        this['<b>#1</b>'] = { text: 'goodbye' }; -        this[2] = { text: 'GOODBYE' }; -      } -      Clazz.prototype.foo = 'fail'; -      const hash = { goodbyes: new (Clazz as any)(), world: 'world' }; - -      // Object property iteration order is undefined according to ECMA spec, -      // so we need to check both possible orders -      // @see http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop -      try { -        expectTemplate(string) -          .withInput(hash) -          .toCompileTo('<b>#1</b>. goodbye! 2. GOODBYE! cruel world!'); -      } catch (e) { -        expectTemplate(string) -          .withInput(hash) -          .toCompileTo('2. GOODBYE! <b>#1</b>. goodbye! cruel world!'); -      } - -      expectTemplate(string) -        .withInput({ -          goodbyes: {}, -          world: 'world', -        }) -        .toCompileTo('cruel world!'); -    }); - -    it('each with @index', () => { -      expectTemplate('{{#each goodbyes}}{{@index}}. {{text}}! {{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo('0. goodbye! 1. Goodbye! 2. GOODBYE! cruel world!'); -    }); - -    it('each with nested @index', () => { -      expectTemplate( -        '{{#each goodbyes}}{{@index}}. {{text}}! {{#each ../goodbyes}}{{@index}} {{/each}}After {{@index}} {{/each}}{{@index}}cruel {{world}}!' -      ) -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo( -          '0. goodbye! 0 1 2 After 0 1. Goodbye! 0 1 2 After 1 2. GOODBYE! 0 1 2 After 2 cruel world!' -        ); -    }); - -    it('each with block params', () => { -      expectTemplate( -        '{{#each goodbyes as |value index|}}{{index}}. {{value.text}}! {{#each ../goodbyes as |childValue childIndex|}} {{index}} {{childIndex}}{{/each}} After {{index}} {{/each}}{{index}}cruel {{world}}!' -      ) -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }], -          world: 'world', -        }) -        .toCompileTo('0. goodbye!  0 0 0 1 After 0 1. Goodbye!  1 0 1 1 After 1 cruel world!'); -    }); - -    // TODO: This test has been added to the `4.x` branch of the handlebars.js repo along with a code-fix, -    // but a new version of the handlebars package containing this fix has not yet been published to npm. -    // -    // Before enabling this code, a new version of handlebars needs to be released and the corresponding -    // updates needs to be applied to this implementation. -    // -    // See: https://github.com/handlebars-lang/handlebars.js/commit/30dbf0478109ded8f12bb29832135d480c17e367 -    it.skip('each with block params and strict compilation', () => { -      expectTemplate('{{#each goodbyes as |value index|}}{{index}}. {{value.text}}!{{/each}}') -        .withCompileOptions({ strict: true }) -        .withInput({ goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }] }) -        .toCompileTo('0. goodbye!1. Goodbye!'); -    }); - -    it('each object with @index', () => { -      expectTemplate('{{#each goodbyes}}{{@index}}. {{text}}! {{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: { -            a: { text: 'goodbye' }, -            b: { text: 'Goodbye' }, -            c: { text: 'GOODBYE' }, -          }, -          world: 'world', -        }) -        .toCompileTo('0. goodbye! 1. Goodbye! 2. GOODBYE! cruel world!'); -    }); - -    it('each with @first', () => { -      expectTemplate('{{#each goodbyes}}{{#if @first}}{{text}}! {{/if}}{{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo('goodbye! cruel world!'); -    }); - -    it('each with nested @first', () => { -      expectTemplate( -        '{{#each goodbyes}}({{#if @first}}{{text}}! {{/if}}{{#each ../goodbyes}}{{#if @first}}{{text}}!{{/if}}{{/each}}{{#if @first}} {{text}}!{{/if}}) {{/each}}cruel {{world}}!' -      ) -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo('(goodbye! goodbye! goodbye!) (goodbye!) (goodbye!) cruel world!'); -    }); - -    it('each object with @first', () => { -      expectTemplate('{{#each goodbyes}}{{#if @first}}{{text}}! {{/if}}{{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: { foo: { text: 'goodbye' }, bar: { text: 'Goodbye' } }, -          world: 'world', -        }) -        .toCompileTo('goodbye! cruel world!'); -    }); - -    it('each with @last', () => { -      expectTemplate('{{#each goodbyes}}{{#if @last}}{{text}}! {{/if}}{{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo('GOODBYE! cruel world!'); -    }); - -    it('each object with @last', () => { -      expectTemplate('{{#each goodbyes}}{{#if @last}}{{text}}! {{/if}}{{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: { foo: { text: 'goodbye' }, bar: { text: 'Goodbye' } }, -          world: 'world', -        }) -        .toCompileTo('Goodbye! cruel world!'); -    }); - -    it('each with nested @last', () => { -      expectTemplate( -        '{{#each goodbyes}}({{#if @last}}{{text}}! {{/if}}{{#each ../goodbyes}}{{#if @last}}{{text}}!{{/if}}{{/each}}{{#if @last}} {{text}}!{{/if}}) {{/each}}cruel {{world}}!' -      ) -        .withInput({ -          goodbyes: [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }], -          world: 'world', -        }) -        .toCompileTo('(GOODBYE!) (GOODBYE!) (GOODBYE! GOODBYE! GOODBYE!) cruel world!'); -    }); - -    it('each with function argument', () => { -      const string = '{{#each goodbyes}}{{text}}! {{/each}}cruel {{world}}!'; - -      expectTemplate(string) -        .withInput({ -          goodbyes() { -            return [{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }]; -          }, -          world: 'world', -        }) -        .toCompileTo('goodbye! Goodbye! GOODBYE! cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbyes: [], -          world: 'world', -        }) -        .toCompileTo('cruel world!'); -    }); - -    it('each object when last key is an empty string', () => { -      expectTemplate('{{#each goodbyes}}{{@index}}. {{text}}! {{/each}}cruel {{world}}!') -        .withInput({ -          goodbyes: { -            a: { text: 'goodbye' }, -            b: { text: 'Goodbye' }, -            '': { text: 'GOODBYE' }, -          }, -          world: 'world', -        }) -        .toCompileTo('0. goodbye! 1. Goodbye! 2. GOODBYE! cruel world!'); -    }); - -    it('data passed to helpers', () => { -      expectTemplate('{{#each letters}}{{this}}{{detectDataInsideEach}}{{/each}}') -        .withInput({ letters: ['a', 'b', 'c'] }) -        .withHelper('detectDataInsideEach', function (options) { -          return options.data && options.data.exclaim; -        }) -        .withRuntimeOptions({ -          data: { -            exclaim: '!', -          }, -        }) -        .toCompileTo('a!b!c!'); -    }); - -    it('each on implicit context', () => { -      expectTemplate('{{#each}}{{text}}! {{/each}}cruel world!').toThrow(Handlebars.Exception); -    }); - -    it('each on iterable', () => { -      class Iterator { -        private arr: any[]; -        private index: number = 0; - -        constructor(arr: any[]) { -          this.arr = arr; -        } - -        next() { -          const value = this.arr[this.index]; -          const done = this.index === this.arr.length; -          if (!done) { -            this.index++; -          } -          return { value, done }; -        } -      } - -      class Iterable { -        private arr: any[]; - -        constructor(arr: any[]) { -          this.arr = arr; -        } - -        [Symbol.iterator]() { -          return new Iterator(this.arr); -        } -      } - -      const string = '{{#each goodbyes}}{{text}}! {{/each}}cruel {{world}}!'; - -      expectTemplate(string) -        .withInput({ -          goodbyes: new Iterable([{ text: 'goodbye' }, { text: 'Goodbye' }, { text: 'GOODBYE' }]), -          world: 'world', -        }) -        .toCompileTo('goodbye! Goodbye! GOODBYE! cruel world!'); - -      expectTemplate(string) -        .withInput({ -          goodbyes: new Iterable([]), -          world: 'world', -        }) -        .toCompileTo('cruel world!'); -    }); -  }); - -  describe('#log', function () { -    /* eslint-disable no-console */ -    let $log: typeof console.log; -    let $info: typeof console.info; -    let $error: typeof console.error; - -    beforeEach(function () { -      $log = console.log; -      $info = console.info; -      $error = console.error; - -      global.kbnHandlebarsEnv = Handlebars.create(); -    }); - -    afterEach(function () { -      console.log = $log; -      console.info = $info; -      console.error = $error; - -      global.kbnHandlebarsEnv = null; -    }); - -    it('should call logger at default level', function () { -      let levelArg; -      let logArg; -      kbnHandlebarsEnv!.log = function (level, arg) { -        levelArg = level; -        logArg = arg; -      }; - -      expectTemplate('{{log blah}}').withInput({ blah: 'whee' }).toCompileTo(''); -      expect(1).toEqual(levelArg); -      expect('whee').toEqual(logArg); -    }); - -    it('should call logger at data level', function () { -      let levelArg; -      let logArg; -      kbnHandlebarsEnv!.log = function (level, arg) { -        levelArg = level; -        logArg = arg; -      }; - -      expectTemplate('{{log blah}}') -        .withInput({ blah: 'whee' }) -        .withRuntimeOptions({ data: { level: '03' } }) -        .withCompileOptions({ data: true }) -        .toCompileTo(''); -      expect('03').toEqual(levelArg); -      expect('whee').toEqual(logArg); -    }); - -    it('should output to info', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      console.info = function (info) { -        expect('whee').toEqual(info); -        calls++; -        if (calls === callsExpected) { -          console.info = $info; -          console.log = $log; -        } -      }; -      console.log = function (log) { -        expect('whee').toEqual(log); -        calls++; -        if (calls === callsExpected) { -          console.info = $info; -          console.log = $log; -        } -      }; - -      expectTemplate('{{log blah}}').withInput({ blah: 'whee' }).toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); - -    it('should log at data level', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      console.error = function (log) { -        expect('whee').toEqual(log); -        calls++; -        if (calls === callsExpected) console.error = $error; -      }; - -      expectTemplate('{{log blah}}') -        .withInput({ blah: 'whee' }) -        .withRuntimeOptions({ data: { level: '03' } }) -        .withCompileOptions({ data: true }) -        .toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); - -    it('should handle missing logger', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      // @ts-expect-error -      console.error = undefined; -      console.log = function (log) { -        expect('whee').toEqual(log); -        calls++; -        if (calls === callsExpected) console.log = $log; -      }; - -      expectTemplate('{{log blah}}') -        .withInput({ blah: 'whee' }) -        .withRuntimeOptions({ data: { level: '03' } }) -        .withCompileOptions({ data: true }) -        .toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); - -    it('should handle string log levels', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      console.error = function (log) { -        expect('whee').toEqual(log); -        calls++; -      }; - -      expectTemplate('{{log blah}}') -        .withInput({ blah: 'whee' }) -        .withRuntimeOptions({ data: { level: 'error' } }) -        .withCompileOptions({ data: true }) -        .toCompileTo(''); -      expect(calls).toEqual(callsExpected); - -      calls = 0; - -      expectTemplate('{{log blah}}') -        .withInput({ blah: 'whee' }) -        .withRuntimeOptions({ data: { level: 'ERROR' } }) -        .withCompileOptions({ data: true }) -        .toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); - -    it('should handle hash log levels [1]', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      console.error = function (log) { -        expect('whee').toEqual(log); -        calls++; -      }; - -      expectTemplate('{{log blah level="error"}}').withInput({ blah: 'whee' }).toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); - -    it('should handle hash log levels [2]', function () { -      let called = false; - -      console.info = -        console.log = -        console.error = -        console.debug = -          function () { -            called = true; -            console.info = console.log = console.error = console.debug = $log; -          }; - -      expectTemplate('{{log blah level="debug"}}').withInput({ blah: 'whee' }).toCompileTo(''); -      expect(false).toEqual(called); -    }); - -    it('should pass multiple log arguments', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      console.info = console.log = function (log1, log2, log3) { -        expect('whee').toEqual(log1); -        expect('foo').toEqual(log2); -        expect(1).toEqual(log3); -        calls++; -        if (calls === callsExpected) console.log = $log; -      }; - -      expectTemplate('{{log blah "foo" 1}}').withInput({ blah: 'whee' }).toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); - -    it('should pass zero log arguments', function () { -      let calls = 0; -      const callsExpected = process.env.AST || process.env.EVAL ? 1 : 2; - -      console.info = console.log = function () { -        expect(arguments.length).toEqual(0); -        calls++; -        if (calls === callsExpected) console.log = $log; -      }; - -      expectTemplate('{{log}}').withInput({ blah: 'whee' }).toCompileTo(''); -      expect(calls).toEqual(callsExpected); -    }); -    /* eslint-enable no-console */ -  }); - -  describe('#lookup', () => { -    it('should lookup arbitrary content', () => { -      expectTemplate('{{#each goodbyes}}{{lookup ../data .}}{{/each}}') -        .withInput({ goodbyes: [0, 1], data: ['foo', 'bar'] }) -        .toCompileTo('foobar'); -    }); - -    it('should not fail on undefined value', () => { -      expectTemplate('{{#each goodbyes}}{{lookup ../bar .}}{{/each}}') -        .withInput({ goodbyes: [0, 1], data: ['foo', 'bar'] }) -        .toCompileTo(''); -    }); -  }); -});  |