diff --git a/package-lock.json b/package-lock.json index e660920ed..75c85ca00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,7 +87,7 @@ "@typescript-eslint/eslint-plugin": "^5.3.0", "@typescript-eslint/parser": "^5.3.0", "cheerio": "^1.0.0-rc.10", - "componentsjs-generator": "^3.0.2", + "componentsjs-generator": "^3.0.3", "eslint": "^8.8.0", "eslint-config-es": "4.1.0", "eslint-import-resolver-typescript": "^2.5.0", @@ -5906,9 +5906,9 @@ } }, "node_modules/componentsjs-generator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/componentsjs-generator/-/componentsjs-generator-3.0.2.tgz", - "integrity": "sha512-r0u4PJD6oEAmjSX920JZndA5/mb7s4UbwSf1awisEXs5s4zTp0jiOhNG3z6p5lvAHBTZHwIPf83b4yWUU/9TYA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/componentsjs-generator/-/componentsjs-generator-3.0.3.tgz", + "integrity": "sha512-Pv4+tnwAWjOkUpwt6SoD8DWfBdGfxhaqAK3zRvZIgrbPFo4V4bZpXgN8MBYXm1InRGYQeHdNUTGdXYZw0L8GjA==", "dev": true, "dependencies": { "@types/lru-cache": "^5.1.0", @@ -19763,9 +19763,9 @@ } }, "componentsjs-generator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/componentsjs-generator/-/componentsjs-generator-3.0.2.tgz", - "integrity": "sha512-r0u4PJD6oEAmjSX920JZndA5/mb7s4UbwSf1awisEXs5s4zTp0jiOhNG3z6p5lvAHBTZHwIPf83b4yWUU/9TYA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/componentsjs-generator/-/componentsjs-generator-3.0.3.tgz", + "integrity": "sha512-Pv4+tnwAWjOkUpwt6SoD8DWfBdGfxhaqAK3zRvZIgrbPFo4V4bZpXgN8MBYXm1InRGYQeHdNUTGdXYZw0L8GjA==", "dev": true, "requires": { "@types/lru-cache": "^5.1.0", diff --git a/package.json b/package.json index 733c8f6f2..c9cfd2356 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "@typescript-eslint/eslint-plugin": "^5.3.0", "@typescript-eslint/parser": "^5.3.0", "cheerio": "^1.0.0-rc.10", - "componentsjs-generator": "^3.0.2", + "componentsjs-generator": "^3.0.3", "eslint": "^8.8.0", "eslint-config-es": "4.1.0", "eslint-import-resolver-typescript": "^2.5.0", diff --git a/src/storage/routing/ConvertingRouterRule.ts b/src/storage/routing/ConvertingRouterRule.ts index 404896ccd..25a6873fe 100644 --- a/src/storage/routing/ConvertingRouterRule.ts +++ b/src/storage/routing/ConvertingRouterRule.ts @@ -23,9 +23,9 @@ export class ConvertingRouterRule extends RouterRule { private readonly typedStores: ConvertingStoreEntry[]; private readonly defaultStore: ResourceStore; - public constructor(typedStore: ConvertingStoreEntry, defaultStore: ResourceStore) { + public constructor(typedStores: ConvertingStoreEntry[], defaultStore: ResourceStore) { super(); - this.typedStores = [ typedStore ]; + this.typedStores = typedStores; this.defaultStore = defaultStore; } diff --git a/test/unit/storage/routing/ConvertingRouterRule.test.ts b/test/unit/storage/routing/ConvertingRouterRule.test.ts index 8833eee6b..b6a86541f 100644 --- a/test/unit/storage/routing/ConvertingRouterRule.test.ts +++ b/test/unit/storage/routing/ConvertingRouterRule.test.ts @@ -7,14 +7,17 @@ import { InternalServerError } from '../../../../src/util/errors/InternalServerE describe('A ConvertingRouterRule', (): void => { let store1: ResourceStore; + let store2: ResourceStore; let defaultStore: ResourceStore; let checker1: PreferenceSupport; + let checker2: PreferenceSupport; let rule: ConvertingRouterRule; let representation: Representation; let metadata: RepresentationMetadata; beforeEach(async(): Promise => { store1 = { name: 'turtleStore' } as any; + store2 = { name: 'textStore' } as any; defaultStore = { name: 'defaultStore' } as any; checker1 = { @@ -23,7 +26,16 @@ describe('A ConvertingRouterRule', (): void => { }, } as any; - rule = new ConvertingRouterRule({ store: store1, supportChecker: checker1 }, defaultStore); + checker2 = { + async supports(input: { representation: Representation }): Promise { + return input.representation.metadata.contentType === 'application/ld+json'; + }, + } as any; + + rule = new ConvertingRouterRule([ + { store: store1, supportChecker: checker1 }, + { store: store2, supportChecker: checker2 }, + ], defaultStore); metadata = new RepresentationMetadata(); representation = { binary: true, data: 'data!' as any, metadata, isEmpty: false }; @@ -32,6 +44,8 @@ describe('A ConvertingRouterRule', (): void => { it('returns the corresponding store if it supports the input.', async(): Promise => { metadata.contentType = 'text/turtle'; await expect(rule.handle({ identifier: { path: 'identifier' }, representation })).resolves.toBe(store1); + metadata.contentType = 'application/ld+json'; + await expect(rule.handle({ identifier: { path: 'identifier' }, representation })).resolves.toBe(store2); }); it('returns the defaultStore if the converter does not support the input.', async(): Promise => { @@ -46,6 +60,7 @@ describe('A ConvertingRouterRule', (): void => { it('returns the defaultStore if no other store has the resource.', async(): Promise => { store1.hasResource = jest.fn().mockImplementationOnce((): any => false); + store2.hasResource = jest.fn().mockImplementationOnce((): any => false); await expect(rule.handle({ identifier: { path: 'identifier' }})).resolves.toBe(defaultStore); });