UNPKG

handlebars-helpers-fhir

Version:

Helper functions for the Handlebars templating engine using fhirpath to reference HL7 FHIR resources from within templates.

565 lines (472 loc) 17.4 kB
'use strict'; const handlebars = require('handlebars'); const helpers = require('./index'); helpers.registerWith(handlebars); const should = require('chai').should(); describe('handlebars-helpers-fhir', () => { describe('#if-fhir', () => { it('should render block when fhirpath evaluates to not empty', () => { let template = "{{#if-fhir . expression='Foo.bar.val'}}{{resourceType}}{{/if-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Foo'); }); it('should not render block when fhirpath evaluates to empty', () => { let template = "{{#if-fhir . expression='Bar.foo.val'}}{{resourceType}}{{/if-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal(''); }); it('should render {{else}} section', () => { let template = "{{#if-fhir . expression='Bar.foo.val'}}nothing{{else}}{{resourceType}}{{/if-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Foo'); }); }); describe('#unless-fhir', () => { it('should render block when fhirpath evaluates to empty', () => { let template = "{{#unless-fhir . expression='Foo.bar.fubar'}}{{resourceType}}{{/unless-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Foo'); }); it('should not render block when fhirpath evaluates to not empty', () => { let template = "{{#unless-fhir . expression='Foo.bar.val'}}{{resourceType}}{{/unless-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal(''); }); }); describe('#each-fhir', () => { it('should render block for each item found by evaluating the fhirpath expression', () => { let template = "{{#each-fhir . expression='Foo.bar'}}{{val}}{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('abc'); }); it('should evaluate against root context', () => { let template = "{{#each-fhir . expression='foo.bar.val'}}{{.}}{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', foo: { bar: { val: 'd' } } }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('d'); }); it('should evaluate against child context', () => { let template = "{{#each-fhir foo expression='bar.val'}}{{.}}{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', foo: { bar: { val: 'd' } } }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('d'); }); it('should evaluate against grandchild context', () => { let template = "{{#each-fhir foo.bar expression='val'}}{{.}}{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', foo: { bar: { val: 'd' } } }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('d'); }); it('should support data variables: @first, @index, @last', () => { let template = "{{#each-fhir . expression='Foo.bar.val'}}{{@index}}:{{.}}[{{#if @first}}@first{{/if}}{{#if @last}}@last{{/if}}]{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('0:a[@first]1:b[]2:c[@last]'); }); it('should not render block when fhirpath evaluates to empty', () => { let template = "{{#each-fhir . expression='Foo.bar.val'}}{{.}}{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Bar', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal(''); }); it('should render {{else}} section', () => { let template = "{{#each-fhir . expression='Foo.bar.val'}}{{.}}{{else}}nothing{{/each-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Bar', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('nothing'); }); }); describe('#with-fhir', () => { it('should render block for first item found by evaluating the fhirpath expression', () => { let template = "{{#with-fhir . expression='Foo.bar'}}Value is: {{val}}{{/with-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Value is: a'); }); it('should not render block when fhirpath evaluates to empty', () => { let template = "{{#with-fhir . expression='Foo.bar.fubar'}}{{.}}{{/with-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal(''); }); it('should render {{else}} section', () => { let template = "{{#with-fhir . expression='Foo.bar.fubar'}}{{.}}{{else}}nothing{{/with-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: [ { val: 'a' }, { val: 'b' }, { val: 'c' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('nothing'); }); }); describe('#resolve-fhir', () => { it('should render block using a bundled resource', () => { let template = "{{#resolve-fhir . expression='entry.resource.Foo.bar.reference'}}Value is: {{val}}{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { entry: [ { resource: { resourceType: 'Foo', bar: { reference: 'Bar/1' }, val: 'a' } }, { resource: { resourceType: 'Bar', id: '1', val: 'b' } } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Value is: b'); }); it('should render block using a contained resource', () => { let template = "{{#resolve-fhir . expression='Foo.bar.reference'}}Value is: {{val}}{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { resourceType: 'Foo', bar: { reference: 'Bar/1' }, val: 'a', contained: [ { resourceType: 'Bar', id: '1', val: 'b' } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Value is: b'); }); it('should render block using a custom bundled resource (DSTU1 bundle syntax)', () => { helpers.useOptions({ location: ['content.entry.content', 'entry.content', 'entry.resource', 'contained'] }); let template = "{{#resolve-fhir . expression='entry.content.Foo.bar.reference'}}Value is: {{val}}{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { entry: [ { content: { resourceType: 'Foo', bar: { reference: 'Bar/1' }, val: 'a' } }, { content: { resourceType: 'Bar', id: '1', val: 'b' } } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('Value is: b'); }); it('should not render block when referenced resource not found', () => { let template = "{{#resolve-fhir . expression='entry.resource.Foo.bar.reference'}}Value is: {{val}}{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { entry: [ { resource: { resourceType: 'Foo', bar: { reference: 'Bar/1' }, val: 'a' } } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal(''); }); it('should not render block when reference not found', () => { let template = "{{#resolve-fhir . expression='entry.resource.Foo.bar.reference'}}Value is: {{val}}{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { entry: [ { resource: { resourceType: 'Foo', bar: { display: 'Bar no. 1' }, val: 'a' } } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal(''); }); it('should render {{else}} section when referenced resource not found', () => { let template = "{{#resolve-fhir . expression='entry.resource.Foo.bar.reference'}}Value is: {{val}}{{else}}nothing{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { entry: [ { resource: { resourceType: 'Foo', bar: { reference: 'Bar/1' }, val: 'a' } } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('nothing'); }); it('should render {{else}} section when reference not found', () => { let template = "{{#resolve-fhir . expression='entry.resource.Foo.bar.reference'}}Value is: {{val}}{{else}}nothing{{/resolve-fhir}}"; let compiledTemplate = handlebars.compile(template); let resource = { entry: [ { resource: { resourceType: 'Foo', bar: { display: 'Bar no. 1' }, val: 'a' } } ] }; let result = compiledTemplate(resource); should.exist(result); result.should.equal('nothing'); }); }); });