diff --git a/lib/IAMClient.js b/lib/IAMClient.js index ad31d919..3ed1429b 100644 --- a/lib/IAMClient.js +++ b/lib/IAMClient.js @@ -461,39 +461,41 @@ class VaultClient { } /** - * Get accounts using account ids, canonical ids or email addresses + * Get accounts using account ids or names, canonical ids or email addresses * - * @param {array|undefined} accountIds - Account ids, exclusive with - * emailAddresses and canonicalIds + * @param {array|undefined} accounts - Account ids or names (depending on options.accountNames), + * exclusive with emailAddresses and canonicalIds * @param {array|undefined} emailAddresses - Email addresses, exclusive - * with account ids and canonicalIds + * with account ids or names and canonicalIds * @param {array|undefined} canonicalIds - Canonical ids, exclusive with - * account ids and emailAddresses + * account ids or names and emailAddresses * @param {object} options - Options * @param {string} [options.reqUid] - Request uid + * @param {boolean} [options.accountNames] - Flag to consider first arg `accounts` + * as `accountNames` instead of `accountIds` * @param {function} callback - Callback(err, result) * @return {undefined} */ - getAccounts(accountIds, emailAddresses, canonicalIds, options, callback) { - assert((accountIds && Array.isArray(accountIds)) || !accountIds, - 'accountIds should be an array'); + getAccounts(accounts, emailAddresses, canonicalIds, options, callback) { + assert((accounts && Array.isArray(accounts)) || !accounts, + 'accounts should be an array'); assert((emailAddresses && Array.isArray(emailAddresses)) || !emailAddresses, 'emailAddresses should be an array'); assert((canonicalIds && Array.isArray(canonicalIds)) || !canonicalIds, 'canonicalIds should be an array'); if ( - (accountIds && (emailAddresses || canonicalIds)) - || (emailAddresses && (accountIds || canonicalIds)) - || (canonicalIds && (accountIds || emailAddresses))) { - assert(false, 'accountIds, emailAddresses and canonicalIds ' + (accounts && (emailAddresses || canonicalIds)) + || (emailAddresses && (accounts || canonicalIds)) + || (canonicalIds && (accounts || emailAddresses))) { + assert(false, 'accounts, emailAddresses and canonicalIds ' + 'ids are exclusive'); } const data = { Action: 'GetAccounts', Version: '2010-05-08', }; - if (accountIds) { - data.accountIds = accountIds; + if (accounts) { + data[options.accountNames ? 'accountNames' : 'accountIds'] = accounts; } if (canonicalIds) { data.canonicalIds = canonicalIds; diff --git a/package.json b/package.json index a0c1f0e7..c2c1e38d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "engines": { "node": ">=16" }, - "version": "8.3.15", + "version": "8.3.16", "description": "Client library and binary for Vault, the user directory and key management service", "main": "index.js", "repository": "scality/vaultclient", diff --git a/tests/unit/getAccounts.js b/tests/unit/getAccounts.js new file mode 100644 index 00000000..e4dce2ad --- /dev/null +++ b/tests/unit/getAccounts.js @@ -0,0 +1,62 @@ +/* eslint-disable operator-linebreak */ +'use strict'; // eslint-disable-line + +const assert = require('assert'); +const IAMClient = require('../../lib/IAMClient'); + +const accountIds = ['accountId1', 'accountId2']; +const canonicalIds = ['canId1', 'canId2']; +const emailAddresses = ['email1', 'email2']; +const accountNames = ['name1', 'name2']; +const opt = { reqUid: 'test.getAccounts.reqUid' }; +const optAccountNames = Object.assign({}, opt, { accountNames: true }); +const mockCB = () => {}; + +const expectedData = { + Action: 'GetAccounts', + Version: '2010-05-08', +}; + +describe('getAccounts', () => { + let client; + let spyArg = null; + + beforeEach('spy on request', done => { + client = new IAMClient('127.0.0.1', 8500); + client.request = function spy(...args) { + spyArg = args; + }; + done(); + }); + + afterEach('reset spyArg', () => { spyArg = null; }); + + describe('should send request with correct arguments', () => { + [ + { name: 'accountIds', args: [accountIds, null, null, opt, mockCB] }, + { name: 'emailAddresses', args: [null, emailAddresses, null, opt, mockCB] }, + { name: 'canonicalIds', args: [null, null, canonicalIds, opt, mockCB] }, + { name: 'accountNames', args: [accountNames, null, null, optAccountNames, mockCB] }, + ].forEach(({ name, args }) => it(`for ${name}`, () => { + client.getAccounts(...args); + const [method, path, auth, cb, data, reqUid, contentType] = spyArg; + assert.strictEqual(method, 'GET'); + assert.strictEqual(path, '/'); + assert.strictEqual(auth, false); + assert.strictEqual(cb, mockCB); + assert.strictEqual(reqUid, opt.reqUid); + assert.strictEqual(contentType, null); + assert.deepStrictEqual( + data, + Object.assign({}, expectedData, { [name]: args[0] || args[1] || args[2] }), + ); + })); + }); + + describe('should throw with invalid arguments', () => { + it('for all values set', () => { + assert.throws(() => client.getAccounts(accountIds, emailAddresses, canonicalIds, opt, mockCB), + assert.AssertionError); + }); + }); +});