Skip to content

Commit

Permalink
feat: list.map function in ListResource CMS-2609
Browse files Browse the repository at this point in the history
  • Loading branch information
simon-scherzinger committed May 23, 2017
1 parent 158a8e7 commit f131469
Show file tree
Hide file tree
Showing 4 changed files with 328 additions and 3 deletions.
23 changes: 23 additions & 0 deletions src/resources/ListResource.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,25 @@ const listClassSymbol = Symbol('_listClass');
const itemClassSymbol = Symbol('_itemClass');
const itemSchemaSymbol = Symbol('_itmeSchema');

function map(list, iterator, results = []) {
return list.getAllItems().map(entry =>
res =>
Promise.resolve()
.then(() => iterator(entry))
.then((result) => {
res.push(result);
return res;
}))
.reduce((current, next) => current.then(next), Promise.resolve(results))
.then((res) => {
if (!list.hasNextLink()) {
return res;
}
return list.followNextLink()
.then(next => map(next, iterator, res));
});
}

/**
* Generic list resource class. Represents {@link
* https://tools.ietf.org/html/draft-kelly-json-hal-08 HAL resources} with added support for lists.
Expand Down Expand Up @@ -161,6 +180,10 @@ export default class ListResource extends Resource {
followPrevLink() {
return this.followLink('prev', this[listClassSymbol], this[nameSymbol], this[itemSchemaSymbol]);
}

map(iterator) {
return map(this, iterator);
}
}

/**
Expand Down
30 changes: 29 additions & 1 deletion test/ListResource.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ const chaiAsPromised = require('chai-as-promised');
const fs = require('fs');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const nock = require('nock');

const core = require('../lib/Core');
const helper = require('../lib/helper');
const resolver = require('./mocks/resolver');
const Resource = require('../lib/resources/Resource').default;
Expand All @@ -15,6 +15,7 @@ const ListResource = require('../lib/resources/ListResource').default;
chai.should();
chai.use(sinonChai);
chai.use(chaiAsPromised);
nock.disableNetConnect();

describe('ListResource', () => {
let listJson;
Expand Down Expand Up @@ -147,4 +148,31 @@ describe('ListResource', () => {
spy.restore();
});
});

it('should map over entries, sync iterator', () => {
nock('https://datamanager.entrecode.de')
.get('/?title~=test&size=2')
.replyWithFile(200, `${__dirname}/mocks/dm-list.json`, { 'Content-Type': 'application/json' })
.get('/?title~=test&size=2&page=2')
.replyWithFile(200, `${__dirname}/mocks/dm-list-page.json`, { 'Content-Type': 'application/json' });

return list.map(dm => dm.getProperty('dataManagerID'))
.then((result) => {
result.should.be.array;
result.length.should.be.equal(4);
});
});
it('should map over entries, promise iterator', () => {
nock('https://datamanager.entrecode.de')
.get('/?title~=test&size=2')
.replyWithFile(200, `${__dirname}/mocks/dm-list.json`, { 'Content-Type': 'application/json' })
.get('/?title~=test&size=2&page=2')
.replyWithFile(200, `${__dirname}/mocks/dm-list-page.json`, { 'Content-Type': 'application/json' });

return list.map(dm => Promise.resolve(dm.getProperty('dataManagerID')))
.then((result) => {
result.should.be.array;
result.length.should.be.equal(4);
});
});
});
259 changes: 259 additions & 0 deletions test/mocks/dm-list-page.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,259 @@
{
"msg": "Welcome to entrecode Data Manager v0.12.13 (w14261, write)",
"count": 2,
"total": 4,
"_links": {
"self": {
"profile": "https://entrecode.de/schema/datamanagers",
"href": "https://datamanager.entrecode.de/?title~=test&page=2&size=2"
},
"curies": {
"href": "https://doc.entrecode.de/data_manager/#relation-{rel}",
"templated": true
},
"ec:datamanager/by-id": {
"profile": "https://entrecode.de/schema/datamanager",
"href": "https://datamanager.entrecode.de/{?dataManagerID}",
"templated": true
},
"ec:datamanagers/new-from-template": {
"profile": "https://entrecode.de/schema/datamanager",
"href": "https://datamanager.entrecode.de/?_templateID={templateID}",
"templated": true
},
"ec:dm-stats": {
"href": "https://datamanager.entrecode.de/stats{?dataManagerID}",
"templated": true
},
"ec:dm-templates": {
"profile": "https://entrecode.de/schema/dm-templates",
"href": "https://datamanager.entrecode.de/template"
},
"ec:dm-template/by-id": {
"profile": "https://entrecode.de/schema/dm-template",
"href": "https://datamanager.entrecode.de/template{?templateID}",
"templated": true
},
"ec:dm-templates/options": {
"href": "https://datamanager.entrecode.de/template{?name,name~,page,parentName,parentName~,parentTemplate,parentVersion,parentVersionFrom,parentVersionTo,size,sort,templateID,version,versionFrom,versionTo}",
"templated": true
},
"ec:datamanagers/options": {
"href": "https://datamanager.entrecode.de/{?created,createdFrom,createdTo,created~,datamanagerid,description~,page,size,sort,title,title~}",
"templated": true
},
"prev": {
"href": "https://datamanager.entrecode.de/?title~=test&size=2"
},
"first": {
"href": "https://datamanager.entrecode.de/?title~=test&size=2"
}
},
"_embedded": {
"ec:datamanager": [
{
"created": "2015-11-23T15:55:19.148Z",
"dataManagerID": "7e2fd960-b8ab-419f-8c8f-90da12b2a9d0",
"defaultLocale": null,
"description": "This Data Manager contains test data for the ec.datamanager javascript SDK. (Allow all public rights).",
"config": {
"users": {
"google": null,
"facebook": null,
"password": true,
"anonymous": true
}
},
"hexColor": "#9B2FAE",
"locales": [],
"rights": [],
"publicAssetRights": [
"get",
"put",
"postPrivate",
"postPublic",
"getTags",
"editTags"
],
"shortID": "58b9a1f5",
"title": "ec.datamanager-sdk-tests-1",
"_links": {
"self": {
"profile": "https://entrecode.de/schema/datamanager",
"href": "https://datamanager.entrecode.de/?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0",
"title": "ec.datamanager-sdk-tests-1"
},
"collection": {
"profile": "https://entrecode.de/schema/datamanagers",
"href": "https://datamanager.entrecode.de"
},
"ec:api": {
"href": "https://datamanager.entrecode.de/api/58b9a1f5"
},
"ec:api-doc": {
"href": "https://datamanager.entrecode.de/api/doc/58b9a1f5"
},
"ec:api-doc/build": {
"href": "https://datamanager.entrecode.de/api/doc/58b9a1f5/generate"
},
"ec:assets": {
"profile": "https://entrecode.de/schema/assets",
"href": "https://datamanager.entrecode.de/asset?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
},
"ec:assets/options": {
"href": "https://datamanager.entrecode.de/asset{?assetID,created,createdFrom,createdTo,created~,creator,dataManagerID,deleted,deletedFrom,deletedTo,deleted~,page,size,sort,tag,title,title~,type,type~}",
"templated": true
},
"ec:models": {
"profile": "https://entrecode.de/schema/models",
"href": "https://datamanager.entrecode.de/model?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
},
"ec:models/options": {
"href": "https://datamanager.entrecode.de/model{?dataManagerID,modelID,page,size,sort,title,titleFrom,titleTo,title~}",
"templated": true
},
"ec:dm-clients": {
"profile": "https://entrecode.de/schema/dm-clients",
"href": "https://datamanager.entrecode.de/client?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
},
"ec:dm-clients/options": {
"href": "https://datamanager.entrecode.de/client{?callbackURL,callbackURL~,clientID,clientID~,dataManagerID,datamanagerid,page,size,sort}",
"templated": true
},
"ec:dm-accounts": {
"profile": "https://entrecode.de/schema/dm-accounts",
"href": "https://datamanager.entrecode.de/account?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
},
"ec:dm-accounts/options": {
"href": "https://datamanager.entrecode.de/account{?accountID,accountID~,dataManagerID,email,email~,hasPassword,page,roles,size,sort}",
"templated": true
},
"ec:dm-roles": {
"profile": "https://entrecode.de/schema/dm-roles",
"href": "https://datamanager.entrecode.de/role?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
},
"ec:dm-role/by-id": {
"profile": "https://entrecode.de/schema/dm-role-template",
"href": "https://datamanager.entrecode.de/role{?roleID}"
},
"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
},
"ec:datamanager/export": {
"href": "https://datamanager.entrecode.de/export?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
},
"ec:datamanager/update-from-template": {
"href": "https://datamanager.entrecode.de/?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0&_templateID={templateID}",
"templated": true
},
"ec:dm-stats": {
"href": "https://datamanager.entrecode.de/stats?dataManagerID=7e2fd960-b8ab-419f-8c8f-90da12b2a9d0"
}
}
},
{
"created": "2015-10-07T12:09:20.491Z",
"dataManagerID": "48e18a34-cf64-4f4a-bc47-45323a7f0e44",
"defaultLocale": "de-DE",
"description": "hier kann alles getestet werden",
"config": {
"users": {
"google": null,
"facebook": null,
"password": true,
"anonymous": true
}
},
"hexColor": "#F1453D",
"locales": [
"de-DE"
],
"rights": [],
"publicAssetRights": [
"get",
"getTags",
"put",
"postprivate",
"postPublic"
],
"shortID": "01bd8e08",
"title": "Test DM",
"_links": {
"self": {
"profile": "https://entrecode.de/schema/datamanager",
"href": "https://datamanager.entrecode.de/?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44",
"title": "Test DM"
},
"collection": {
"profile": "https://entrecode.de/schema/datamanagers",
"href": "https://datamanager.entrecode.de"
},
"ec:api": {
"href": "https://datamanager.entrecode.de/api/01bd8e08"
},
"ec:api-doc": {
"href": "https://datamanager.entrecode.de/api/doc/01bd8e08"
},
"ec:api-doc/build": {
"href": "https://datamanager.entrecode.de/api/doc/01bd8e08/generate"
},
"ec:assets": {
"profile": "https://entrecode.de/schema/assets",
"href": "https://datamanager.entrecode.de/asset?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44"
},
"ec:assets/options": {
"href": "https://datamanager.entrecode.de/asset{?assetID,created,createdFrom,createdTo,created~,creator,dataManagerID,deleted,deletedFrom,deletedTo,deleted~,page,size,sort,tag,title,title~,type,type~}",
"templated": true
},
"ec:models": {
"profile": "https://entrecode.de/schema/models",
"href": "https://datamanager.entrecode.de/model?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44"
},
"ec:models/options": {
"href": "https://datamanager.entrecode.de/model{?dataManagerID,modelID,page,size,sort,title,titleFrom,titleTo,title~}",
"templated": true
},
"ec:dm-clients": {
"profile": "https://entrecode.de/schema/dm-clients",
"href": "https://datamanager.entrecode.de/client?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44"
},
"ec:dm-clients/options": {
"href": "https://datamanager.entrecode.de/client{?callbackURL,callbackURL~,clientID,clientID~,dataManagerID,datamanagerid,page,size,sort}",
"templated": true
},
"ec:dm-accounts": {
"profile": "https://entrecode.de/schema/dm-accounts",
"href": "https://datamanager.entrecode.de/account?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44"
},
"ec:dm-accounts/options": {
"href": "https://datamanager.entrecode.de/account{?accountID,accountID~,dataManagerID,email,email~,hasPassword,page,roles,size,sort}",
"templated": true
},
"ec:dm-roles": {
"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-template",
"href": "https://datamanager.entrecode.de/role{?roleID}"
},
"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
},
"ec:datamanager/export": {
"href": "https://datamanager.entrecode.de/export?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44"
},
"ec:datamanager/update-from-template": {
"href": "https://datamanager.entrecode.de/?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44&_templateID={templateID}",
"templated": true
},
"ec:dm-stats": {
"href": "https://datamanager.entrecode.de/stats?dataManagerID=48e18a34-cf64-4f4a-bc47-45323a7f0e44"
}
}
}
]
}
}
Loading

0 comments on commit f131469

Please sign in to comment.