From d04ab2951bbb57ac8e0df5bf54252294af383262 Mon Sep 17 00:00:00 2001 From: Joachim Van Herwegen Date: Fri, 30 Apr 2021 10:31:11 +0200 Subject: [PATCH] test: Merge LdpHandlerOperation with LdpHandlerWithoutAuth --- .../integration/LdpHandlerWithoutAuth.test.ts | 53 +++- test/integration/LpdHandlerOperations.test.ts | 231 ------------------ 2 files changed, 51 insertions(+), 233 deletions(-) delete mode 100644 test/integration/LpdHandlerOperations.test.ts diff --git a/test/integration/LdpHandlerWithoutAuth.test.ts b/test/integration/LdpHandlerWithoutAuth.test.ts index 57916be16..56499ef4b 100644 --- a/test/integration/LdpHandlerWithoutAuth.test.ts +++ b/test/integration/LdpHandlerWithoutAuth.test.ts @@ -6,7 +6,7 @@ import { joinFilePath, PIM, RDF } from '../../src/'; import type { Initializer, ResourceStore } from '../../src/'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { LDP } from '../../src/util/Vocabularies'; -import { deleteResource, expectQuads, getResource, postResource, putResource } from '../util/FetchUtil'; +import { deleteResource, expectQuads, getResource, patchResource, postResource, putResource } from '../util/FetchUtil'; import { getPort } from '../util/Util'; import { getTestFolder, instantiateFromConfig, removeFolder } from './Config'; const { literal, namedNode, quad } = DataFactory; @@ -26,7 +26,7 @@ const stores: [string, any][] = [ }], ]; -describe.each(stores)('An LDP handler allowing all request %s', (name, { storeUrn, teardown }): void => { +describe.each(stores)('An LDP handler allowing all requests %s', (name, { storeUrn, teardown }): void => { let server: Server; let initializer: Initializer; let factory: HttpServerFactory; @@ -271,4 +271,53 @@ describe.each(stores)('An LDP handler allowing all request %s', (name, { storeUr // DELETE expect(await deleteResource(documentUrl)).toBeUndefined(); }); + + it('can handle simple SPARQL updates.', async(): Promise => { + // POST + const body = [ ' .', + ' .' ].join('\n'); + let response = await postResource(baseUrl, { contentType: 'text/turtle', body }); + const documentUrl = response.headers.get('location')!; + + // PATCH + const query = [ 'DELETE { }', + 'INSERT { }', + 'WHERE {}', + ].join('\n'); + await patchResource(documentUrl, query); + + // PATCH using a content-type header with charset + const query2 = [ 'DELETE { }', + 'INSERT {<#s4> <#p4> <#o4>}', + 'WHERE {}', + ].join('\n'); + response = await fetch(documentUrl, { + method: 'PATCH', + headers: { + 'content-type': 'application/sparql-update ; charset=UTF-8', + }, + body: query2, + }); + await expect(response.text()).resolves.toHaveLength(0); + expect(response.status).toBe(205); + + // GET + response = await getResource(documentUrl); + const expected = [ + quad( + namedNode('http://test.com/s3'), + namedNode('http://test.com/p3'), + namedNode('http://test.com/o3'), + ), + quad( + namedNode(`${documentUrl}#s4`), + namedNode(`${documentUrl}#p4`), + namedNode(`${documentUrl}#o4`), + ), + ]; + await expectQuads(response, expected, true); + + // DELETE + expect(await deleteResource(documentUrl)).toBeUndefined(); + }); }); diff --git a/test/integration/LpdHandlerOperations.test.ts b/test/integration/LpdHandlerOperations.test.ts deleted file mode 100644 index 829c20efd..000000000 --- a/test/integration/LpdHandlerOperations.test.ts +++ /dev/null @@ -1,231 +0,0 @@ -import 'jest-rdf'; -import * as url from 'url'; -import { namedNode, quad } from '@rdfjs/data-model'; -import { Parser } from 'n3'; -import type { MockResponse } from 'node-mocks-http'; -import type { HttpHandler } from '../../src/server/HttpHandler'; -import { LDP } from '../../src/util/Vocabularies'; -import { performRequest } from '../util/Util'; -import { BASE, instantiateFromConfig } from './Config'; - -describe('An integrated AuthenticatedLdpHandler', (): void => { - let handler: HttpHandler; - - beforeAll(async(): Promise => { - handler = await instantiateFromConfig( - 'urn:solid-server:default:LdpHandler', 'server-without-auth.json', { - 'urn:solid-server:default:variable:baseUrl': BASE, - }, - ) as HttpHandler; - - // The tests depend on there being a root container here - await performRequest( - handler, - new URL('http://test.com/'), - 'PUT', - { 'content-type': 'text/turtle', 'transfer-encoding': 'chunked' }, - [ ], - ); - }); - - it('can add, read and delete data based on incoming requests.', async(): Promise => { - // POST - let requestUrl = new URL('http://test.com/'); - let response: MockResponse = await performRequest( - handler, - requestUrl, - 'POST', - { 'content-type': 'text/turtle', 'transfer-encoding': 'chunked' }, - [ ' .' ], - ); - expect(response.statusCode).toBe(201); - expect(response._getData()).toHaveLength(0); - const id = response._getHeaders().location; - expect(id).toContain(url.format(requestUrl)); - - // GET - requestUrl = new URL(id); - response = await performRequest( - handler, - requestUrl, - 'GET', - { accept: 'text/turtle' }, - [], - ); - expect(response.statusCode).toBe(200); - expect(response._getData()).toContain( - ' .', - ); - expect(response.getHeaders().link).toContain(`<${LDP.Resource}>; rel="type"`); - expect(response.getHeaders().link).toContain(`<${id}.acl>; rel="acl"`); - - // DELETE - response = await performRequest(handler, requestUrl, 'DELETE', {}, []); - expect(response.statusCode).toBe(205); - expect(response._getData()).toHaveLength(0); - - // GET - response = await performRequest( - handler, - requestUrl, - 'GET', - { accept: 'text/turtle' }, - [], - ); - expect(response.statusCode).toBe(404); - expect(response._getData()).toContain('NotFoundHttpError'); - }); - - it('can handle simple SPARQL updates.', async(): Promise => { - // POST - let requestUrl = new URL('http://test.com/'); - let response: MockResponse = await performRequest( - handler, - requestUrl, - 'POST', - { 'content-type': 'text/turtle', 'transfer-encoding': 'chunked' }, - [ ' .', - ' .' ], - ); - expect(response.statusCode).toBe(201); - expect(response._getData()).toHaveLength(0); - const id = response._getHeaders().location; - expect(id).toContain(url.format(requestUrl)); - - // PATCH - requestUrl = new URL(id); - response = await performRequest( - handler, - requestUrl, - 'PATCH', - { 'content-type': 'application/sparql-update', 'transfer-encoding': 'chunked' }, - [ 'DELETE { }', - 'INSERT { }', - 'WHERE {}', - ], - ); - expect(response.statusCode).toBe(205); - expect(response._getData()).toHaveLength(0); - - // PATCH using a content-type header with charset - requestUrl = new URL(id); - response = await performRequest( - handler, - requestUrl, - 'PATCH', - { 'content-type': ' application/sparql-update ; charset=UTF-8', 'transfer-encoding': 'chunked' }, - [ 'DELETE { }', - 'INSERT { }', - 'WHERE {}', - ], - ); - expect(response.statusCode).toBe(205); - expect(response._getData()).toHaveLength(0); - - // GET - response = await performRequest(handler, requestUrl, 'GET', { accept: 'text/turtle' }, []); - expect(response.statusCode).toBe(200); - expect(response._getData()).toContain( - ' .', - ); - expect(response.getHeaders().link).toContain(`<${LDP.Resource}>; rel="type"`); - expect(response.getHeaders().link).toContain(`<${id}.acl>; rel="acl"`); - const parser = new Parser(); - let triples = parser.parse(response._getData()); - expect(triples).toBeRdfIsomorphic([ - quad( - namedNode('http://test.com/s2'), - namedNode('http://test.com/p2'), - namedNode('http://test.com/o2'), - ), - quad( - namedNode('http://test.com/s3'), - namedNode('http://test.com/p3'), - namedNode('http://test.com/o3'), - ), - ]); - - // PATCH - response = await performRequest( - handler, - requestUrl, - 'PATCH', - { 'content-type': 'application/sparql-update', 'transfer-encoding': 'chunked' }, - [ 'DELETE DATA { }; ', - 'INSERT DATA { }', - ], - ); - expect(response.statusCode).toBe(205); - expect(response._getData()).toHaveLength(0); - - // GET - response = await performRequest(handler, requestUrl, 'GET', { accept: 'text/turtle' }, []); - expect(response.statusCode).toBe(200); - triples = parser.parse(response._getData()); - expect(triples).toBeRdfIsomorphic([ - quad( - namedNode('http://test.com/s3'), - namedNode('http://test.com/p3'), - namedNode('http://test.com/o3'), - ), - quad( - namedNode('http://test.com/s4'), - namedNode('http://test.com/p4'), - namedNode('http://test.com/o4'), - ), - ]); - }); - - it('should overwrite the content on PUT request.', async(): Promise => { - // POST - let requestUrl = new URL('http://test.com/'); - let response: MockResponse = await performRequest( - handler, - requestUrl, - 'POST', - { 'content-type': 'text/turtle', 'transfer-encoding': 'chunked' }, - [ - ' .', - ' .', - ], - ); - expect(response.statusCode).toBe(201); - expect(response._getData()).toHaveLength(0); - const id = response._getHeaders().location; - expect(id).toContain(url.format(requestUrl)); - - // PUT - requestUrl = new URL(id); - response = await performRequest( - handler, - requestUrl, - 'PUT', - { 'content-type': 'text/turtle', 'transfer-encoding': 'chunked' }, - [ ' .' ], - ); - expect(response.statusCode).toBe(205); - expect(response._getData()).toHaveLength(0); - - // GET - requestUrl = new URL(id); - response = await performRequest( - handler, - requestUrl, - 'GET', - { accept: 'text/turtle' }, - [], - ); - expect(response.statusCode).toBe(200); - expect(response.getHeaders().link).toContain(`<${LDP.Resource}>; rel="type"`); - expect(response.getHeaders().link).toContain(`<${id}.acl>; rel="acl"`); - const parser = new Parser(); - const triples = parser.parse(response._getData()); - expect(triples).toBeRdfIsomorphic([ - quad( - namedNode('http://test.com/s3'), - namedNode('http://test.com/p3'), - namedNode('http://test.com/o3'), - ), - ]); - }); -});