import { expect } from 'chai' import { PlanDefinition, PlanDefinitionAction } from 'fhir' import { PlanDefinitionBuilder, PlanDefinitionActionBuilder } from '../src' import { AlreadyExistsError } from '../src/exceptions' import sinon from 'sinon' describe('PlanDefinitionBuilder', () => { before(() => { // Mock make to avoid testing generated timestamp sinon .stub(PlanDefinitionBuilder.prototype, '_generateIsoDate') .callsFake(() => '0000-00-00T00:00:00.000Z') }) it('should be able to build minimal PlanDefinition', () => { expect(new PlanDefinitionBuilder().build()).to.eql({ resourceType: 'PlanDefinition', date: '0000-00-00T00:00:00.000Z', }) }) it('should be able to accept existing PlanDefinition', () => { expect( new PlanDefinitionBuilder() .use({ resourceType: 'PlanDefinition', status: 'active', }) .build() ).to.eql({ resourceType: 'PlanDefinition', status: 'active', }) }) it('should be able to reset', () => { const planDefinitionBuilder: PlanDefinitionBuilder = new PlanDefinitionBuilder().use( { resourceType: 'PlanDefinition', status: 'active', date: '2019-07-12T12:37:08.854Z', } ) expect(planDefinitionBuilder.use().build()).to.eql({ resourceType: 'PlanDefinition', date: '0000-00-00T00:00:00.000Z', }) }) it('should be able to set url-field', () => { expect( new PlanDefinitionBuilder() .setUrl( 'canonical://uuid/PlanDefinition/5f60c9f9-5a20-4045-863f-0b0b310c24de' ) .build() ).to.eql({ resourceType: 'PlanDefinition', date: '0000-00-00T00:00:00.000Z', url: 'canonical://uuid/PlanDefinition/5f60c9f9-5a20-4045-863f-0b0b310c24de', }) }) it('should be able to unset url-field', () => { const codingBuilder: PlanDefinitionBuilder = new PlanDefinitionBuilder().use( { resourceType: 'PlanDefinition', status: 'draft', date: '0000-00-00T00:00:00.000Z', url: 'canonical://uuid/PlanDefinition/5f60c9f9-5a20-4045-863f-0b0b310c24de', } as PlanDefinition ) expect(codingBuilder.setUrl().build()).to.eql({ resourceType: 'PlanDefinition', status: 'draft', date: '0000-00-00T00:00:00.000Z', }) }) it('should be able to return url-field', () => { expect( new PlanDefinitionBuilder() .use({ resourceType: 'PlanDefinition', status: 'active', date: '0000-00-00T00:00:00.000Z', url: 'canonical://uuid/PlanDefinition/5f60c9f9-5a20-4045-863f-0b0b310c24de', }) .getUrl() ).to.eql( 'canonical://uuid/PlanDefinition/5f60c9f9-5a20-4045-863f-0b0b310c24de' ) }) it('should be able to set version-field', () => { expect(new PlanDefinitionBuilder().setVersion('1.0.0').build()).to.eql({ resourceType: 'PlanDefinition', date: '0000-00-00T00:00:00.000Z', version: '1.0.0', }) }) it('should be able to unset version-field', () => { const codingBuilder: PlanDefinitionBuilder = new PlanDefinitionBuilder().use( { resourceType: 'PlanDefinition', status: 'draft', date: '0000-00-00T00:00:00.000Z', version: '1.0.0', } as PlanDefinition ) expect(codingBuilder.setVersion().build()).to.eql({ resourceType: 'PlanDefinition', status: 'draft', date: '0000-00-00T00:00:00.000Z', }) }) it('should be able to return version-field', () => { expect( new PlanDefinitionBuilder() .use({ resourceType: 'PlanDefinition', status: 'active', date: '0000-00-00T00:00:00.000Z', version: '1.0.0', }) .getVersion() ).to.eql('1.0.0') }) it('should be able to set action-array', () => { const action: PlanDefinitionAction = new PlanDefinitionActionBuilder() .setId('id') .build() const planDefinition: PlanDefinition = new PlanDefinitionBuilder() .setAction([action]) .build() expect(planDefinition).to.eql({ resourceType: 'PlanDefinition', date: '0000-00-00T00:00:00.000Z', action: [{ id: 'id' }], }) }) it('should be able to unset action-array', () => { const planDefinitionBuilder: PlanDefinitionBuilder = new PlanDefinitionBuilder().use( { resourceType: 'PlanDefinition', status: 'active', action: [{ id: 'id' }], } ) expect(planDefinitionBuilder.setAction().build()).to.eql({ resourceType: 'PlanDefinition', status: 'active', }) }) it('should be able to return action-array', () => { const planDefinition: PlanDefinition = { resourceType: 'PlanDefinition', status: 'active', action: [{ id: 'id' }], } as PlanDefinition expect(new PlanDefinitionBuilder().use(planDefinition).getAction()).to.eql([ { id: 'id' }, ]) }) it('should return empty array when action-array is empty', () => { expect(new PlanDefinitionBuilder().getAction()).to.eql([]) }) it('should be able to return action with specific id from action-array', () => { const planDefinition: PlanDefinition = { resourceType: 'PlanDefinition', status: 'active', action: [{ id: 'id' }, { id: 'id2' }], } expect( new PlanDefinitionBuilder().use(planDefinition).getAction('id') ).to.eql({ id: 'id' }) }) it('should be able to add action to empty action-array', () => { expect( new PlanDefinitionBuilder() .use({ resourceType: 'PlanDefinition', status: 'active', action: [{ id: 'id' }], }) .addAction({ id: 'id2' }) .getAction() ).to.eql([{ id: 'id' }, { id: 'id2' }]) }) it('should be able to add action to nonempty action-array', () => { expect( new PlanDefinitionBuilder().addAction({ id: 'id' }).getAction() ).to.eql([{ id: 'id' }]) }) it('should throw error when attempting to add action that is in conflict with existing action', () => { expect(() => { new PlanDefinitionBuilder() .setAction([ new PlanDefinitionActionBuilder() .setDefinitionCanonical( 'canonical://uuid/Questionnaire/39268cb0-efb8-4e17-9b5b-9dfc7799495c|1.0.0' ) .build(), ]) .addAction( new PlanDefinitionActionBuilder() .setDefinitionCanonical( 'canonical://uuid/Questionnaire/39268cb0-efb8-4e17-9b5b-9dfc7799495c|1.0.0' ) .build() ) }).to.throw(AlreadyExistsError) }) after(() => { sinon.reset() }) })