import { Readable } from 'stream'; import { namedNode, triple } from '@rdfjs/data-model'; import arrayifyStream from 'arrayify-stream'; import streamifyArray from 'streamify-array'; import { Representation } from '../../../../src/ldp/representation/Representation'; import { RepresentationPreferences } from '../../../../src/ldp/representation/RepresentationPreferences'; import { ResourceIdentifier } from '../../../../src/ldp/representation/ResourceIdentifier'; import { RdfToQuadConverter } from '../../../../src/storage/conversion/RdfToQuadConverter'; import { CONTENT_TYPE_QUADS, DATA_TYPE_QUAD } from '../../../../src/util/ContentTypes'; import { UnsupportedHttpError } from '../../../../src/util/errors/UnsupportedHttpError'; describe('A RdfToQuadConverter.test.ts', (): void => { const converter = new RdfToQuadConverter(); const identifier: ResourceIdentifier = { path: 'path' }; it('can handle turtle to quad conversions.', async(): Promise => { const representation = { metadata: { contentType: 'text/turtle' }} as Representation; const preferences: RepresentationPreferences = { type: [{ value: CONTENT_TYPE_QUADS, weight: 1 }]}; await expect(converter.canHandle({ identifier, representation, preferences })).resolves.toBeUndefined(); }); it('can handle JSON-LD to quad conversions.', async(): Promise => { const representation = { metadata: { contentType: 'application/ld+json' }} as Representation; const preferences: RepresentationPreferences = { type: [{ value: CONTENT_TYPE_QUADS, weight: 1 }]}; await expect(converter.canHandle({ identifier, representation, preferences })).resolves.toBeUndefined(); }); it('converts turtle to quads.', async(): Promise => { const representation = { data: streamifyArray([ ' .' ]), metadata: { contentType: 'text/turtle' }, } as Representation; const preferences: RepresentationPreferences = { type: [{ value: CONTENT_TYPE_QUADS, weight: 1 }]}; const result = await converter.handle({ identifier, representation, preferences }); expect(result).toEqual({ data: expect.any(Readable), dataType: DATA_TYPE_QUAD, metadata: { contentType: CONTENT_TYPE_QUADS, }, }); await expect(arrayifyStream(result.data)).resolves.toEqualRdfQuadArray([ triple( namedNode('http://test.com/s'), namedNode('http://test.com/p'), namedNode('http://test.com/o'), ) ]); }); it('converts JSON-LD to quads.', async(): Promise => { const representation = { data: streamifyArray([ '{"@id": "http://test.com/s", "http://test.com/p": { "@id": "http://test.com/o" }}' ]), metadata: { contentType: 'application/ld+json' }, } as Representation; const preferences: RepresentationPreferences = { type: [{ value: CONTENT_TYPE_QUADS, weight: 1 }]}; const result = await converter.handle({ identifier, representation, preferences }); expect(result).toEqual({ data: expect.any(Readable), dataType: DATA_TYPE_QUAD, metadata: { contentType: CONTENT_TYPE_QUADS, }, }); await expect(arrayifyStream(result.data)).resolves.toEqualRdfQuadArray([ triple( namedNode('http://test.com/s'), namedNode('http://test.com/p'), namedNode('http://test.com/o'), ) ]); }); it('throws an UnsupportedHttpError on invalid triple data.', async(): Promise => { const representation = { data: streamifyArray([ '