From 357ae879b27f7a705159458acf22638ab97944fd Mon Sep 17 00:00:00 2001 From: markscott-ms Date: Fri, 7 Nov 2025 10:23:04 +0000 Subject: [PATCH 1/3] test(shared): remove invalid options and arguments from document-loader tests --- shared/src/document-loader/document-loader.spec.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/shared/src/document-loader/document-loader.spec.ts b/shared/src/document-loader/document-loader.spec.ts index bdc3a65fd..7ceb5d46a 100644 --- a/shared/src/document-loader/document-loader.spec.ts +++ b/shared/src/document-loader/document-loader.spec.ts @@ -36,11 +36,10 @@ describe('DocumentLoader', () => { it('should create a FileSystemDocumentLoader when loadMode is "filesystem"', () => { const docLoaderOpts: DocumentLoaderOptions = { - loadMode: 'filesystem', schemaDirectoryPath: 'schemas' }; - buildDocumentLoader(docLoaderOpts, false); + buildDocumentLoader(docLoaderOpts); expect(mocks.fsDocLoader).toHaveBeenCalledWith([CALM_META_SCHEMA_DIRECTORY, 'schemas'], false); }); @@ -48,11 +47,10 @@ describe('DocumentLoader', () => { it('should create a CalmHubDocumentLoader when loadMode is "calmhub"', () => { const docLoaderOpts: DocumentLoaderOptions = { - loadMode: 'calmhub', calmHubUrl: 'https://example.com' }; - buildDocumentLoader(docLoaderOpts, false); + buildDocumentLoader(docLoaderOpts); expect(mocks.calmHubDocLoader).toHaveBeenCalledWith('https://example.com', false); }); From 1006d441cd7b0931dd2b47d4cd709533883f6c57 Mon Sep 17 00:00:00 2001 From: markscott-ms Date: Fri, 7 Nov 2025 10:53:09 +0000 Subject: [PATCH 2/3] fix(shared): only access CalmHub when the URL prefix is calm: not every protocol --- .../calmhub-document-loader.spec.ts | 17 +++++++++++++---- .../document-loader/calmhub-document-loader.ts | 6 +++++- shared/src/document-loader/document-loader.ts | 2 ++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/shared/src/document-loader/calmhub-document-loader.spec.ts b/shared/src/document-loader/calmhub-document-loader.spec.ts index 8564a2e07..98a0ce853 100644 --- a/shared/src/document-loader/calmhub-document-loader.spec.ts +++ b/shared/src/document-loader/calmhub-document-loader.spec.ts @@ -1,25 +1,28 @@ import axios from 'axios'; import AxiosMockAdapter from 'axios-mock-adapter'; import { CalmHubDocumentLoader } from './calmhub-document-loader'; +import { SchemaDirectory } from '../schema-directory'; const calmHubBaseUrl = 'http://local-calmhub'; const ax = axios.create({ baseURL: calmHubBaseUrl }); const mock = new AxiosMockAdapter(ax); -mock.onGet('/calm/schemas/2025-03/meta/core.json').reply(200, { +mock.onGet('/schemas/2025-03/meta/core.json').reply(200, { '$id': 'https://calm.finos.org/calm/schemas/2025-03/meta/core.json', 'value': 'test' }); describe('calmhub-document-loader', () => { - let calmHubDocumentLoader; + let calmHubDocumentLoader: CalmHubDocumentLoader; + let schemaDirectory: SchemaDirectory; beforeEach(() => { calmHubDocumentLoader = new CalmHubDocumentLoader(calmHubBaseUrl, false, ax); + calmHubDocumentLoader.initialise(schemaDirectory); }); it('loads a document from CalmHub', async () => { - const calmHubUrl = 'https://calm.finos.org/calm/schemas/2025-03/meta/core.json'; + const calmHubUrl = 'calm:/schemas/2025-03/meta/core.json'; const document = await calmHubDocumentLoader.loadMissingDocument(calmHubUrl, 'schema'); expect(document).toEqual({ '$id': 'https://calm.finos.org/calm/schemas/2025-03/meta/core.json', @@ -28,7 +31,13 @@ describe('calmhub-document-loader', () => { }); it('throws an error when the document is not found', async () => { - const calmHubUrl = 'https://calm.finos.org/calm/schemas/2025-03/meta/nonexistent.json'; + const calmHubUrl = 'calm:/schemas/2025-03/meta/nonexistent.json'; + + await expect(calmHubDocumentLoader.loadMissingDocument(calmHubUrl, 'schema')).rejects.toThrow(); + }); + + it('throws an error when the protocol is not calm:', async () => { + const calmHubUrl = 'https://not.calmhub.com/schemas/2025-03/meta/nonexistent.json'; await expect(calmHubDocumentLoader.loadMissingDocument(calmHubUrl, 'schema')).rejects.toThrow(); }); diff --git a/shared/src/document-loader/calmhub-document-loader.ts b/shared/src/document-loader/calmhub-document-loader.ts index f4bd50e48..16692179c 100644 --- a/shared/src/document-loader/calmhub-document-loader.ts +++ b/shared/src/document-loader/calmhub-document-loader.ts @@ -1,6 +1,6 @@ import axios, { Axios } from 'axios'; import { SchemaDirectory } from '../schema-directory'; -import { CalmDocumentType, DocumentLoader } from './document-loader'; +import { CalmDocumentType, DocumentLoader, CALM_HUB_PROTO } from './document-loader'; import { initLogger, Logger } from '../logger'; export class CalmHubDocumentLoader implements DocumentLoader { @@ -47,6 +47,10 @@ export class CalmHubDocumentLoader implements DocumentLoader { async loadMissingDocument(documentId: string, _: CalmDocumentType): Promise { const url = new URL(documentId); + const protocol = url.protocol; + if (protocol !== CALM_HUB_PROTO) { + throw new Error(`CalmHubDocumentLoader only loads documents with protocol '${CALM_HUB_PROTO}'. Skipping. (Requested: ${protocol})`); + } const path = url.pathname; this.logger.debug(`Loading CALM schema from ${this.calmHubUrl}${path}`); diff --git a/shared/src/document-loader/document-loader.ts b/shared/src/document-loader/document-loader.ts index abb7206e0..2f11f167f 100644 --- a/shared/src/document-loader/document-loader.ts +++ b/shared/src/document-loader/document-loader.ts @@ -7,6 +7,8 @@ import { MultiStrategyDocumentLoader } from './multi-strategy-document-loader'; export type CalmDocumentType = 'architecture' | 'pattern' | 'schema'; +export const CALM_HUB_PROTO = 'calm:'; + export interface DocumentLoader { initialise(schemaDirectory: SchemaDirectory): Promise; loadMissingDocument(documentId: string, type: CalmDocumentType): Promise; From 355dd5924dd5958f604b1eff948d9a638480aba9 Mon Sep 17 00:00:00 2001 From: markscott-ms Date: Fri, 7 Nov 2025 13:29:07 +0000 Subject: [PATCH 3/3] fix(shared): clarify test descriptions and error message --- shared/src/document-loader/calmhub-document-loader.ts | 2 +- shared/src/document-loader/document-loader.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/src/document-loader/calmhub-document-loader.ts b/shared/src/document-loader/calmhub-document-loader.ts index 16692179c..c0691b58e 100644 --- a/shared/src/document-loader/calmhub-document-loader.ts +++ b/shared/src/document-loader/calmhub-document-loader.ts @@ -49,7 +49,7 @@ export class CalmHubDocumentLoader implements DocumentLoader { const url = new URL(documentId); const protocol = url.protocol; if (protocol !== CALM_HUB_PROTO) { - throw new Error(`CalmHubDocumentLoader only loads documents with protocol '${CALM_HUB_PROTO}'. Skipping. (Requested: ${protocol})`); + throw new Error(`CalmHubDocumentLoader only loads documents with protocol '${CALM_HUB_PROTO}'. (Requested: ${protocol})`); } const path = url.pathname; diff --git a/shared/src/document-loader/document-loader.spec.ts b/shared/src/document-loader/document-loader.spec.ts index 7ceb5d46a..c5ce4171b 100644 --- a/shared/src/document-loader/document-loader.spec.ts +++ b/shared/src/document-loader/document-loader.spec.ts @@ -33,7 +33,7 @@ describe('DocumentLoader', () => { vi.resetModules(); }); - it('should create a FileSystemDocumentLoader when loadMode is "filesystem"', () => { + it('should create a FileSystemDocumentLoader', () => { const docLoaderOpts: DocumentLoaderOptions = { schemaDirectoryPath: 'schemas' @@ -44,7 +44,7 @@ describe('DocumentLoader', () => { expect(mocks.fsDocLoader).toHaveBeenCalledWith([CALM_META_SCHEMA_DIRECTORY, 'schemas'], false); }); - it('should create a CalmHubDocumentLoader when loadMode is "calmhub"', () => { + it('should create a CalmHubDocumentLoader when calmHubUrl is defined in loader options', () => { const docLoaderOpts: DocumentLoaderOptions = { calmHubUrl: 'https://example.com'