import { compile } from 'handlebars' import * as helpers from '../helpers' describe('dotcom-server-handlebars/src/helpers', () => { describe('block helpers', () => { describe('#capture', () => { it('captures the string and assigns it to a variable', () => { const template = compile('{{#capture "myOutput"}}Hello, World!{{/capture}}') const templateData = {} as { [key: string]: any } const result = template(templateData, { helpers }) expect(templateData.myOutput).toBe('Hello, World!') expect(result).toBe('') }) }) describe('#dateformat', () => { const date = new Date('2019-04-10 13:40:21 GMT+0100 (BST)') it('formats as ISO date time by default', () => { const template = compile('{{#dateformat}}{{date}}{{/dateformat}}') const result = template({ date }, { helpers }) expect(result).toBe('2019-04-10T12:40:21Z') }) it('formats using the given format', () => { const template = compile('{{#dateformat "dddd, mmmm d, yyyy"}}{{date}}{{/dateformat}}') const result = template({ date }, { helpers }) expect(result).toBe('Wednesday, April 10, 2019') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#dateformat "" ""}}{{date}}{{/dateformat}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#ifAll', () => { const template = compile('{{#ifAll foo bar baz}}yes{{else}}no{{/ifAll}}') it('outputs the contents when all parameters are truthy', () => { const result = template({ foo: 123, bar: 'abc', baz: true }, { helpers }) expect(result).toBe('yes') }) it('does not output the contents if any parameters are falsy', () => { const result = template({ foo: 123, bar: 'abc', baz: false }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#ifSome}}yes{{/ifSome}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#ifEquals', () => { const template = compile('{{#ifEquals foo bar}}yes{{else}}no{{/ifEquals}}') it('outputs the contents parameters are strictly equal', () => { const result = template({ foo: true, bar: true }, { helpers }) expect(result).toBe('yes') }) it('does not output the contents if any parameter is not strictly equal', () => { const result = template({ foo: true, bar: null }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#ifEquals}}yes{{/ifEquals}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#ifEqualsSome', () => { const template = compile('{{#ifEqualsSome foo bar baz}}yes{{else}}no{{/ifEqualsSome}}') it('outputs the contents if parameters are strictly equal', () => { const result = template({ foo: true, bar: true, baz: true }, { helpers }) expect(result).toBe('yes') }) it('outputs true if first parameter is equal', () => { const result = template({ foo: true, bar: false, baz: true }, { helpers }) expect(result).toBe('yes') }) it('outputs true if second parameter is equal', () => { const result = template({ foo: true, bar: true, baz: false }, { helpers }) expect(result).toBe('yes') }) it('outputs false if neither parameter is equal', () => { const result = template({ foo: true, bar: false, baz: false }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#ifEqualsSome}}yes{{/ifEqualsSome}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#ifSome', () => { const template = compile('{{#ifSome foo bar baz}}yes{{else}}no{{/ifSome}}') it('outputs the contents if at least one parameter is truthy', () => { const result = template({ foo: 123, bar: '', baz: false }, { helpers }) expect(result).toBe('yes') }) it('does not output the contents if all parameters are falsy', () => { const result = template({ foo: 0, bar: '', baz: false }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#ifSome}}yes{{/ifSome}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#renderReactComponent', () => { it('renders the specified component (exported as a default CJS Module export) from a local path', () => { const template = compile(`{{{renderReactComponent localPath="packages/dotcom-server-handlebars/src/__test__/__fixtures__/components/DefaultExportComponentCJS" text="foo" }}}`) const result = template({}, { helpers }) expect(result).toBe('
foo
') }) it('renders the specified component (exported as a default ES Module export) from a local path', () => { const template = compile(`{{{renderReactComponent localPath="packages/dotcom-server-handlebars/src/__test__/__fixtures__/components/DefaultExportComponentES" text="bar" }}}`) const result = template({}, { helpers }) expect(result).toBe('
bar
') }) it('renders the specified component (exported as a named CJS Module export) from a local path', () => { const template = compile(`{{{renderReactComponent localPath="packages/dotcom-server-handlebars/src/__test__/__fixtures__/components/NamedExportComponentCJS" namedExport="Component" text="baz" }}}`) const result = template({}, { helpers }) expect(result).toBe('
baz
') }) it('renders the specified component (exported as a named ES Module export) from a local path', () => { const template = compile(`{{{renderReactComponent localPath="packages/dotcom-server-handlebars/src/__test__/__fixtures__/components/NamedExportComponentES" namedExport="Component" text="qux" }}}`) const result = template({}, { helpers }) expect(result).toBe('
qux
') }) it('throws if mandatory parameters are not provided', () => { const template = compile('{{{renderReactComponent}}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#resize', () => { it('formats the image as an image service URL', () => { const template = compile('{{#resize 640}}http://website.com/picture.jpg{{/resize}}') const result = template({}, { helpers }) expect(result).toBe( 'https://images.ft.com/v3/image/raw/http%3A%2F%2Fwebsite.com%2Fpicture.jpg?width=640&source=page-kit&fit=scale-down' ) }) it('accepts named parameters', () => { const template = compile('{{#resize 640 fit="contain"}}http://website.com/picture.jpg{{/resize}}') const result = template({}, { helpers }) expect(result).toBe( 'https://images.ft.com/v3/image/raw/http%3A%2F%2Fwebsite.com%2Fpicture.jpg?width=640&source=page-kit&fit=contain' ) }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#resize}}http://website.com/picture.jpg{{/resize}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#slice', () => { it('slices a given array and iterates over the new array', () => { const template = compile('{{#slice items offset="2" limit="3"}}{{this}}{{/slice}}') const result = template({ items: [1, 2, 3, 4, 5, 6] }, { helpers }) expect(result).toBe('345') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#slice offset="2" limit="3"}}{{this}}{{/slice}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#unlessAll', () => { const template = compile('{{#unlessAll foo bar baz}}yes{{else}}no{{/unlessAll}}') it('outputs the contents if all parameters are falsy', () => { const result = template({ foo: 0, bar: '', baz: false }, { helpers }) expect(result).toBe('yes') }) it('does not output the contents if any parameters are truthy', () => { const result = template({ foo: 0, bar: '', baz: true }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#unlessAll}}yes{{/unlessAll}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#unlessEquals', () => { const template = compile('{{#unlessEquals foo bar}}yes{{else}}no{{/unlessEquals}}') it('outputs the contents if all parameters are falsy', () => { const result = template({ foo: true, bar: false }, { helpers }) expect(result).toBe('yes') }) it('does not output the contents if any parameters are truthy', () => { const result = template({ foo: true, bar: true }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#unlessEquals}}yes{{/unlessEquals}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('#unlessSome', () => { const template = compile('{{#unlessSome foo bar baz}}yes{{else}}no{{/unlessSome}}') it('outputs the contents if any parameters are falsy', () => { const result = template({ foo: 1, bar: 'abc', baz: false }, { helpers }) expect(result).toBe('yes') }) it('does not output the contents if all parameters are truthy', () => { const result = template({ foo: 1, bar: 'abc', baz: true }, { helpers }) expect(result).toBe('no') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{#unlessSome}}yes{{/unlessSome}}') expect(() => template({}, { helpers })).toThrow() }) }) }) describe('inline helpers', () => { describe('array', () => { it('converts all parameters into one array', () => { const template = compile('{{array foo bar baz}}') const result = template({ foo: 1, bar: 2, baz: 3 }, { helpers }) expect(result).toBe('1,2,3') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{array}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('concat', () => { it('concatenates all parameters into one string', () => { const template = compile('{{concat "Welcome to " place ", " name}}') const result = template({ place: 'Hell', name: 'human' }, { helpers }) expect(result).toBe('Welcome to Hell, human') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{concat}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('encode', () => { it('encodes the parameter as a URI component', () => { const template = compile('{{{encode title}}}') const result = template({ title: 'http://www.foo.com?bar=baz&qux=«»' }, { helpers }) expect(result).toBe('http%3A%2F%2Fwww.foo.com%3Fbar%3Dbaz%26qux%3D%C2%AB%C2%BB') }) it('encodes the parameter as a complete URI', () => { const template = compile('{{{encode title mode="uri"}}}') const result = template({ title: 'http://www.foo.com?bar=baz&qux=«»' }, { helpers }) expect(result).toBe('http://www.foo.com?bar=baz&qux=%C2%AB%C2%BB') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{encode}}') expect(() => template({}, { helpers })).toThrow() }) }) describe('json', () => { it('stringifies the parameter', () => { const template = compile('{{{json data}}}') const result = template({ data: { foo: 'bar', baz: 123, qux: true } }, { helpers }) expect(result).toBe('{"foo":"bar","baz":123,"qux":true}') }) it('throws if the incorrect number of parameters are provided', () => { const template = compile('{{json}}') expect(() => template({}, { helpers })).toThrow() }) it('throws if the user tries to output the @root context', () => { const template = compile('{{json data}}') expect(() => template({ data: { _locals: true } }, { helpers })).toThrow() }) }) }) })