From 3931d5f6642c8ce8aaa8116a369ccaa1c0d494f6 Mon Sep 17 00:00:00 2001 From: Joachim Van Herwegen Date: Tue, 1 Sep 2020 15:28:41 +0200 Subject: [PATCH] feat: Integrate ChainedConverter into the server --- config/presets/storage_wrapper.json | 30 ++++++++++- index.ts | 4 +- package.json | 2 +- .../RepresentationConverter.test.ts | 51 +++++++++++++++++++ 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 test/integration/RepresentationConverter.test.ts diff --git a/config/presets/storage_wrapper.json b/config/presets/storage_wrapper.json index dce8d1f24..d545df89a 100644 --- a/config/presets/storage_wrapper.json +++ b/config/presets/storage_wrapper.json @@ -24,6 +24,29 @@ } }, + { + "@id": "urn:solid-server:default:ResourceStore_Converting_RdfToQuad", + "@type": "RdfToQuadConverter" + }, + + { + "@id": "urn:solid-server:default:ResourceStore_Converting_QuadToRdf", + "@type": "QuadToRdfConverter" + }, + + { + "@id": "urn:solid-server:default:ResourceStore_Converting_Chained", + "@type": "ChainedConverter", + "ChainedConverter:_converters": [ + { + "@id": "urn:solid-server:default:ResourceStore_Converting_RdfToQuad" + }, + { + "@id": "urn:solid-server:default:ResourceStore_Converting_QuadToRdf" + } + ] + }, + { "@id": "urn:solid-server:default:ResourceStore_Converting", "@type": "RepresentationConvertingStore", @@ -34,10 +57,13 @@ "@type": "CompositeAsyncHandler", "CompositeAsyncHandler:_handlers": [ { - "@type": "RdfToQuadConverter" + "@id": "urn:solid-server:default:ResourceStore_Converting_RdfToQuad" }, { - "@type": "QuadToRdfConverter" + "@id": "urn:solid-server:default:ResourceStore_Converting_QuadToRdf" + }, + { + "@id": "urn:solid-server:default:ResourceStore_Converting_Chained" } ] } diff --git a/index.ts b/index.ts index 64ef4c048..5a2972888 100644 --- a/index.ts +++ b/index.ts @@ -65,11 +65,13 @@ export * from './src/server/HttpRequest'; export * from './src/server/HttpResponse'; // Storage/Conversion +export * from './src/storage/conversion/ChainedConverter'; export * from './src/storage/conversion/QuadToRdfConverter'; -export * from './src/storage/conversion/RdfToQuadConverter'; export * from './src/storage/conversion/QuadToTurtleConverter'; +export * from './src/storage/conversion/RdfToQuadConverter'; export * from './src/storage/conversion/RepresentationConverter'; export * from './src/storage/conversion/TurtleToQuadConverter'; +export * from './src/storage/conversion/TypedRepresentationConverter'; // Storage/Patch export * from './src/storage/patch/PatchHandler'; diff --git a/package.json b/package.json index e92e66f52..4f209030a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ }, "husky": { "hooks": { - "pre-commit": "npm run build && npm run lint && npm run validate && npm run test" + "pre-commit": "npm run build && npm run lint && npm run test" } }, "files": [ diff --git a/test/integration/RepresentationConverter.test.ts b/test/integration/RepresentationConverter.test.ts new file mode 100644 index 000000000..db0a5102b --- /dev/null +++ b/test/integration/RepresentationConverter.test.ts @@ -0,0 +1,51 @@ +import streamifyArray from 'streamify-array'; +import { Representation } from '../../src/ldp/representation/Representation'; +import { ChainedConverter } from '../../src/storage/conversion/ChainedConverter'; +import { QuadToRdfConverter } from '../../src/storage/conversion/QuadToRdfConverter'; +import { RdfToQuadConverter } from '../../src/storage/conversion/RdfToQuadConverter'; +import { DATA_TYPE_BINARY } from '../../src/util/ContentTypes'; +import { readableToString } from '../../src/util/Util'; + +describe('A ChainedConverter', (): void => { + const converters = [ + new RdfToQuadConverter(), + new QuadToRdfConverter(), + ]; + const converter = new ChainedConverter(converters); + + it('can convert from JSON-LD to turtle.', async(): Promise => { + const representation: Representation = { + dataType: DATA_TYPE_BINARY, + data: streamifyArray([ '{"@id": "http://test.com/s", "http://test.com/p": { "@id": "http://test.com/o" }}' ]), + metadata: { raw: [], contentType: 'application/ld+json' }, + }; + + const result = await converter.handleSafe({ + representation, + preferences: { type: [{ value: 'text/turtle', weight: 1 }]}, + identifier: { path: 'path' }, + }); + + await expect(readableToString(result.data)).resolves.toEqual(' .\n'); + expect(result.metadata.contentType).toEqual('text/turtle'); + }); + + it('can convert from turtle to JSON-LD.', async(): Promise => { + const representation: Representation = { + dataType: DATA_TYPE_BINARY, + data: streamifyArray([ ' .' ]), + metadata: { raw: [], contentType: 'text/turtle' }, + }; + + const result = await converter.handleSafe({ + representation, + preferences: { type: [{ value: 'application/ld+json', weight: 1 }]}, + identifier: { path: 'path' }, + }); + + expect(JSON.parse(await readableToString(result.data))).toEqual( + [{ '@id': 'http://test.com/s', 'http://test.com/p': [{ '@id': 'http://test.com/o' }]}], + ); + expect(result.metadata.contentType).toEqual('application/ld+json'); + }); +});