Skip to main content
Glama
insurance.test.ts8.69 kB
// SPDX-FileCopyrightText: Copyright Orangebot, Inc. and Medplum contributors // SPDX-License-Identifier: Apache-2.0 import { createReference } from '@medplum/core'; import type { Account, Bundle, Composition, Coverage, Organization, Patient, RelatedPerson } from '@medplum/fhirtypes'; import { FhirToCcdaConverter } from '../convert'; import { createInsuranceEntry } from './insurance'; describe('createInsuranceEntry', () => { let converter: FhirToCcdaConverter; let bundle: Bundle; let patient: Patient; beforeEach(() => { patient = { id: 'patient-1', resourceType: 'Patient', name: [{ given: ['John'], family: 'Doe' }], }; bundle = { resourceType: 'Bundle', type: 'document', entry: [ { resource: patient }, { resource: { id: 'composition-1', resourceType: 'Composition', status: 'final', type: { text: 'test' }, date: new Date().toISOString(), author: [{ display: 'test' }], title: 'test', subject: createReference(patient), section: [], } as Composition, }, ], }; converter = new FhirToCcdaConverter(bundle); }); test('should return entry for account without coverage', () => { const account: Account = { id: 'account-1', resourceType: 'Account', status: 'active', }; const result = createInsuranceEntry(converter, account); expect(result).toBeDefined(); expect(result?.act?.[0]).toBeDefined(); expect(result?.act?.[0]?.['@_classCode']).toBe('ACT'); expect(result?.act?.[0]?.['@_moodCode']).toBe('EVN'); expect(result?.act?.[0]?.code?.['@_code']).toBe('48768-6'); expect(result?.act?.[0]?.code?.['@_displayName']).toBe('Payment Sources'); expect(result?.act?.[0]?.statusCode?.['@_code']).toBe('completed'); }); test('should return entry for account with coverage', () => { const organization: Organization = { id: 'org-1', resourceType: 'Organization', name: 'Test Insurance Company', address: [{ line: ['123 Insurance St'], city: 'Insurance City', state: 'IC', postalCode: '12345' }], telecom: [{ system: 'phone', value: '555-0123' }], }; const relatedPerson: RelatedPerson = { id: 'related-1', resourceType: 'RelatedPerson', patient: createReference(patient), name: [{ given: ['Jane'], family: 'Doe' }], birthDate: '1985-01-01', address: [{ line: ['456 Policy St'], city: 'Policy City', state: 'PC', postalCode: '54321' }], identifier: [{ value: '888009335' }], }; const coverage: Coverage = { id: 'coverage-1', resourceType: 'Coverage', status: 'active', beneficiary: createReference(patient), payor: [createReference(organization)], policyHolder: createReference(relatedPerson), type: { coding: [ { code: 'HMO', display: 'Health Maintenance Organization', system: 'http://terminology.hl7.org/CodeSystem/v3-ActCode', }, ], }, class: [ { type: { coding: [{ code: 'plan' }] }, value: 'Test Plan', }, ], identifier: [{ value: 'coverage-123' }], }; const account: Account = { id: 'account-1', resourceType: 'Account', status: 'active', coverage: [{ coverage: createReference(coverage) }], identifier: [{ value: 'account-123' }], }; // Add resources to bundle bundle.entry?.push({ resource: organization }, { resource: relatedPerson }, { resource: coverage }); const result = createInsuranceEntry(converter, account); expect(result).toBeDefined(); expect(result?.act?.[0]?.entryRelationship).toBeDefined(); expect(result?.act?.[0]?.entryRelationship?.length).toBe(1); const entryRel = result?.act?.[0]?.entryRelationship?.[0]; expect(entryRel?.['@_typeCode']).toBe('COMP'); expect(entryRel?.act?.[0]?.['@_classCode']).toBe('ACT'); expect(entryRel?.act?.[0]?.['@_moodCode']).toBe('EVN'); // Check policy activity const policyAct = entryRel?.act?.[0]; expect(policyAct?.code?.['@_code']).toBe('71'); expect(policyAct?.code?.['@_displayName']).toBe('Health Maintenance Organization'); // Check performer (payor) expect(policyAct?.performer).toBeDefined(); expect(policyAct?.performer?.[0]?.['@_typeCode']).toBe('PRF'); expect(policyAct?.performer?.[0]?.assignedEntity?.representedOrganization?.name?.[0]).toBe( 'Test Insurance Company' ); // Check participants expect(policyAct?.participant).toBeDefined(); expect(policyAct?.participant?.length).toBe(2); // Check covered party participant const coveredParty = policyAct?.participant?.[0]; expect(coveredParty?.['@_typeCode']).toBe('COV'); expect(coveredParty?.participantRole?.['@_classCode']).toBe('PAT'); expect(coveredParty?.participantRole?.code?.['@_code']).toBe('FAMDEP'); // Participant role structure varies based on mapNames implementation expect(coveredParty?.participantRole?.playingEntity?.name).toBeDefined(); // Check policy holder participant const policyHolder = policyAct?.participant?.[1]; expect(policyHolder?.['@_typeCode']).toBe('HLD'); // Policy holder structure varies based on mapNames implementation expect(policyHolder?.participantRole?.playingEntity?.name).toBeDefined(); // Check entry relationship for policy reference expect(policyAct?.entryRelationship).toBeDefined(); expect(policyAct?.entryRelationship?.[0]?.['@_typeCode']).toBe('REFR'); expect(policyAct?.entryRelationship?.[0]?.act?.[0]?.code?.['@_code']).toBe('PAYOR'); expect(policyAct?.entryRelationship?.[0]?.act?.[0]?.text?.['#text']).toBe('Test Plan'); }); test('should handle coverage without payor', () => { const coverage: Coverage = { id: 'coverage-1', resourceType: 'Coverage', status: 'active', beneficiary: createReference(patient), payor: [{ display: 'Test Payor' }], type: { coding: [ { code: 'PPO', display: 'Preferred Provider Organization', system: 'http://terminology.hl7.org/CodeSystem/v3-ActCode', }, ], }, }; const account: Account = { id: 'account-1', resourceType: 'Account', status: 'active', coverage: [{ coverage: createReference(coverage) }], }; bundle.entry?.push({ resource: coverage }); const result = createInsuranceEntry(converter, account); expect(result).toBeDefined(); expect(result?.act?.[0]?.entryRelationship?.length).toBe(1); const policyAct = result?.act?.[0]?.entryRelationship?.[0]?.act?.[0]; expect(policyAct?.code?.['@_code']).toBe('72'); expect(policyAct?.performer?.[0]?.assignedEntity?.representedOrganization?.name).toBeUndefined(); }); test('should handle account without coverage array', () => { const account: Account = { id: 'account-1', resourceType: 'Account', status: 'active', }; const result = createInsuranceEntry(converter, account); expect(result).toBeDefined(); expect(result?.act?.[0]?.entryRelationship).toEqual([]); }); test('should skip invalid coverage references', () => { const account: Account = { id: 'account-1', resourceType: 'Account', status: 'active', coverage: [ { coverage: { reference: 'Coverage/nonexistent' } }, { coverage: { reference: 'Patient/patient-1' } }, // Wrong resource type ], }; const result = createInsuranceEntry(converter, account); expect(result).toBeDefined(); expect(result?.act?.[0]?.entryRelationship).toEqual([]); }); test('should handle coverage without plan class', () => { const coverage: Coverage = { id: 'coverage-1', resourceType: 'Coverage', status: 'active', beneficiary: createReference(patient), payor: [{ display: 'Test Payor' }], type: { coding: [{ code: 'UNKNOWN', display: 'Unknown' }], }, }; const account: Account = { id: 'account-1', resourceType: 'Account', status: 'active', coverage: [{ coverage: createReference(coverage) }], }; bundle.entry?.push({ resource: coverage }); const result = createInsuranceEntry(converter, account); expect(result).toBeDefined(); const policyAct = result?.act?.[0]?.entryRelationship?.[0]?.act?.[0]; expect(policyAct?.entryRelationship?.[0]?.act?.[0]?.text).toBeUndefined(); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/medplum/medplum'

If you have feedback or need assistance with the MCP directory API, please join our Discord server