From c38b24777d9e04b42aba81a06db3a290095be002 Mon Sep 17 00:00:00 2001 From: Luka Skukan Date: Thu, 16 Feb 2017 13:26:52 +0100 Subject: [PATCH 1/3] Add Application.getDirectories helper --- lib/resource/Application.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/resource/Application.js b/lib/resource/Application.js index 43f02038..7f12de83 100644 --- a/lib/resource/Application.js +++ b/lib/resource/Application.js @@ -12,6 +12,7 @@ var ApplicationAccountStoreMapping = require('./ApplicationAccountStoreMapping') var AuthenticationResult = require('./AuthenticationResult'); var AuthRequestParser = require('../authc/AuthRequestParser'); var BasicApiAuthenticator = require('../authc/BasicApiAuthenticator'); +var Directory = require('./Directory'); var InstanceResource = require('./InstanceResource'); var OauthAccessTokenAuthenticator = require('../authc/OauthAccessTokenAuthenticator'); var OAuthBasicExchangeAuthenticator = require('../authc/OAuthBasicExchangeAuthenticator'); @@ -1503,4 +1504,39 @@ Application.prototype.getAccountLinkingPolicy = function getApplicationAccountLi return this.dataStore.getResource(this.accountLinkingPolicy.href, args.options, require('./AccountLinkingPolicy'), args.callback); }; +/** + * Retrieves the application's linked {@link Directory} instances. + * + * @param {Function} callback + * The function that will be called when the query is finished, with the parameters + * (err, [{@link Directory}]). + */ +Application.prototype.getDirectories = function getDirectories(/* callback */) { + var self = this; + var args = utils.resolveArgs(arguments, ['callback'], true); + + this.getAccountStoreMappings({expand: 'accountStore'}, function(err, collection) { + if (err) { + return args.callback(err); + } + + return collection.map(function(accountStoreMapping, next) { + next(null, accountStoreMapping.accountStore); + }, function(err, accountStores) { + if (err) { + return args.callback(err); + } + + var directories = accountStores.filter(function(store) { + // Determines which are directories by URL matching + return store && store.href && store.href.match(/\/directories\//); + }).map(function(directoryData) { + return new Directory(directoryData, self.dataStore); + }); + + args.callback(null, directories); + }); + }); +}; + module.exports = Application; From 3de59e3462920831bd32bce5aaba31a8d1c2579e Mon Sep 17 00:00:00 2001 From: Luka Skukan Date: Thu, 16 Feb 2017 14:07:58 +0100 Subject: [PATCH 2/3] Add tests for Application.getDirectories() --- test/sp.resource.application_test.js | 109 +++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/test/sp.resource.application_test.js b/test/sp.resource.application_test.js index 3f7510d5..24ad85a2 100644 --- a/test/sp.resource.application_test.js +++ b/test/sp.resource.application_test.js @@ -9,6 +9,7 @@ var _ = common._; var errorMessages = require('../lib/error/messages'); var utils = require('../lib/utils'); var Account = require('../lib/resource/Account'); +var CollectionResource = require('../lib/resource/CollectionResource'); var Group = require('../lib/resource/Group'); var Tenant = require('../lib/resource/Tenant'); var Directory = require('../lib/resource/Directory'); @@ -1061,6 +1062,114 @@ describe('Resources: ', function () { }); }); + describe('get directories', function () { + var appObj; + var asmsObj; + var app; + + before(function () { + asmsObj = { + href: '/account/store/mappings/href', + limit: 25, + size: 3, + offset: 0, + items: [ + { + href: '/directories/1', + accountStore: { + href: '/directories/1', + name: 'Directory 1' + } + }, + { + href: '/directories/2', + accountStore: { + href: '/directories/2', + name: 'Directory 2' + } + }, + { + href: '/organizations/1', + accountStore: { + href: '/organizations/1', + name: 'Organization 1' + } + } + ] + }; + + appObj = {href: 'application/href', accountStoreMappings: {href: asmsObj.href}}; + app = new Application(appObj, dataStore); + }); + + describe('without errors', function () { + beforeEach(function () { + nock(u.BASE_URL).get(u.v1(asmsObj.href + '?expand=accountStore')).reply(200, asmsObj); + }); + + it('should return a list of directories', function (done) { + app.getDirectories(function (err, dirs) { + if (err) { + return done(err); + } + + assert.instanceOf(dirs, Array); + assert.isOk(dirs[0]); + assert.instanceOf(dirs[0], Directory); + done(); + }); + }); + + it('should not wrap non-directories into Directories', function (done) { + app.getDirectories(function (err, dirs) { + if (err) { + return done(err); + } + + assert.lengthOf(dirs, 2); + + var directoryAsmsData = asmsObj.items.slice(0, 2).map(function (asm) { + return asm.accountStore; + }); + var directoriesBareData = dirs.map(function (dir) { + return { + href: dir.href, + name: dir.name + }; + }); + assert.deepEqual(directoriesBareData, directoryAsmsData); + done(); + }); + }); + }); + + describe('with errors', function () { + var cbSpy; + var errorData; + + beforeEach(function () { + cbSpy = sinon.spy(); + errorData = { + developerMessage: 'explosions', + status: '400' + }; + + nock(u.BASE_URL).get(u.v1(asmsObj.href + '?expand=accountStore')).reply(400, errorData); + }); + + it('should return the error in the callback if one exists', function (done) { + app.getDirectories(function (err, data) { + assert.isOk(err); + assert.isNotOk(data); + assert.equal(err.developerMessage, errorData.developerMessage); + assert.equal(err.status, errorData.status); + + done(); + }); + }); + }); + }); + describe('get default group store', function () { function getDefaultGroupStore(data) { return function () { From 3c2454e869ddfd8cb3d772e719bc3064058a3e20 Mon Sep 17 00:00:00 2001 From: Luka Skukan Date: Thu, 16 Feb 2017 14:37:19 +0100 Subject: [PATCH 3/3] Remove unused import --- test/sp.resource.application_test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/sp.resource.application_test.js b/test/sp.resource.application_test.js index 24ad85a2..907dca9c 100644 --- a/test/sp.resource.application_test.js +++ b/test/sp.resource.application_test.js @@ -9,7 +9,6 @@ var _ = common._; var errorMessages = require('../lib/error/messages'); var utils = require('../lib/utils'); var Account = require('../lib/resource/Account'); -var CollectionResource = require('../lib/resource/CollectionResource'); var Group = require('../lib/resource/Group'); var Tenant = require('../lib/resource/Tenant'); var Directory = require('../lib/resource/Directory');