From 856cb2e595b5086f1ea5bbc18b505bc635335707 Mon Sep 17 00:00:00 2001 From: Tia Esguerra Date: Thu, 20 Nov 2025 13:38:56 -0800 Subject: [PATCH 1/2] feat: add support for dedicated_for parameter in update_access_key --- lib/provisioning/account.js | 14 ++++-- .../api/provisioning/access_keys_spec.js | 47 +++++++++++++++---- types/index.d.ts | 3 +- 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/lib/provisioning/account.js b/lib/provisioning/account.js index f2c8566c..cdc92b3a 100644 --- a/lib/provisioning/account.js +++ b/lib/provisioning/account.js @@ -331,10 +331,16 @@ function generate_access_key(sub_account_id, options = {}, callback) { * @param [callback] {function} */ function update_access_key(sub_account_id, api_key, options = {}, callback) { - const params = pickOnlyExistingValues({ - name: options.name, - enabled: options.enabled - }, 'name', 'enabled'); + const params = pickOnlyExistingValues( + { + name: options.name, + enabled: options.enabled, + dedicated_for: options.dedicated_for + }, + 'name', + 'enabled', + 'dedicated_for' + ); options.content_type = "json"; const uri = ['sub_accounts', sub_account_id, 'access_keys', api_key]; return call_account_api('PUT', uri, params, callback, options); diff --git a/test/integration/api/provisioning/access_keys_spec.js b/test/integration/api/provisioning/access_keys_spec.js index cf525e90..569c7ba1 100644 --- a/test/integration/api/provisioning/access_keys_spec.js +++ b/test/integration/api/provisioning/access_keys_spec.js @@ -1,9 +1,11 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ +/* eslint-disable no-tabs */ const cloudinary = require("../../../../cloudinary"); const TIMEOUT = require('../../../testUtils/testConstants').TIMEOUT; let runOnlyForInternalPRs = process.env.TRAVIS_SECURE_ENV_VARS ? describe : describe.skip; -describe.skip('Provisioning API - Access Keys Management', function () { +describe('Provisioning API - Access Keys Management', function () { let CLOUD_SECRET; let CLOUD_API; let CLOUD_NAME; @@ -11,7 +13,7 @@ describe.skip('Provisioning API - Access Keys Management', function () { let CLOUD_NAME_PREFIX = `justaname${process.hrtime()[1] % 10000}`; this.timeout(TIMEOUT.LONG); - before("Setup the required test", async () => { + before("Setup the required test", async function (){ let config = cloudinary.config(true); if (!(config.provisioning_api_key && config.provisioning_api_secret && config.account_id)) { // For external PRs the env variables are not availble, so we skip the provisioning API @@ -86,16 +88,45 @@ describe.skip('Provisioning API - Access Keys Management', function () { expect(Object.keys(accessKeys.access_keys[0])).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); }); - it('Update access key', async () => { - const keyName = `test-access-key-${Date.now()}` - const newAccessKey = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName }); - expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + it("Update access key", async () => { + const keyName = `test-access-key-${Date.now()}`; + const newAccessKey = + await cloudinary.provisioning.account.generate_access_key( + CLOUD_ID, + { name: keyName, enabled: false } + ); + expect(Object.keys(newAccessKey)).to.eql([ + "name", + "api_key", + "api_secret", + "created_at", + "updated_at", + "enabled" + ]); expect(newAccessKey.name).to.eql(keyName); + expect(newAccessKey.enabled).to.eql(false); const newName = `${keyName}-updated`; - const updatedAccessKey = await cloudinary.provisioning.account.update_access_key(CLOUD_ID, newAccessKey.api_key, { name: newName }); - expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + const updatedAccessKey = + await cloudinary.provisioning.account.update_access_key( + CLOUD_ID, + newAccessKey.api_key, + { name: newName, enabled: true, dedicated_for: "webhooks" } + ); + expect(Object.keys(updatedAccessKey)).to.eql([ + "name", + "api_key", + "api_secret", + "created_at", + "updated_at", + "enabled", + "dedicated_for" + ]); expect(updatedAccessKey.name).to.eql(newName); + expect(updatedAccessKey.enabled).to.eql(true); + expect(updatedAccessKey.dedicated_for).to.be.an("array"); + expect(updatedAccessKey.dedicated_for.length).to.eql(1); + expect(updatedAccessKey.dedicated_for[0]).to.eql("webhooks"); }); it('Delete access keys', async () => { diff --git a/types/index.d.ts b/types/index.d.ts index 601be7cd..4651594a 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1533,7 +1533,8 @@ declare module 'cloudinary' { function update_access_key(subAccountId: string, apiKey: string, options?: ProvisioningApiOptions | { name?: string, - enabled?: boolean + enabled?: boolean, + dedicated_for?: string }, callback?: ResponseCallback): Promise; function delete_access_key(subAccountId: string, apiKey: string, options?: ProvisioningApiOptions, callback?: ResponseCallback): Promise; From d0ba38fb73fb414e795dfb65e6ee8f40f8bbda07 Mon Sep 17 00:00:00 2001 From: cloudinary-pkoniu Date: Fri, 21 Nov 2025 16:55:32 +0100 Subject: [PATCH 2/2] chore: provisioning api local testing fixed --- package.json | 1 + .../api/provisioning/access_keys_spec.js | 49 ++++++++++--------- .../api/provisioning/account_spec.js | 5 +- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 4d505c8c..9bfa84d9 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "scripts": { "test": "tools/scripts/test.sh", "test:unit": "tools/scripts/test.es6.unit.sh", + "test:provisioning": "mocha \"./test/integration/api/provisioning/*.js\"", "test-with-temp-cloud": "tools/scripts/tests-with-temp-cloud.sh", "dtslint": "tools/scripts/ditslint.sh", "lint": "tools/scripts/lint.sh", diff --git a/test/integration/api/provisioning/access_keys_spec.js b/test/integration/api/provisioning/access_keys_spec.js index 569c7ba1..76c26255 100644 --- a/test/integration/api/provisioning/access_keys_spec.js +++ b/test/integration/api/provisioning/access_keys_spec.js @@ -1,11 +1,10 @@ /* eslint-disable no-mixed-spaces-and-tabs */ /* eslint-disable no-tabs */ const cloudinary = require("../../../../cloudinary"); +const expect = require('expect.js'); const TIMEOUT = require('../../../testUtils/testConstants').TIMEOUT; -let runOnlyForInternalPRs = process.env.TRAVIS_SECURE_ENV_VARS ? describe : describe.skip; - -describe('Provisioning API - Access Keys Management', function () { +describe.skip('Provisioning API - Access Keys Management', function () { let CLOUD_SECRET; let CLOUD_API; let CLOUD_NAME; @@ -50,30 +49,30 @@ describe('Provisioning API - Access Keys Management', function () { const accessKeys = await cloudinary.provisioning.account.access_keys(CLOUD_ID); expect(Object.keys(accessKeys)).to.eql(['access_keys', 'total']); expect(accessKeys.access_keys.length).to.eql(1); - expect(Object.keys(accessKeys.access_keys[0])).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(accessKeys.access_keys[0])).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); }); it('Generate new access key', async () => { const keyName = `test-access-key-${Date.now()}` const newAccessKey = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName }); - expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); expect(newAccessKey.name).to.eql(keyName); }); it('List access keys with optional query params', async () => { const keyName1 = `A-test-access-key-${Date.now()}` const newAccessKey1 = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName1 }); - expect(Object.keys(newAccessKey1)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(newAccessKey1)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); expect(newAccessKey1.name).to.eql(keyName1); const keyName2 = `B-test-access-key-${Date.now()}` const newAccessKey2 = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName2 }); - expect(Object.keys(newAccessKey2)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(newAccessKey2)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); expect(newAccessKey2.name).to.eql(keyName2); const keyName3 = `C-test-access-key-${Date.now()}` const newAccessKey3 = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName3 }); - expect(Object.keys(newAccessKey3)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(newAccessKey3)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); expect(newAccessKey3.name).to.eql(keyName3); const pageSize = 2; @@ -85,7 +84,7 @@ describe('Provisioning API - Access Keys Management', function () { }); expect(Object.keys(accessKeys)).to.eql(['access_keys', 'total']); expect(accessKeys.access_keys.length).to.eql(pageSize); - expect(Object.keys(accessKeys.access_keys[0])).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(accessKeys.access_keys[0])).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); }); it("Update access key", async () => { @@ -96,12 +95,13 @@ describe('Provisioning API - Access Keys Management', function () { { name: keyName, enabled: false } ); expect(Object.keys(newAccessKey)).to.eql([ - "name", - "api_key", - "api_secret", - "created_at", - "updated_at", - "enabled" + 'name', + 'api_key', + 'api_secret', + 'created_at', + 'updated_at', + 'enabled', + 'root' ]); expect(newAccessKey.name).to.eql(keyName); expect(newAccessKey.enabled).to.eql(false); @@ -114,13 +114,14 @@ describe('Provisioning API - Access Keys Management', function () { { name: newName, enabled: true, dedicated_for: "webhooks" } ); expect(Object.keys(updatedAccessKey)).to.eql([ - "name", - "api_key", - "api_secret", - "created_at", - "updated_at", - "enabled", - "dedicated_for" + 'name', + 'api_key', + 'api_secret', + 'created_at', + 'updated_at', + 'enabled', + 'dedicated_for', + 'root' ]); expect(updatedAccessKey.name).to.eql(newName); expect(updatedAccessKey.enabled).to.eql(true); @@ -132,7 +133,7 @@ describe('Provisioning API - Access Keys Management', function () { it('Delete access keys', async () => { const keyName = `test-access-key-${Date.now()}` const newAccessKey = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName }); - expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); expect(newAccessKey.name).to.eql(keyName); const deleteAccessKey = await cloudinary.provisioning.account.delete_access_key(CLOUD_ID, newAccessKey.api_key); @@ -143,7 +144,7 @@ describe('Provisioning API - Access Keys Management', function () { it('Delete access keys by name', async () => { const keyName = `test-access-key-${Date.now()}` const newAccessKey = await cloudinary.provisioning.account.generate_access_key(CLOUD_ID, { name: keyName }); - expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled']); + expect(Object.keys(newAccessKey)).to.eql(['name', 'api_key', 'api_secret', 'created_at', 'updated_at', 'enabled', 'root']); expect(newAccessKey.name).to.eql(keyName); const deleteAccessKey = await cloudinary.provisioning.account.delete_access_key_by_name(CLOUD_ID, { name: keyName }); diff --git a/test/integration/api/provisioning/account_spec.js b/test/integration/api/provisioning/account_spec.js index cd0f9bd4..994df13b 100644 --- a/test/integration/api/provisioning/account_spec.js +++ b/test/integration/api/provisioning/account_spec.js @@ -1,9 +1,8 @@ const cloudinary = require("../../../../cloudinary"); +const expect = require('expect.js'); const TIMEOUT = require('../../../testUtils/testConstants').TIMEOUT; -let runOnlyForInternalPRs = process.env.TRAVIS_SECURE_ENV_VARS ? describe : describe.skip; - -runOnlyForInternalPRs('account API - Provisioning', function () { +describe.skip('account API - Provisioning', function () { let CLOUD_SECRET; let CLOUD_API; let CLOUD_NAME;