Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,68 @@ describe('GetCFDocument', () => {
})
}))
})

it('should include caseVersion for a CASE 1.1 document', async () => {
const document = CFDocument.create({
tenantId,
caseVersion: '1.1',
sourcedId: docId,
uri: `/ims/case/v1p1/CFDocuments/${docId}`,
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
})

const pkg = new CFPackage({ document, items: [], associations: [], rubrics: [] })
mockRepository.load.mockResolvedValue(pkg)

const result = await getCFDocument.execute({ tenantId, caseVersion: '1.1', sourcedId: docId })

expect(result.caseVersion).toBe('1.1')
})

it('should not include caseVersion for a CASE 1.0 document', async () => {
const document = CFDocument.create({
tenantId,
caseVersion: '1.0',
sourcedId: docId,
uri: `/ims/case/v1p0/CFDocuments/${docId}`,
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
})

const pkg = new CFPackage({ document, items: [], associations: [], rubrics: [] })
mockRepository.load.mockResolvedValue(pkg)

const result = await getCFDocument.execute({ tenantId, caseVersion: '1.0', sourcedId: docId })

expect(result.caseVersion).toBeUndefined()
})

it('should not include caseVersion when downconverting a stored 1.1 document to 1.0', async () => {
const document = CFDocument.create({
tenantId,
caseVersion: '1.1',
sourcedId: docId,
uri: `/ims/case/v1p1/CFDocuments/${docId}`,
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
})

const pkg = new CFPackage({ document, items: [], associations: [], rubrics: [] })
mockRepository.load.mockResolvedValue(pkg)

const result = await getCFDocument.execute({
tenantId,
caseVersion: '1.0',
loadVersion: '1.1',
sourcedId: docId
})

expect(result.caseVersion).toBeUndefined()
})
})
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,68 @@ describe('GetCFPackage', () => {
expect(result).not.toBeNull();
expect(result?.CFDocument.adoptionStatus).toBe('Deprecated');
});

it('should include caseVersion on the embedded CFDocument for a CASE 1.1 package', async () => {
const document = CFDocument.create({
tenantId,
caseVersion: '1.1',
sourcedId: docId,
uri: `/ims/case/v1p1/CFDocuments/${docId}`,
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
});

const pkg = new CFPackage({ document, items: [], associations: [], rubrics: [] });
mockRepository.load.mockResolvedValue(pkg);

const result = await getCFPackage.execute({ tenantId, caseVersion: '1.1', docId });

expect(result?.CFDocument.caseVersion).toBe('1.1');
});

it('should not include caseVersion on the embedded CFDocument for a CASE 1.0 package', async () => {
const document = CFDocument.create({
tenantId,
caseVersion: '1.0',
sourcedId: docId,
uri: `/ims/case/v1p0/CFDocuments/${docId}`,
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
});

const pkg = new CFPackage({ document, items: [], associations: [], rubrics: [] });
mockRepository.load.mockResolvedValue(pkg);

const result = await getCFPackage.execute({ tenantId, caseVersion: '1.0', docId });

expect(result?.CFDocument.caseVersion).toBeUndefined();
});

it('should not include caseVersion when downconverting a stored 1.1 package to 1.0', async () => {
const document = CFDocument.create({
tenantId,
caseVersion: '1.1',
sourcedId: docId,
uri: `/ims/case/v1p1/CFDocuments/${docId}`,
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
});

const pkg = new CFPackage({ document, items: [], associations: [], rubrics: [] });
mockRepository.load.mockResolvedValue(pkg);

const result = await getCFPackage.execute({
tenantId,
caseVersion: '1.0',
loadVersion: '1.1',
docId
});

expect(result?.CFDocument.caseVersion).toBeUndefined();
});
});
});

8 changes: 5 additions & 3 deletions apps/opencase/src/domain/case/entities/CFDocument.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,13 +170,15 @@ export class CFDocument {
};
}

// CASE 1.0 strictness: do not emit CASE 1.1-only fields
if (effectiveVersion === '1.0') {
// CASE 1.1: include caseVersion (spec best practice). CASE 1.0: strip 1.1-only fields.
if (effectiveVersion === '1.1') {
result.caseVersion = effectiveVersion
} else {
delete result.frameworkType
delete result.subjectURI
delete result.extensions
}

return result;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ describe('CFDocument', () => {
expect(json.title).toBe('Test Document');
expect(json.lastChangeDateTime).toBe('2024-01-01T12:30:45.000Z');
expect(json.tenantId).toBeUndefined();
expect(json.caseVersion).toBeUndefined();
expect(json.sourcedId).toBeUndefined();
});

Expand Down Expand Up @@ -166,6 +165,98 @@ describe('CFDocument', () => {
expect(json.notes).toBe('Test notes');
expect(json.extensions).toEqual({ custom: { key: 'value' } });
});

it('should include caseVersion when the document is CASE 1.1', () => {
const props = {
tenantId,
caseVersion: '1.1' as CaseVersion,
sourcedId: 'doc-123',
uri: '/ims/case/v1p1/CFDocuments/doc-123',
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
};

const doc = CFDocument.create(props);
const json = doc.toJSON();

expect(json.caseVersion).toBe('1.1');
});

it('should not include caseVersion when the document is CASE 1.0', () => {
const props = {
tenantId,
caseVersion: '1.0' as CaseVersion,
sourcedId: 'doc-123',
uri: '/ims/case/v1p0/CFDocuments/doc-123',
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
};

const doc = CFDocument.create(props);
const json = doc.toJSON();

expect(json.caseVersion).toBeUndefined();
});

it('should honor serializeAs override when downconverting a 1.1 document to 1.0', () => {
const props = {
tenantId,
caseVersion: '1.1' as CaseVersion,
sourcedId: 'doc-123',
uri: '/ims/case/v1p1/CFDocuments/doc-123',
creator: 'Test Creator',
title: 'Test Document',
frameworkType: 'Competency',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
};

const doc = CFDocument.create(props);
const json = doc.toJSON('1.0');

expect(json.caseVersion).toBeUndefined();
expect(json.frameworkType).toBeUndefined();
});

it('should honor serializeAs override when serving a 1.0 document via v1p1', () => {
const props = {
tenantId,
caseVersion: '1.0' as CaseVersion,
sourcedId: 'doc-123',
uri: '/ims/case/v1p0/CFDocuments/doc-123',
creator: 'Test Creator',
title: 'Test Document',
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
};

const doc = CFDocument.create(props);
const json = doc.toJSON('1.1');

expect(json.caseVersion).toBe('1.1');
});

it('should strip 1.1-only fields (frameworkType, subjectURI, extensions) for CASE 1.0', () => {
const props = {
tenantId,
caseVersion: '1.1' as CaseVersion,
sourcedId: 'doc-123',
uri: '/ims/case/v1p1/CFDocuments/doc-123',
creator: 'Test Creator',
title: 'Test Document',
frameworkType: 'Competency',
subjectURI: [{ identifier: 'subj-1', uri: '/ims/case/v1p1/CFItems/subj-1', title: 'Subject' }],
extensions: { custom: { key: 'value' } },
lastChangeDateTime: new Date('2024-01-01T00:00:00Z')
};

const doc = CFDocument.create(props);
const json = doc.toJSON('1.0');

expect(json.frameworkType).toBeUndefined();
expect(json.subjectURI).toBeUndefined();
expect(json.extensions).toBeUndefined();
});
});
});

Loading