diff --git a/src/resources/datamanager/DataManagerResource.js b/src/resources/datamanager/DataManagerResource.js index 4c5550c8..25d3c0d8 100644 --- a/src/resources/datamanager/DataManagerResource.js +++ b/src/resources/datamanager/DataManagerResource.js @@ -1,3 +1,5 @@ +import validator from 'json-schema-remote'; + import superagent from 'superagent'; import * as qs from 'querystring'; @@ -410,9 +412,10 @@ export default class DataManagerResource extends Resource { if (!role) { throw new Error('Cannot create resource with undefined object.'); } - // TODO schema validation - return post(this.newRequest().follow('ec:dm-roles'), role); + return this.resource.link('ec:dm-role/by-id'); }) + .then(link => validator.validate(role, `${link.profile}-template`)) + .then(() => post(this.newRequest().follow('ec:dm-roles'), role)) .then(([dm, traversal]) => new RoleResource(dm, this.environment, traversal)); } diff --git a/test/datamanager/DataManager.test.js b/test/datamanager/DataManager.test.js index edf7a1bc..f8727125 100644 --- a/test/datamanager/DataManager.test.js +++ b/test/datamanager/DataManager.test.js @@ -577,20 +577,24 @@ describe('DataManager Resource', () => { return resolve(JSON.parse(res)); }); }) - .then((clientJSON) => { - stub.returns(Promise.resolve([clientJSON, resource.traversal])); + .then((res) => { + stub.returns(Promise.resolve([res, resource.traversal])); const create = Object.assign({}, { - name: resource.name, - label: resource.label, - addUnregistered: resource.addUnregistered, - addRegistered: resource.addRegistered, - accounts: resource.accounts, + name: res.name, + label: res.label, + addUnregistered: res.addUnregistered, + addRegistered: res.addRegistered, + accounts: res.accounts, }); return resource.createRole(create); }) .then(() => { stub.should.be.called.once; stub.restore(); + }) + .catch((err) => { + stub.restore(); + throw err; }); }); it('should be rejected on undefined client', () => { diff --git a/test/mocks/dm-single.json b/test/mocks/dm-single.json index c352fa8e..9abbc8d5 100644 --- a/test/mocks/dm-single.json +++ b/test/mocks/dm-single.json @@ -72,6 +72,11 @@ "profile": "https://entrecode.de/schema/dm-roles", "href": "https://datamanager.entrecode.de/role?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44" }, + "ec:dm-role/by-id": { + "profile": "https://entrecode.de/schema/dm-role", + "href": "https://datamanager.entrecode.de/role{?roldeID}", + "templated": true + }, "ec:dm-roles/options": { "href": "https://datamanager.entrecode.de/role{?accounts,addRegistered,addUnregistered,dataManagerID,label,label~,name,name~,page,roleID,roleID~,size,sort}", "templated": true diff --git a/test/mocks/nock.js b/test/mocks/nock.js index d93a6432..57dca553 100644 --- a/test/mocks/nock.js +++ b/test/mocks/nock.js @@ -8,6 +8,7 @@ module.exports = { .get('/datamanager').replyWithFile(200, `${__dirname}/schema/dm.json`) .get('/datamanager-template').replyWithFile(200, `${__dirname}/schema/dm-template.json`) .get('/dm-template-template').replyWithFile(200, `${__dirname}/schema/dm-template-template.json`) + .get('/dm-role-template').replyWithFile(200, `${__dirname}/schema/dm-role-template.json`) .get('/datetime').replyWithFile(200, `${__dirname}/schema/datetime.json`) .get('/uuidV4').replyWithFile(200, `${__dirname}/schema/uuidV4.json`) .get('/locale').replyWithFile(200, `${__dirname}/schema/locale.json`) diff --git a/test/mocks/schema/dm-role-template.json b/test/mocks/schema/dm-role-template.json new file mode 100644 index 00000000..46c98236 --- /dev/null +++ b/test/mocks/schema/dm-role-template.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "https://entrecode.de/schema/dm-role", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "addUnregistered": { + "type": "boolean" + }, + "addRegistered": { + "type": "boolean" + }, + "accounts": { + "type": "array", + "items": { + "$ref": "https://entrecode.de/schema/uuidV4" + } + } + } +}