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..c0691b58e 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}'. (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.spec.ts b/shared/src/document-loader/document-loader.spec.ts index bdc3a65fd..c5ce4171b 100644 --- a/shared/src/document-loader/document-loader.spec.ts +++ b/shared/src/document-loader/document-loader.spec.ts @@ -33,26 +33,24 @@ describe('DocumentLoader', () => { vi.resetModules(); }); - it('should create a FileSystemDocumentLoader when loadMode is "filesystem"', () => { + it('should create a FileSystemDocumentLoader', () => { const docLoaderOpts: DocumentLoaderOptions = { - loadMode: 'filesystem', schemaDirectoryPath: 'schemas' }; - buildDocumentLoader(docLoaderOpts, false); + buildDocumentLoader(docLoaderOpts); 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 = { - loadMode: 'calmhub', calmHubUrl: 'https://example.com' }; - buildDocumentLoader(docLoaderOpts, false); + buildDocumentLoader(docLoaderOpts); expect(mocks.calmHubDocLoader).toHaveBeenCalledWith('https://example.com', false); }); 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;