Repository: auth0/node-auth0
Pull request #595 (2021-03-14 15:51:42)

[DXEX-1315] Bringing SDK in line to condensed Actions API
### Changes

- Merging all the actions related stuff into a single manager
- Supporting the following operations:
      'get',
      'getAll',
      'create',
      'update',
      'delete',
      'deploy',
      'test',
      'getActionVersions',
      'deployActionVersion',
      'getAllTriggers',
      'testTrigger',
      'getTriggerBindings',
      'updateTriggerBindings'


### References

https://auth0team.atlassian.net/browse/DXEX-1315

### Testing

- [x] This change adds unit test coverage
- [ ] This change adds integration test coverage



Patch:
diff --git a/src/management/ActionBindingsManager.js b/src/management/ActionBindingsManager.js
deleted file mode 100644
index 582945f4b..000000000
--- a/src/management/ActionBindingsManager.js
+++ /dev/null
@@ -1,287 +0,0 @@
-var ArgumentError = require('rest-facade').ArgumentError;
-var utils = require('../utils');
-var Auth0RestClient = require('../Auth0RestClient');
-var RetryRestClient = require('../RetryRestClient');
-
-/**
- * Simple facade for consuming a REST API endpoint.
- * @external RestClient
- * @see https://github.com/ngonzalvez/rest-facade
- */
-
-/**
- * @class ActionBindingsManager
- * Auth0 ActionBindings Provider.
- * @constructor
- * @memberOf module:management
- *
- * @param {Object} options            The client options.
- * @param {String} options.baseUrl    The URL of the API.
- * @param {Object} [options.headers]  Headers to be included in all requests.
- * @param {Object} [options.retry]    Retry Policy Config
- */
-var ActionBindingsManager = function(options) {
-  if (options === null || typeof options !== 'object') {
-    throw new ArgumentError('Must provide client options');
-  }
-
-  if (options.baseUrl === null || options.baseUrl === undefined) {
-    throw new ArgumentError('Must provide a base URL for the API');
-  }
-
-  if ('string' !== typeof options.baseUrl || options.baseUrl.length === 0) {
-    throw new ArgumentError('The provided base URL is invalid');
-  }
-
-  /**
-   * Options object for the Rest Client instance.
-   *
-   * @type {Object}
-   */
-  var clientOptions = {
-    errorFormatter: { message: 'message', name: 'error' },
-    headers: options.headers,
-    query: { repeatParams: false }
-  };
-
-  /**
-   * Provides an abstraction layer for consuming the
-   * [Auth0 ActionBindings endpoint]{@link https://auth0.com/docs/api/v2#!/actionsBindings}.
-   *
-   * @type {external:RestClient}
-   */
-  var auth0RestClient = new Auth0RestClient(
-    options.baseUrl + '/actions/triggers/:trigger_id/bindings/:binding_id',
-    clientOptions,
-    options.tokenProvider
-  );
-  this.resource = new RetryRestClient(auth0RestClient, options.retry);
-
-  var testBinding = new Auth0RestClient(
-    options.baseUrl + '/actions/triggers/:trigger_id/bindings/:binding_id/test',
-    clientOptions,
-    options.tokenProvider
-  );
-  this.testActionBinding = new RetryRestClient(testBinding, options.retry);
-};
-
-/**
- * Create a new ActionBinding.
- *
- * @method    create
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example
- * var params = { trigger_id: TRIGGER_ID };
- * const data = {
- *   action_id: ACTION_ID,
- *   display_name: "display name",
- *   secrets: [],
- *   configuration: [],
- *   metadata: {},
- * };
- * auth0.createActionBinding(params, data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *    // ActionBinding created.
- * });
- * @param   {Object}    params                 ActionBinding parameters.
- * @param   {String}    params.triggger_id     Action Trigger ID.
- * @param   {Object}    data                   ActionBinding data object.
- * @param   {Function}  [cb]                   Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionBindingsManager, 'create', 'resource.create');
-
-/**
- * Get all actionsBindings by trigger id.
- *
- * @method    getAll
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- * // Pagination settings.
- * var params = {
- *   per_page: 10,
- *   page: 0
- * };
- *
- * management.actionBindings.getAll({ trigger_id: TRIGGER_ID }, function (err, actionBindings) {
- *   console.log(actionBindings.length);
- * });
- *
- * @param   {Object}    [params]               ActionBindings parameters.
- * @param   {Number}    [params.per_page]      Number of results per page.
- * @param   {Number}    [params.page]          Page number, zero indexed.
- * @param   {String}    [params.trigger_id]    trigger ID.
- * @param   {Function}  [cb]                   Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionBindingsManager, 'getAll', 'resource.getAll');
-
-/**
- * Get an Auth0 action binding.
- *
- * @method    get
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example
- * management.actionBindings.get({ id: ACTION_ID }, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(action);
- * });
- *
- * @param   {Object}    params                ActionBindings parameters.
- * @param   {String}    params.trigger_id     Action trigger ID.
- * @param   {String}    params.binding_id     Action trigger binding ID.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionBindingsManager, 'get', 'resource.get');
-
-/**
- * Update an existing action binding.
- *
- * @method    update
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example
- * var data = { display_name: 'new-display_name' };
- * var params = { trigger_id: TRIGGER_ID, binding_id: BINDING_ID };
- *
- * // Using auth0 instance.
- * management.updateActionBindings(params, data, function (err, actionBinding) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionBinding.display_name);  // 'new-display_name'
- * });
- *
- * // Using the ActionBindings manager directly.
- * management.actionBindings.update(params, data, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(action.name);  // 'new-name'
- * });
- *
- * @param   {Object}    params                Actions Binding parameters.
- * @param   {String}    params.trigger_id     Actions Trigger ID.
- * @param   {String}    params.binding_id     Actions Binding ID.
- * @param   {Object}    data                  Updated action binding data.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionBindingsManager, 'update', 'resource.patch');
-
-/**
- * Update an existing action binding list.
- *
- * @method    updateList
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example
- * var data = { bindings: [{id: BINDING_ID1},{id: BINDING_ID2}];
- * var params = { trigger_id: TRIGGER_ID };
- *
- * // Using auth0 instance.
- * management.updateActionBindings(params, data, function (err, actionBinding) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionBinding.display_name);  // 'new-display_name'
- * });
- *
- * // Using the ActionBindings manager directly.
- * management.actionBindings.updateList(params, data, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(action.name);  // 'new-name'
- * });
- *
- * @param   {Object}    params                Actions Binding parameters.
- * @param   {String}    params.trigger_id     Actions Trigger ID.
- * @param   {Object}    data                  bindings_id list
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionBindingsManager, 'updateList', 'resource.patch');
-
-/**
- * Delete an existing action binding.
- *
- * @method    delete
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example
- * management.actionBindings.delete({ trigger_id: TRIGGER_ID , binding_id: BINDING_ID }, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // Action Binding deleted.
- * });
- *
- * @param   {Object}    params                Action  Binding parameters.
- * @param   {String}    params.trigger_id     Action Trigger ID.
- * @param   {String}    params.binding_id     Action  Binding ID.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionBindingsManager, 'delete', 'resource.delete');
-
-/**
- * test an ActionBinding.
- *
- * @method    test
- * @memberOf  module:management.ActionBindingsManager.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID , binding_id: BINDING_ID};
- * auth0.testActionBinding(params, payload, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- 
- * });
- *
- * @param   {Object}    params                ActionBinding parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {String}    params.binding_id      Version ID.
- * @param   {Object}    payload               Payload represents the entire structure necessary to test a particular binding
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-ActionBindingsManager.prototype.test = function(params, payload, cb) {
-  params = params || {};
-  payload = payload || {};
-
-  if (cb && cb instanceof Function) {
-    return this.testActionBinding.create(params, payload, cb);
-  }
-
-  return this.testActionBinding.create(params, payload);
-};
-
-module.exports = ActionBindingsManager;
diff --git a/src/management/ActionExecutionsManager.js b/src/management/ActionExecutionsManager.js
deleted file mode 100644
index 0bd4d2db2..000000000
--- a/src/management/ActionExecutionsManager.js
+++ /dev/null
@@ -1,84 +0,0 @@
-var ArgumentError = require('rest-facade').ArgumentError;
-var utils = require('../utils');
-var Auth0RestClient = require('../Auth0RestClient');
-var RetryRestClient = require('../RetryRestClient');
-
-/**
- * Simple facade for consuming a REST API endpoint.
- * @external RestClient
- * @see https://github.com/ngonzalvez/rest-facade
- */
-
-/**
- * @class ActionExecutionsManager
- * Auth0 ActionExecution Provider.
- * @constructor
- * @memberOf module:management
- *
- * @param {Object} options            The client options.
- * @param {String} options.baseUrl    The URL of the API.
- * @param {Object} [options.headers]  Headers to be included in all requests.
- * @param {Object} [options.retry]    Retry Policy Config
- */
-var ActionExecutionsManager = function(options) {
-  if (options === null || typeof options !== 'object') {
-    throw new ArgumentError('Must provide client options');
-  }
-
-  if (options.baseUrl === null || options.baseUrl === undefined) {
-    throw new ArgumentError('Must provide a base URL for the API');
-  }
-
-  if ('string' !== typeof options.baseUrl || options.baseUrl.length === 0) {
-    throw new ArgumentError('The provided base URL is invalid');
-  }
-
-  /**
-   * Options object for the Rest Client instance.
-   *
-   * @type {Object}
-   */
-  var clientOptions = {
-    errorFormatter: { message: 'message', name: 'error' },
-    headers: options.headers,
-    query: { repeatParams: false }
-  };
-
-  /**
-   * Provides an abstraction layer for consuming the
-   * [Auth0 ActionExecutions endpoint]{@link https://auth0.com/docs/api/v2#!/actionExecutions}.
-   *
-   * @type {external:RestClient}
-   */
-  var auth0RestClient = new Auth0RestClient(
-    options.baseUrl + '/actions/executions/:execution_id',
-    clientOptions,
-    options.tokenProvider
-  );
-  this.resource = new RetryRestClient(auth0RestClient, options.retry);
-};
-
-/**
- * Get an execution by ID.
- *
- * @method    get
- * @memberOf  module:management.ActionExecutionsManager.prototype
- *
- * @example
- * management.actionExecutions.get({ execution_id: EXECUTION_ID }, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(ActionExecution);
- * });
- *
- * @param   {Object}    params                  Action Execution parameters.
- * @param   {String}    params.execution_id     Action Execution ID.
- * @param   {Function}  [cb]                    Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionExecutionsManager, 'get', 'resource.get');
-
-module.exports = ActionExecutionsManager;
diff --git a/src/management/ActionVersionsManager.js b/src/management/ActionVersionsManager.js
deleted file mode 100644
index 73c8951ab..000000000
--- a/src/management/ActionVersionsManager.js
+++ /dev/null
@@ -1,284 +0,0 @@
-var ArgumentError = require('rest-facade').ArgumentError;
-var utils = require('../utils');
-var Auth0RestClient = require('../Auth0RestClient');
-var RetryRestClient = require('../RetryRestClient');
-
-/**
- * Simple facade for consuming a REST API endpoint.
- * @external RestClient
- * @see https://github.com/ngonzalvez/rest-facade
- */
-
-/**
- * @class ActionVersionsManager
- * Auth0 ActionVersion Provider.
- * @constructor
- * @memberOf module:management
- *
- * @param {Object} options            The client options.
- * @param {String} options.baseUrl    The URL of the API.
- * @param {Object} [options.headers]  Headers to be included in all requests.
- * @param {Object} [options.retry]    Retry Policy Config
- */
-var ActionVersionsManager = function(options) {
-  if (options === null || typeof options !== 'object') {
-    throw new ArgumentError('Must provide client options');
-  }
-
-  if (options.baseUrl === null || options.baseUrl === undefined) {
-    throw new ArgumentError('Must provide a base URL for the API');
-  }
-
-  if ('string' !== typeof options.baseUrl || options.baseUrl.length === 0) {
-    throw new ArgumentError('The provided base URL is invalid');
-  }
-
-  /**
-   * Options object for the Rest Client instance.
-   *
-   * @type {Object}
-   */
-  var clientOptions = {
-    errorFormatter: { message: 'message', name: 'error' },
-    headers: options.headers,
-    query: { repeatParams: false }
-  };
-
-  /**
-   * Provides an abstraction layer for consuming the
-   * [Auth0 ActionVersions endpoint]{@link https://auth0.com/docs/api/v2#!/actionVersions}.
-   *
-   * @type {external:RestClient}
-   */
-  var auth0RestClient = new Auth0RestClient(
-    options.baseUrl + '/actions/actions/:action_id/versions/:version_id',
-    clientOptions,
-    options.tokenProvider
-  );
-  this.resource = new RetryRestClient(auth0RestClient, options.retry);
-
-  var deployVersionsClient = new Auth0RestClient(
-    options.baseUrl + '/actions/actions/:action_id/versions/:version_id/deploy',
-    clientOptions,
-    options.tokenProvider
-  );
-  this.actionVersion = new RetryRestClient(deployVersionsClient, options.retry);
-
-  var testVersionsClient = new Auth0RestClient(
-    options.baseUrl + '/actions/actions/:action_id/versions/:version_id/test',
-    clientOptions,
-    options.tokenProvider
-  );
-  this.testActionVersion = new RetryRestClient(testVersionsClient, options.retry);
-};
-
-/**
- * Create a new ActionVersion.
- *
- * @method    create
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID };
- * auth0.createActionVersion(params, data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *    // ActionVersion created.
- * });
- *
- * @param   {Object}    params                ActionVersion parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {Object}    data                  ActionVersion data object.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionVersionsManager, 'create', 'resource.create');
-
-/**
- * deploy an ActionVersion.
- *
- * @method    deploy
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID , version_id: VERSION_ID};
- * auth0.deployActionVersion(params, data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *    // ActionVersion deployed.
- * });
- *
- * @param   {Object}    params                ActionVersion parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {String}    params.verion_id      Version ID.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-ActionVersionsManager.prototype.deploy = function(params, data, cb) {
-  params = params || {};
-  data = data || {};
-
-  if (cb && cb instanceof Function) {
-    return this.actionVersion.create(params, data, cb);
-  }
-
-  return this.actionVersion.create(params, data);
-};
-
-/**
- * test an ActionVersion.
- *
- * @method    test
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID , version_id: VERSION_ID};
- * auth0.testActionVersion(params, payload, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- 
- * });
- *
- * @param   {Object}    params                ActionVersion parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {String}    params.version_id     Version ID.
- * @param   {Object}    payload               Payload represents the entire structure necessary to test a particular action version
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-ActionVersionsManager.prototype.test = function(params, payload, cb) {
-  params = params || {};
-  payload = payload || {};
-
-  if (cb && cb instanceof Function) {
-    return this.testActionVersion.create(params, payload, cb);
-  }
-
-  return this.testActionVersion.create(params, payload);
-};
-
-/**
- * Get all action versions
- *
- * @method    getAll
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- * // Pagination settings.
- * var params = {
- *   per_page: 10,
- *   page: 0
- * };
- *
- * management.actionVersions.getAll({ action_id: ACTION_ID }, function (err, actionVersions) {
- *   console.log(actionVersions.length);
- * });
- *
- * @param   {Object}    [params]               ActionVersions parameters.
- * @param   {Number}    [params.per_page]      Number of results per page.
- * @param   {Number}    [params.page]          Page number, zero indexed.
- * @param   {String}    [params.action_id]     Action ID.
- * @param   {Function}  [cb]                   Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionVersionsManager, 'getAll', 'resource.getAll');
-
-/**
- * Get an action version.
- *
- * @method    get
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example
- * management.actionVersions.get({ action_id: ACTION_ID, version_id : VERSION_ID }, function (err, actionVersion) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionVersion);
- * });
- *
- * @param   {Object}    params                ActionVersion parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {String}    params.version_id     Action version ID.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionVersionsManager, 'get', 'resource.get');
-
-/**
- * Delete an existing action version.
- *
- * @method    delete
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example
- * management.actionVersions.delete({ action_id: ACTION_ID, version_id : VERSION_ID }, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // Action version deleted.
- * });
- *
- * @param   {Object}    params                Action parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {String}    params.version_id     Action version ID.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionVersionsManager, 'delete', 'resource.delete');
-
-/**
- * Update/create an draft action version.
- *
- * @method    upsertDraft
- * @memberOf  module:management.ActionVersionsManager.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID , version_id: VERSION_ID};
- *
- * // Using auth0 instance.
- * management.upsertDraftActionVersion(params, data, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(draftActionVersion);
- * });
- *
- * // Using the ActionVersions manager directly.
- * management.actionVersions.upsertDraft(params, data, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(draftActionVersion);
- * });
- *
- * @param   {Object}    params               Action parameters.
- * @param   {String}    params.action_id     Action ID.
- * @param   {String}    params.version_id    This value must be 'draft'.
- * @param   {Object}    data                 Updated action data.
- * @param   {Function}  [cb]                 Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionVersionsManager, 'upsertDraft', 'resource.patch');
-
-module.exports = ActionVersionsManager;
diff --git a/src/management/ActionsManager.js b/src/management/ActionsManager.js
index 241c9d625..444a3bcf9 100644
--- a/src/management/ActionsManager.js
+++ b/src/management/ActionsManager.js
@@ -57,47 +57,67 @@ var ActionsManager = function(options) {
   );
   this.resource = new RetryRestClient(auth0RestClient, options.retry);
 
+  var actionsDeployRestClient = new Auth0RestClient(
+    options.baseUrl + '/actions/actions/:action_id/deploy',
+    clientOptions,
+    options.tokenProvider
+  );
+  this.actionsDeploy = new RetryRestClient(actionsDeployRestClient, options.retry);
+
+  var actionsTestRestClient = new Auth0RestClient(
+    options.baseUrl + '/actions/actions/:action_id/test',
+    clientOptions,
+    options.tokenProvider
+  );
+  this.actionsTest = new RetryRestClient(actionsTestRestClient, options.retry);
+
   var triggersRestClient = new Auth0RestClient(
-    options.baseUrl + '/actions/triggers',
+    options.baseUrl + '/actions/triggers/:trigger_id',
     clientOptions,
     options.tokenProvider
   );
   this.triggers = new RetryRestClient(triggersRestClient, options.retry);
 
+  var triggerBindingsRestClient = new Auth0RestClient(
+    options.baseUrl + '/actions/triggers/:trigger_id/bindings',
+    clientOptions,
+    options.tokenProvider
+  );
+  this.triggerBindings = new RetryRestClient(triggerBindingsRestClient, options.retry);
+
   var triggersTestRestClient = new Auth0RestClient(
     options.baseUrl + '/actions/triggers/:trigger_id/test',
     clientOptions,
     options.tokenProvider
   );
   this.triggersTest = new RetryRestClient(triggersTestRestClient, options.retry);
-};
 
-/**
- * Create a new Action.
- *
- * @method    create
- * @memberOf  module:management.ActionsManager.prototype
- *
- * @example
- * management.actions.create(data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // Action created.
- * });
- *
- * @param   {Object}    data     Action data object.
- * @param   {Function}  [cb]     Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ActionsManager, 'create', 'resource.create');
+  var executionsRestClient = new Auth0RestClient(
+    options.baseUrl + '/actions/executions/:execution_id',
+    clientOptions,
+    options.tokenProvider
+  );
+  this.executions = new RetryRestClient(executionsRestClient, options.retry);
+
+  var actionVersionRestClient = new Auth0RestClient(
+    options.baseUrl + '/actions/actions/:action_id/versions/:version_id',
+    clientOptions,
+    options.tokenProvider
+  );
+  this.actionVersions = new RetryRestClient(actionVersionRestClient, options.retry);
+
+  var deployActionVersionRestClient = new Auth0RestClient(
+    options.baseUrl + '/actions/actions/:action_id/versions/:version_id/deploy',
+    clientOptions,
+    options.tokenProvider
+  );
+  this.actionVersionDeploy = new RetryRestClient(deployActionVersionRestClient, options.retry);
+};
 
 /**
- * Get all actions.
+ * Get all Triggers.
  *
- * @method    getAll
+ * @method    getAllTriggers
  * @memberOf  module:management.ActionsManager.prototype
  *
  * @example <caption>
@@ -108,62 +128,64 @@ utils.wrapPropertyMethod(ActionsManager, 'create', 'resource.create');
  * // Pagination settings.
  * var params = {
  *   per_page: 10,
- *   page: 0,
- *   triggerId:'TRIGGER_ID',
- *   actionName: 'ACTION_NAME'
+ *   page: 0
  * };
  *
- * management.actions.getAll(params, function (err, actions) {
+ * management.actions.getAllTriggers(params, function (err, actions) {
  *   console.log(actions.length);
  * });
  *
  * @param   {Object}    [params]               Actions parameters.
  * @param   {Number}    [params.per_page]      Number of results per page.
  * @param   {Number}    [params.page]          Page number, zero indexed.
- * @param   {String}    [params.triggerId]     The trigger ID of the actions to retrieve.
- * @param   {String}    [params.actionName]    The name of the actions to retrieve.
  * @param   {Function}  [cb]                   Callback function.
  *
  * @return  {Promise|undefined}
  */
-utils.wrapPropertyMethod(ActionsManager, 'getAll', 'resource.getAll');
+ActionsManager.prototype.getAllTriggers = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.triggers.getAll(params, cb);
+  }
+
+  return this.triggers.getAll(params);
+};
 
 /**
- * Get all Triggers.
+ * Update the actions bound to a trigger .
  *
- * @method    getAllTriggers
+ * @method    updateTriggerBindings
  * @memberOf  module:management.ActionsManager.prototype
  *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- * // Pagination settings.
- * var params = {
- *   per_page: 10,
- *   page: 0
- * };
+ * @example
+ * var data = { bindings: [{ id_type: "action_id", id_value: ACTION_ID1},{id_type: "action_name", id_value: ACTION_NAME2}];
+ * var params = { trigger_id: TRIGGER_ID };
  *
- * management.actions.getAllTriggers(params, function (err, actions) {
- *   console.log(actions.length);
+ * // Using auth0 instance.
+ * management.actions.updateTriggerBindings(params, data, function (err, bindings) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+ *
+ *   console.log(bindings.length);  // 2
  * });
  *
- * @param   {Object}    [params]               Actions parameters.
- * @param   {Number}    [params.per_page]      Number of results per page.
- * @param   {Number}    [params.page]          Page number, zero indexed.
- * @param   {Function}  [cb]                   Callback function.
+ * @param   {Object}    params                Actions Binding parameters.
+ * @param   {String}    params.trigger_id     Actions Trigger ID.
+ * @param   {Object}    data                  bindings array
+ * @param   {Function}  [cb]                  Callback function.
  *
  * @return  {Promise|undefined}
  */
-ActionsManager.prototype.getAllTriggers = function(params, cb) {
+ActionsManager.prototype.updateTriggerBindings = function(params, data, cb) {
   params = params || {};
 
   if (cb && cb instanceof Function) {
-    return this.triggers.getAll(params, cb);
+    return this.triggerBindings.patch(params, data, cb);
   }
 
-  return this.triggers.getAll(params);
+  return this.triggerBindings.patch(params, data);
 };
 
 /**
@@ -174,11 +196,11 @@ ActionsManager.prototype.getAllTriggers = function(params, cb) {
  *
  * @example
  * var params = { trigger_id: TRIGGER_ID};
- * auth0.testTrigger(params, payload, function (err) {
+ * auth0.actions.testTrigger(params, payload, function (err) {
  *   if (err) {
  *     // Handle error.
  *   }
- 
+
  * });
  *
  * @param   {Object}    params                Action parameters.
@@ -199,6 +221,96 @@ ActionsManager.prototype.testTrigger = function(params, payload, cb) {
   return this.triggersTest.create(params, payload);
 };
 
+/**
+ * Get the actions bound to a trigger .
+ *
+ * @method    getTriggerBindings
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * var params = { trigger_id: TRIGGER_ID };
+ *
+ * // Using auth0 instance.
+ * management.actions.getTriggerBindings(params, function (err, bindings) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+ *
+ *   console.log(bindings.length);  // 2
+ * });
+ *
+ * @param   {Object}    params                Actions Binding parameters.
+ * @param   {String}    params.trigger_id     Actions Trigger ID.
+ * @param   {Function}  [cb]                  Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.getTriggerBindings = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.triggerBindings.getAll(params, cb);
+  }
+
+  return this.triggerBindings.getAll(params);
+};
+
+/**
+ * Create a new Action.
+ *
+ * @method    create
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * management.actions.create(data, function (err) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+ *
+ *   // Action created.
+ * });
+ *
+ * @param   {Object}    data     Action data object.
+ * @param   {Function}  [cb]     Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+utils.wrapPropertyMethod(ActionsManager, 'create', 'resource.create');
+
+/**
+ * Get all actions.
+ *
+ * @method    getAll
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example <caption>
+ *   This method takes an optional object as first argument that may be used to
+ *   specify pagination settings. If pagination options are not present,
+ *   the first page of a limited number of results will be returned.
+ * </caption>
+ * // Pagination settings.
+ * var params = {
+ *   per_page: 10,
+ *   page: 0,
+ *   triggerId:'TRIGGER_ID',
+ *   actionName: 'ACTION_NAME'
+ * };
+ *
+ * management.actions.getAll(params, function (err, actions) {
+ *   console.log(actions.length);
+ * });
+ *
+ * @param   {Object}    [params]               Actions parameters.
+ * @param   {Number}    [params.per_page]      Number of results per page.
+ * @param   {Number}    [params.page]          Page number, zero indexed.
+ * @param   {String}    [params.triggerId]     The trigger ID of the actions to retrieve.
+ * @param   {String}    [params.actionName]    The name of the actions to retrieve.
+ * @param   {Function}  [cb]                   Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+utils.wrapPropertyMethod(ActionsManager, 'getAll', 'resource.getAll');
+
 /**
  * Get an Auth0 action.
  *
@@ -282,4 +394,237 @@ utils.wrapPropertyMethod(ActionsManager, 'update', 'resource.patch');
  */
 utils.wrapPropertyMethod(ActionsManager, 'delete', 'resource.delete');
 
+/**
+ * test an Action.
+ *
+ * @method    test
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * var params = { action_id: ACTION_ID};
+ * management.actions.testAction(params, payload, function (err) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+
+ * });
+ *
+ * @param   {Object}    params                Action parameters.
+ * @param   {String}    params.action_id      Action ID.
+ * @param   {Object}    payload               Payload represents the entire structure necessary to test a particular trigger
+ * @param   {Function}  [cb]                  Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.test = function(params, payload, cb) {
+  params = params || {};
+  payload = payload || {};
+
+  if (cb && cb instanceof Function) {
+    return this.actionsTest.create(params, payload, cb);
+  }
+
+  return this.actionsTest.create(params, payload);
+};
+
+/**
+ * deploy an Action.
+ * The action must be in a state of 'built' before it can be deployed.
+ *
+ * @method    deploy
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * var params = { action_id: ACTION_ID};
+ * mangement.actions.deploy(params, function (err, actionVersion) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+
+ * });
+ *
+ * @param   {Object}    params                Action parameters.
+ * @param   {String}    params.action_id      Action ID.
+ * @param   {Function}  [cb]                  Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.deploy = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.actionsDeploy.create(params, {}, cb);
+  }
+
+  return this.actionsDeploy.create(params, {});
+};
+
+/**
+ * Get all action versions
+ *
+ * @method    getVersions
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example <caption>
+ *   This method takes an optional object as first argument that may be used to
+ *   specify pagination settings. If pagination options are not present,
+ *   the first page of a limited number of results will be returned.
+ * </caption>
+ * // Pagination settings.
+ * var params = {
+ *   per_page: 10,
+ *   page: 0
+ * };
+ *
+ * management.actions.getVersions({ action_id: ACTION_ID }, function (err, actionVersions) {
+ *   console.log(actionVersions.length);
+ * });
+ *
+ * @param   {Object}    [params]               ActionVersions parameters.
+ * @param   {Number}    [params.per_page]      Number of results per page.
+ * @param   {Number}    [params.page]          Page number, zero indexed.
+ * @param   {String}    [params.action_id]     Action ID.
+ * @param   {Function}  [cb]                   Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.getVersions = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.actionVersions.getAll(params, cb);
+  }
+
+  return this.actionVersions.getAll(params);
+};
+
+/**
+ * Get an Action Version.
+ *
+ * @method    getVersion
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * var params = { action_id: ACTION_ID, version_id: VERSION_ID };
+ * management.actions.getVersion(params, function (err, actionVersion) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+
+ * });
+ *
+ * @param   {Object}    params                Action parameters.
+ * @param   {String}    params.action_id      Action ID.
+ * @param   {String}    params.version_id     ActionVersion ID.
+ * @param   {Function}  [cb]                  Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.getVersion = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.actionVersions.get(params, cb);
+  }
+
+  return this.actionVersions.get(params);
+};
+
+/**
+ * Create an Action Version. In general, updating an action and then
+ * deploying it is the preferred way of creating an action version, but
+ * this operation is supported as a way of creating versions without
+ * updating the action's code (which can be useful in some CI/CD scenarios).
+ *
+ * @method    createVersion
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * var params = { action_id: ACTION_ID };
+ * management.actions.createActionVersion(params, data, function (err, actionVersion) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+ * });
+ *
+ * @param   {Object}    params                Action parameters.
+ * @param   {String}    params.action_id      Action ID.
+ * @param   {Object}    data                  ActionVersion parameters.
+ * @param   {Function}  [cb]                  Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.createVersion = function(params, data, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.actionVersions.create(params, data, cb);
+  }
+
+  return this.actionVersions.create(params, data);
+};
+
+/**
+ * deploy an Action Version to roll back to a previous version.
+ *
+ * @method    deployVersion
+ * @memberOf  module:management.ActionsManager.prototype
+ *
+ * @example
+ * var params = { action_id: ACTION_ID, version_id: VERSION_ID };
+ * management.actions.deployVersion(params, function (err, actionVersion) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+
+ * });
+ *
+ * @param   {Object}    params                Action parameters.
+ * @param   {String}    params.action_id      Action ID.
+ * @param   {String}    params.version_id     Action ID.
+ * @param   {Function}  [cb]                  Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.deployVersion = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.actionVersionDeploy.create(params, {}, cb);
+  }
+
+  return this.actionVersionDeploy.create(params, {});
+};
+
+/**
+ * Get an execution by ID.
+ *
+ * @method    getExecution
+ * @memberOf  module:management.ActionExecutionsManager.prototype
+ *
+ * @example
+ * management.actions.getExecution({ execution_id: EXECUTION_ID }, function (err, action) {
+ *   if (err) {
+ *     // Handle error.
+ *   }
+ *
+ *   console.log(ActionExecution);
+ * });
+ *
+ * @param   {Object}    params                  Action Execution parameters.
+ * @param   {String}    params.execution_id     Action Execution ID.
+ * @param   {Function}  [cb]                    Callback function.
+ *
+ * @return  {Promise|undefined}
+ */
+ActionsManager.prototype.getExecution = function(params, cb) {
+  params = params || {};
+
+  if (cb && cb instanceof Function) {
+    return this.executions.get(params, cb);
+  }
+
+  return this.executions.get(params);
+};
+
 module.exports = ActionsManager;
diff --git a/src/management/index.js b/src/management/index.js
index a14f6c47c..670937b47 100644
--- a/src/management/index.js
+++ b/src/management/index.js
@@ -35,9 +35,6 @@ var BrandingManager = require('./BrandingManager');
 var MigrationsManager = require('./MigrationsManager');
 var PromptsManager = require('./PromptsManager');
 var ActionsManager = require('./ActionsManager');
-var ActionsVersionsManager = require('./ActionVersionsManager');
-var ActionBindingsManager = require('./ActionBindingsManager');
-var ActionExecutionsManager = require('./ActionExecutionsManager');
 var OrganizationsManager = require('./OrganizationsManager');
 
 var BASE_URL_FORMAT = 'https://%s/api/v2';
@@ -364,30 +361,6 @@ var ManagementClient = function(options) {
    */
   this.actions = new ActionsManager(managerOptions);
 
-  /**
-   * Simple abstraction for performing CRUD operations on the
-   * actions versions endpoint.
-   *
-   * @type {ActionsVersionsManager}
-   */
-  this.actionVersions = new ActionsVersionsManager(managerOptions);
-
-  /**
-   * Simple abstraction for performing CRUD operations on the
-   * actions binding endpoint.
-   *
-   * @type {ActionBindingsManager}
-   */
-  this.actionBindings = new ActionBindingsManager(managerOptions);
-
-  /**
-   * Simple abstraction for performing CRUD operations on the
-   * actions executions endpoint.
-   *
-   * @type {ActionExecutionsManager}
-   */
-  this.actionExecutions = new ActionExecutionsManager(managerOptions);
-
   /**
    * Organizations Manager
    *
@@ -3915,582 +3888,4 @@ utils.wrapPropertyMethod(
   'prompts.updateCustomTextByLanguage'
 );
 
-/**
- * Create a new Action.
- *
- * @method    createAction
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * management.createAction(data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // Action created.
- * });
- *
- * @param   {Object}    data     Action data object.
- * @param   {Function}  [cb]     Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'createAction', 'actions.create');
-
-/**
- * Get all Actions.
- *
- * @method    getActions
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- *
- *
- * var params = {
- *   per_page: 10,
- *   page: 0,
- *   triggerId : TRIGGER_ID,
- *   name : ACTION_NAME
- * };
- *
- * management.getActions(params, function (err, actions) {
- *   console.log(actions.length);
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {Number}    [params.per_page]         Number of results per page.
- * @param   {Number}    [params.page]             Page number, zero indexed.
- * @param   {String}    [params.triggerId]        trigger ID of actions to be retrieved.
- * @param   {String}    [params.name]             name of action to be retrieved.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getActions', 'actions.getAll');
-
-/**
- * Get all Action Triggers.
- *
- * @method    getTriggers
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- *
- *
- * var params = {
- *   per_page: 10,
- *   page: 0
- * };
- *
- * management.getTriggers(params, function (err, actions) {
- *   console.log(actions.length);
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {Number}    [params.per_page]         Number of results per page.
- * @param   {Number}    [params.page]             Page number, zero indexed.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getTriggers', 'actions.getAllTriggers');
-
-/**
- * Get an action.
- *
- * @method    getAction
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * management.getAction({ action_id: ACTION_ID }, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(action);
- * });
- *
- * @param   {Object}    params                Action parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getAction', 'actions.get');
-
-/**
- * Update an existing action.
- *
- * @method    updateAction
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID };
- * var data = { name: 'my-action'};
- * management.updateAction(params, data, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(action.name); // 'my-action'.
- * });
- *
- * @param   {Object}    params                Action parameters.
- * @param   {String}    params.action_id      Action ID.
- * @param   {Object}    data                  Updated action data.
- * @param   {Function}  [cb]                  Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'updateAction', 'actions.update');
-
-/**
- * Delete an existing action.
- *
- * @method    deleteAction
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * auth0.deleteAction({ action_id: ACTION_ID }, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // Action deleted.
- * });
- *
- * @param   {Object}    params               Action parameters.
- * @param   {String}    params.action_id     Action ID.
- * @param   {Function}  [cb]                 Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'deleteAction', 'actions.delete');
-
-/**
- * test Trigger.
- *
- * @method    testTrigger
- * @memberOf  module:management.ManagementClient.prototype
- *
- *
- * @example
- * var params = { trigger_id: TRIGGER_ID };
- * auth0.testTrigger(params, payload, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- * });
- * @param   {Object}    params              Test trigger parameters.
- * @param   {String}    params.trigger_id   Trigger ID.
- * @param   {Object}    payload             Payload represents the entire structure necessary to test a particular trigger.
- * @param   {Function}  [cb]                Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'testTrigger', 'actions.testTrigger');
-
-/**
- * Create a new Action Binding.
- *
- * @method    createActionBinding
- * @memberOf  module:management.ManagementClient.prototype
- *
- *
- * @example
- * var params = { trigger_id: TRIGGER_ID };
- * const data = {
- *   action_id: ACTION_ID,
- *   display_name: "display name",
- *   secrets: [],
- *   configuration: [],
- *   metadata: {},
- * };
- * auth0.createActionBinding(params, data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *    // ActionBinding created.
- * });
- * @param   {Object}    params                 ActionBinding parameters.
- * @param   {String}    params.triggger_id     Action Trigger ID.
- * @param   {Object}    data                   ActionBinding data object.
- * @param   {Function}  [cb]                   Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'createActionBinding', 'actionBindings.create');
-
-/**
- * Get all Action Bindings.
- *
- * @method    getActionBindings
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- *
- *
- * var params = {
- *   per_page: 10,
- *   page: 0
- *   trigger_id : TRIGGER_ID
- * };
- *
- * management.getActionBindings(params, function (err, actions) {
- *   console.log(actions.length);
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {Number}    [params.per_page]         Number of results per page.
- * @param   {Number}    [params.page]             Page number, zero indexed.
- * @param   {String}    [params.trigger_id]       Actions trigger ID.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getActionBindings', 'actionBindings.getAll');
-
-/**
- * Get an Action Binding by id.
- *
- * @method    getActionBinding
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * management.getActionBinding({ trigger_id: TRIGGER_ID, binding_id: BINDING_ID }, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionBinding);
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {String}    [params.trigger_id]       Actions trigger ID.
- * @param   {String}    [params.binding_id]       Actions binding ID.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getActionBinding', 'actionBindings.get');
-
-/**
- * Update an existing action binding.
- *
- * @method    updateActionBinding
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * var params = { trigger_id: TRIGGER_ID, binding_id: BINDING_ID };
- * var data = { display_name: 'my-new-display-name'};
- * management.updateActionBinding(params, data, function (err, actionBinding) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionBinding.display_name); // 'my-new-display-name'.
- * });
- *
- * @param   {Object}    params                  Action parameters.
- * @param   {String}    params.trigger_id       Action trigger ID.
- * @param   {String}    params.binding_id       Action binding ID.
- * @param   {Object}    data                    Updated action binding data.
- * @param   {Function}  [cb]                    Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'updateActionBinding', 'actionBindings.update');
-
-/**
- * Update a action binding list.
- *
- * @method    updateActionBindings
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * var data = { bindings: [{id: BINDING_ID1},{id: BINDING_ID2}];
- * var params = { trigger_id: TRIGGER_ID };
- * management.updateActionBindings(params, data, function (err, actionBinding) {
- *   if (err) {
- *     // Handle error.
- *   }
- * });
- *
- * @param   {Object}    params                  Action parameters.
- * @param   {String}    params.trigger_id       Action trigger ID.
- * @param   {Object}    data                    List of binding ids.
- * @param   {Function}  [cb]                    Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'updateActionBindings', 'actionBindings.updateList');
-
-/**
- * Delete an existing action binding.
- *
- * @method    deleteActionBinding
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * auth0.deleteActionBinding({ trigger_id: TRIGGER_ID, binding_id: BINDING_ID }, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // actionBinding deleted.
- * });
- *
- * @param   {Object}    params                  Action parameters.
- * @param   {String}    params.trigger_id       Action trigger ID.
- * @param   {String}    params.binding_id       Action binding ID.
- * @param   {Function}  [cb]                    Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'deleteActionBinding', 'actionBindings.delete');
-
-/**
- * test Action Binding.
- *
- * @method    testActionBinding
- * @memberOf  module:management.ManagementClient.prototype
- *
- *
- * @example
- * var params = { action_id: ACTION_ID , binding_id: BINDING_ID};
- * auth0.testActionVersion(params, payload, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- * });
- * @param   {Object}    params              ActionVersion parameters.
- * @param   {String}    params.action_id    Action ID.
- * @param   {String}    params.binding_id   Binding ID.
- * @param   {Object}    payload             Payload represents the entire structure necessary to test a particular binding.
- * @param   {Function}  [cb]                Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'testActionBinding', 'actionBindings.test');
-
-/**
- * Create a new Action Version.
- *
- * @method    createActionVersion
- * @memberOf  module:management.ManagementClient.prototype
- *
- *
- * @example
- * var params = { action_id: ACTION_ID };
- * auth0.createActionVersion(params, data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *    // ActionVersioncreated.
- * });
- * @param   {Object}    params              ActionVersion parameters.
- * @param   {String}    params.action_id    Action ID.
- * @param   {Object}    data                ActionVersion data object.
- * @param   {Function}  [cb]                Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'createActionVersion', 'actionVersions.create');
-
-/**
- * deploy Action Version.
- *
- * @method    deployActionVersion
- * @memberOf  module:management.ManagementClient.prototype
- *
- *
- * @example
- * var params = { action_id: ACTION_ID , version_id: VERSION_ID};
- * auth0.deployActionVersion(params, data, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *    // ActionVersionDeployed.
- * });
- * @param   {Object}    params              ActionVersion parameters.
- * @param   {String}    params.action_id    Action ID.
- * @param   {String}    params.version_id   Version ID.
- * @param   {Function}  [cb]                Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'deployActionVersion', 'actionVersions.deploy');
-
-/**
- * test Action Version.
- *
- * @method    testActionVersion
- * @memberOf  module:management.ManagementClient.prototype
- *
- *
- * @example
- * var params = { action_id: ACTION_ID , version_id: VERSION_ID};
- * auth0.testActionVersion(params, payload, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- * });
- * @param   {Object}    params              ActionVersion parameters.
- * @param   {String}    params.action_id    Action ID.
- * @param   {String}    params.version_id   Version ID.
- * @param   {Object}    payload             Payload represents the entire structure necessary to test a particular action version.
- * @param   {Function}  [cb]                Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'testActionVersion', 'actionVersions.test');
-
-/**
- * Get all Action Versions.
- *
- * @method    getActionVersions
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example <caption>
- *   This method takes an optional object as first argument that may be used to
- *   specify pagination settings. If pagination options are not present,
- *   the first page of a limited number of results will be returned.
- * </caption>
- *
- *
- * var params = {
- *   per_page: 10,
- *   page: 0
- *   action_id : ACTION_ID
- * };
- *
- * management.getActionVersions(params, function (err, actionVersions) {
- *   console.log(actionVersions.length);
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {Number}    [params.per_page]         Number of results per page.
- * @param   {Number}    [params.page]             Page number, zero indexed.
- * @param   {String}    [params.action_id]        Actions ID.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getActionVersions', 'actionVersions.getAll');
-
-/**
- * Get an Action Version by id.
- *
- * @method    getActionVersion
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * management.getActionVersion({ action_id: ACTION_ID, version_id: VERSION_ID }, function (err, actionVersion) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionVersion);
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {String}    [params.action_id]        Actions ID.
- * @param   {String}    [params.version_id]       Actions Version ID.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getActionVersion', 'actionVersions.get');
-
-/**
- * Upsert draft action version.
- *
- * @method    upsertDraftActionVersion
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * var params = { action_id: ACTION_ID };
- * management.upsertDraftActionVersion(params, data, function (err, actionBinding) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(DraftActionVersion);
- * });
- *
- * @param   {Object}    params                  Action parameters.
- * @param   {String}    params.action_id        Action ID.
- * @param   {Object}    data                    Updated action binding data.
- * @param   {Function}  [cb]                    Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(
-  ManagementClient,
-  'upsertDraftActionVersion',
-  'actionVersions.upsertDraft'
-);
-
-/**
- * Delete an existing action version.
- *
- * @method    deleteActionVersion
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * auth0.deleteActionVersion({ action_id: ACTION_ID, version_id: VERSION_ID }, function (err) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   // actionVersion deleted.
- * });
- *
- * @param   {Object}    [params]                  Actions parameters.
- * @param   {String}    [params.action_id]        Actions ID.
- * @param   {String}    [params.version_id]       Actions Version ID.
- * @param   {Function}  [cb]                      Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'deleteActionVersion', 'actionVersions.delete');
-
-/**
- * Get an action Execution.
- *
- * @method    getActionExecution
- * @memberOf  module:management.ManagementClient.prototype
- *
- * @example
- * management.getActionExecution({ execution_id: EXECUTION_ID }, function (err, action) {
- *   if (err) {
- *     // Handle error.
- *   }
- *
- *   console.log(actionExecution);
- * });
- *
- * @param   {Object}    params                   Action parameters.
- * @param   {String}    params.execution_id      Action Execution ID.
- * @param   {Function}  [cb]                     Callback function.
- *
- * @return  {Promise|undefined}
- */
-utils.wrapPropertyMethod(ManagementClient, 'getActionExecution', 'actionExecutions.get');
-
 module.exports = ManagementClient;


Test patch:
diff --git a/test/management/actionBinding.tests.js b/test/management/actionBinding.tests.js
deleted file mode 100644
index bf172342f..000000000
--- a/test/management/actionBinding.tests.js
+++ /dev/null
@@ -1,519 +0,0 @@
-var expect = require('chai').expect;
-var nock = require('nock');
-
-var SRC_DIR = '../../src';
-var API_URL = 'https://tenant.auth0.com';
-
-var ActionBindingsManager = require(SRC_DIR + '/management/ActionBindingsManager');
-var ArgumentError = require('rest-facade').ArgumentError;
-
-describe('ActionBindingsManager', function() {
-  before(function() {
-    this.token = 'TOKEN';
-    this.actionTriggerBindings = new ActionBindingsManager({
-      headers: { authorization: 'Bearer ' + this.token },
-      baseUrl: API_URL
-    });
-  });
-
-  describe('instance', function() {
-    var methods = ['get', 'getAll', 'create', 'update', 'delete', 'test'];
-
-    methods.forEach(function(method) {
-      it('should have a ' + method + ' method', function() {
-        expect(this.actionTriggerBindings[method]).to.exist.to.be.an.instanceOf(Function);
-      });
-    });
-  });
-
-  describe('#constructor', function() {
-    it('should error when no options are provided', function() {
-      expect(ActionBindingsManager).to.throw(ArgumentError, 'Must provide client options');
-    });
-
-    it('should throw an error when no base URL is provided', function() {
-      var client = ActionBindingsManager.bind(null, {});
-
-      expect(client).to.throw(ArgumentError, 'Must provide a base URL for the API');
-    });
-
-    it('should throw an error when the base URL is invalid', function() {
-      var client = ActionBindingsManager.bind(null, { baseUrl: '' });
-
-      expect(client).to.throw(ArgumentError, 'The provided base URL is invalid');
-    });
-  });
-
-  describe('#getAll', function() {
-    const params = { trigger_id: 'post-login' };
-    const actionTriggerBindingsURL = '/actions/triggers/' + params.trigger_id + '/bindings';
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionTriggerBindings.getAll(params, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionTriggerBindings
-        .getAll(params)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .reply(500);
-
-      this.actionTriggerBindings.getAll(params).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should pass the body of the response to the "then" handler', function(done) {
-      nock.cleanAll();
-
-      var data = [{ test: true }];
-      var request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .reply(200, data);
-
-      this.actionTriggerBindings.getAll(params).then(function(bindings) {
-        expect(bindings).to.be.an.instanceOf(Array);
-
-        expect(bindings.length).to.equal(data.length);
-
-        expect(bindings[0].test).to.equal(data[0].test);
-
-        done();
-      });
-    });
-
-    it('should perform a GET request', function(done) {
-      var request = this.request;
-
-      this.actionTriggerBindings.getAll(params).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionTriggerBindings.getAll(params).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the parameters in the query-string', function(done) {
-      nock.cleanAll();
-
-      var params = {
-        include_fields: true,
-        fields: 'test'
-      };
-      var request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .query(params)
-        .reply(200);
-
-      this.actionTriggerBindings.getAll({ ...params, trigger_id: 'post-login' }).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#get', function() {
-    const params = { trigger_id: 'post-login', binding_id: 'binding-id-1' };
-    const actionTriggerBindingsURL =
-      '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id;
-
-    beforeEach(function() {
-      this.data = {
-        id: params.binding_id,
-        trigger_id: params.trigger_id,
-        action: {
-          id: '92312885-c121-4d79-a222-54f9a5b68611',
-          name: 'my-action-16',
-          supported_triggers: [
-            {
-              id: 'post-login',
-              version: 'v1'
-            }
-          ],
-          required_configuration: [],
-          required_secrets: [],
-          created_at: '2020-07-29T19:57:13.257251904Z',
-          updated_at: '2020-07-29T19:57:13.257251904Z'
-        },
-        created_at: '2020-07-30T18:34:43.450717161Z',
-        updated_at: '2020-07-30T18:34:43.450717161Z',
-        display_name: 'display name 2'
-      };
-
-      this.request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .reply(200, this.data);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionTriggerBindings.get(params, done.bind(null, null));
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionTriggerBindings
-        .get(params)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should perform a GET request', function(done) {
-      var request = this.request;
-
-      this.actionTriggerBindings.get(params).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .reply(500);
-
-      this.actionTriggerBindings.get(params).catch(function(err) {
-        expect(err).to.exist;
-
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get(actionTriggerBindingsURL)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionTriggerBindings.get(params).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#create', function() {
-    const params = { trigger_id: 'post-login' };
-    const actionTriggerBindingsURL = '/actions/triggers/' + params.trigger_id + '/bindings';
-    const data = {
-      action_id: '92312885-c121-4d79-a222-54f9a5b68611',
-      display_name: 'My new binding 2',
-      secrets: [],
-      configuration: [],
-      metadata: {}
-    };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post(actionTriggerBindingsURL)
-        .reply(201);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionTriggerBindings.create(params, data, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionTriggerBindings
-        .create(data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(actionTriggerBindingsURL)
-        .reply(500);
-
-      this.actionTriggerBindings.create(params, data).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should perform a POST request', function(done) {
-      var request = this.request;
-
-      this.actionTriggerBindings.create(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(actionTriggerBindingsURL, data)
-        .reply(200);
-
-      this.actionTriggerBindings.create(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(actionTriggerBindingsURL)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionTriggerBindings.create(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#test', function() {
-    const params = { trigger_id: 'post-login', binding_id: 'binding-id-1' };
-    const data = {
-      payload: {
-        user_info: 'userInfo'
-      }
-    };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post(
-          '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id + '/test',
-          data
-        )
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionTriggerBindings.test(params, data, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionTriggerBindings
-        .test(params, data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(
-          '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id + '/test',
-          data
-        )
-        .reply(500);
-
-      this.actionTriggerBindings.test(params, data).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should perform a POST request', function(done) {
-      var request = this.request;
-
-      this.actionTriggerBindings.test(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(
-          '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id + '/test',
-          data
-        )
-        .reply(200);
-
-      this.actionTriggerBindings.test(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(
-          '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id + '/test',
-          data
-        )
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionTriggerBindings.test(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#update', function() {
-    const params = { trigger_id: 'post-login', binding_id: 'binding-id-1' };
-    const actionTriggerBindingsURL =
-      '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id;
-    const data = { display_name: 'My new binding UPDATED' };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .patch(actionTriggerBindingsURL, data)
-        .reply(200, this.data);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionTriggerBindings.update(params, data, done.bind(null, null));
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionTriggerBindings
-        .update(params, data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should perform a PATCH request', function(done) {
-      var request = this.request;
-
-      this.actionTriggerBindings.update(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-
-    it('should include the new data in the body of the request', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .patch(actionTriggerBindingsURL, data)
-        .reply(200);
-
-      this.actionTriggerBindings.update(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .patch(actionTriggerBindingsURL)
-        .reply(500);
-
-      this.actionTriggerBindings.update(params, data).catch(function(err) {
-        expect(err).to.exist;
-
-        done();
-      });
-    });
-  });
-
-  describe('#delete', function() {
-    const params = { trigger_id: 'post-login', binding_id: 'binding-id-1' };
-    const actionTriggerBindingsURL =
-      '/actions/triggers/' + params.trigger_id + '/bindings/' + params.binding_id;
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .delete(actionTriggerBindingsURL)
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionTriggerBindings.delete(params, done.bind(null, null));
-    });
-
-    it('should return a promise when no callback is given', function(done) {
-      this.actionTriggerBindings.delete(params).then(done.bind(null, null));
-    });
-
-    it('should perform a delete request', function(done) {
-      var request = this.request;
-
-      this.actionTriggerBindings.delete(params).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .delete(actionTriggerBindingsURL)
-        .reply(500);
-
-      this.actionTriggerBindings.delete(params).catch(function(err) {
-        expect(err).to.exist;
-
-        done();
-      });
-    });
-
-    it('should include the token in the authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .delete(actionTriggerBindingsURL)
-        .matchHeader('authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionTriggerBindings.delete(params).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-});
diff --git a/test/management/actionVersions.tests.js b/test/management/actionVersions.tests.js
deleted file mode 100644
index b4a30523f..000000000
--- a/test/management/actionVersions.tests.js
+++ /dev/null
@@ -1,604 +0,0 @@
-var expect = require('chai').expect;
-var nock = require('nock');
-
-var SRC_DIR = '../../src';
-var API_URL = 'https://tenant.auth0.com';
-
-var ActionVersionsManager = require(SRC_DIR + '/management/ActionVersionsManager');
-var ArgumentError = require('rest-facade').ArgumentError;
-
-describe('ActionVersionsManager', function() {
-  before(function() {
-    this.token = 'TOKEN';
-    this.actionVersions = new ActionVersionsManager({
-      headers: { authorization: 'Bearer ' + this.token },
-      baseUrl: API_URL
-    });
-  });
-
-  describe('instance', function() {
-    var methods = ['get', 'getAll', 'create', 'delete', 'upsertDraft', 'deploy', 'test'];
-
-    methods.forEach(function(method) {
-      it('should have a ' + method + ' method', function() {
-        expect(this.actionVersions[method]).to.exist.to.be.an.instanceOf(Function);
-      });
-    });
-  });
-
-  describe('#constructor', function() {
-    it('should error when no options are provided', function() {
-      expect(ActionVersionsManager).to.throw(ArgumentError, 'Must provide client options');
-    });
-
-    it('should throw an error when no base URL is provided', function() {
-      var client = ActionVersionsManager.bind(null, {});
-
-      expect(client).to.throw(ArgumentError, 'Must provide a base URL for the API');
-    });
-
-    it('should throw an error when the base URL is invalid', function() {
-      var client = ActionVersionsManager.bind(null, { baseUrl: '' });
-
-      expect(client).to.throw(ArgumentError, 'The provided base URL is invalid');
-    });
-  });
-
-  describe('#getAll', function() {
-    const action_id = 'action-id-1';
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .get('/actions/actions/' + action_id + '/versions')
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionVersions.getAll({ action_id }, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionVersions
-        .getAll({ action_id })
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get('/actions/actions/' + action_id + '/versions')
-        .reply(500);
-
-      this.actionVersions.getAll({ action_id }).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should pass the body of the response to the "then" handler', function(done) {
-      nock.cleanAll();
-
-      var data = [{ test: true }];
-      var request = nock(API_URL)
-        .get('/actions/actions/' + action_id + '/versions')
-        .reply(200, data);
-
-      this.actionVersions.getAll({ action_id }).then(function(versions) {
-        expect(versions).to.be.an.instanceOf(Array);
-
-        expect(versions.length).to.equal(data.length);
-
-        expect(versions[0].test).to.equal(data[0].test);
-
-        done();
-      });
-    });
-
-    it('should perform a GET request to actions/actions/action_id/versions', function(done) {
-      var request = this.request;
-
-      this.actionVersions.getAll({ action_id }).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get('/actions/actions/' + action_id + '/versions')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionVersions.getAll({ action_id }).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the parameters in the query-string', function(done) {
-      nock.cleanAll();
-
-      var params = {
-        include_fields: true,
-        fields: 'test'
-      };
-      var request = nock(API_URL)
-        .get('/actions/actions/' + action_id + '/versions')
-        .query(params)
-        .reply(200);
-
-      this.actionVersions.getAll({ ...params, action_id }).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#get', function() {
-    beforeEach(function() {
-      this.data = {
-        id: 'version-id-1',
-        action: {
-          id: 'action-id-1',
-          name: 'my-action-14',
-          supported_triggers: [
-            {
-              id: 'post-login',
-              version: 'v1'
-            }
-          ],
-          required_configuration: [],
-          required_secrets: [],
-          created_at: '2020-07-29T19:45:15.725999098Z',
-          updated_at: '2020-07-29T19:45:15.725999098Z'
-        },
-        code:
-          "module.exports = function(user, context, cb) { console.log(require('lodash/package.json').version); cb(null, user, context); }",
-        dependencies: [
-          {
-            name: 'lodash',
-            version: '4.17.19'
-          }
-        ],
-        runtime: 'node12',
-        status: 'built',
-        created_at: '2020-07-31T16:30:15.890110176Z',
-        updated_at: '2020-07-31T16:30:16.941142964Z',
-        built_at: '2020-07-31T16:30:16.941087047Z'
-      };
-
-      this.request = nock(API_URL)
-        .get('/actions/actions/' + this.data.action.id + '/versions/' + this.data.id)
-        .reply(200, this.data);
-    });
-
-    it('should accept a callback', function(done) {
-      var params = { action_id: this.data.action.id, version_id: this.data.id };
-
-      this.actionVersions.get(params, done.bind(null, null));
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionVersions
-        .get({ action_id: this.data.action.id, version_id: this.data.id })
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should perform a GET request', function(done) {
-      var request = this.request;
-
-      this.actionVersions
-        .get({ action_id: this.data.action.id, version_id: this.data.id })
-        .then(function() {
-          expect(request.isDone()).to.be.true;
-          done();
-        });
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get('/actions/actions/' + this.data.action.id + '/versions/' + this.data.id)
-        .reply(500);
-
-      this.actionVersions
-        .get({ action_id: this.data.action.id, version_id: this.data.id })
-        .catch(function(err) {
-          expect(err).to.exist;
-
-          done();
-        });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get('/actions/actions/' + this.data.action.id + '/versions/' + this.data.id)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionVersions
-        .get({ action_id: this.data.action.id, version_id: this.data.id })
-        .then(function() {
-          expect(request.isDone()).to.be.true;
-
-          done();
-        });
-    });
-  });
-
-  describe('#create', function() {
-    const params = { action_id: 'action-id-1' };
-    const data = {
-      runtime: 'node12',
-      code:
-        "module.exports = function(user, context, cb) { console.log(require('lodash/package.json').version); cb(null, user, context); }",
-      dependencies: [{ name: 'lodash', version: '4.17.19' }]
-    };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions')
-        .reply(201);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionVersions.create(params, data, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionVersions
-        .create(data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions/')
-        .reply(500);
-
-      this.actionVersions.create(params, data).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should perform a POST request', function(done) {
-      var request = this.request;
-
-      this.actionVersions.create(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions', data)
-        .reply(200);
-
-      this.actionVersions.create(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionVersions.create(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#test', function() {
-    const params = { action_id: 'action-id-1', version_id: 'version-id-1' };
-    const data = {
-      payload: {
-        user_info: 'userInfo'
-      }
-    };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post(
-          '/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/test',
-          data
-        )
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionVersions.test(params, data, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionVersions
-        .test(params, data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(
-          '/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/test',
-          data
-        )
-        .reply(500);
-
-      this.actionVersions.test(params, data).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should perform a POST request', function(done) {
-      var request = this.request;
-
-      this.actionVersions.test(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(
-          '/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/test',
-          data
-        )
-        .reply(200);
-
-      this.actionVersions.test(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post(
-          '/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/test',
-          data
-        )
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionVersions.test(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#upsertDraft', function() {
-    const params = { action_id: 'action-id-1', version_id: 'draft' };
-    const data = {
-      runtime: 'node12',
-      code:
-        "module.exports = function(user, context, cb) { console.log(require('lodash/package.json').version); cb(null, user, context); }",
-      dependencies: [{ name: 'lodash', version: '4.17.19' }]
-    };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .patch('/actions/actions/' + params.action_id + '/versions/draft')
-        .reply(202);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionVersions.upsertDraft(params, data, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionVersions
-        .upsertDraft(data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .patch('/actions/actions/' + params.action_id + '/versions/draft')
-        .reply(500);
-
-      this.actionVersions.upsertDraft(params, data).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should perform a PATCH request', function(done) {
-      var request = this.request;
-
-      this.actionVersions.upsertDraft(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .patch('/actions/actions/' + params.action_id + '/versions/draft', data)
-        .reply(202);
-
-      this.actionVersions.upsertDraft(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .patch('/actions/actions/' + params.action_id + '/versions/draft')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(202);
-
-      this.actionVersions.upsertDraft(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#deploy', function() {
-    const params = { action_id: 'action-id-1', version_id: 'version-id-1' };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/deploy')
-        .reply(202);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionVersions.deploy(params, function() {
-        done();
-      });
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionVersions
-        .deploy(params)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/deploy')
-        .reply(500);
-
-      this.actionVersions.deploy(params).catch(function(err) {
-        expect(err).to.exist;
-        done();
-      });
-    });
-
-    it('should perform a POST request', function(done) {
-      var request = this.request;
-
-      this.actionVersions.deploy(params).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .post('/actions/actions/' + params.action_id + '/versions/' + params.version_id + '/deploy')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionVersions.deploy(params).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-
-  describe('#delete', function() {
-    const params = { action_id: 'action-id-1', version_id: 'version-id-1' };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .delete('/actions/actions/' + params.action_id + '/versions/' + params.version_id)
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      this.actionVersions.delete(params, done.bind(null, null));
-    });
-
-    it('should return a promise when no callback is given', function(done) {
-      this.actionVersions.delete(params).then(done.bind(null, null));
-    });
-
-    it('should perform a delete request', function(done) {
-      var request = this.request;
-
-      this.actionVersions.delete(params).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .delete('/actions/actions/' + params.action_id + '/versions/' + params.version_id)
-        .reply(500);
-
-      this.actionVersions.delete(params).catch(function(err) {
-        expect(err).to.exist;
-
-        done();
-      });
-    });
-
-    it('should include the token in the authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .delete('/actions/actions/' + params.action_id + '/versions/' + params.version_id)
-        .matchHeader('authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionVersions.delete(params).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-});
diff --git a/test/management/actions.tests.js b/test/management/actions.tests.js
index 4ded19f90..c43d1367f 100644
--- a/test/management/actions.tests.js
+++ b/test/management/actions.tests.js
@@ -17,7 +17,23 @@ describe('ActionsManager', function() {
   });
 
   describe('instance', function() {
-    var methods = ['get', 'getAll', 'create', 'update', 'delete', 'getAllTriggers', 'testTrigger'];
+    var methods = [
+      'get',
+      'getAll',
+      'create',
+      'update',
+      'delete',
+      'deploy',
+      'test',
+      'getVersions',
+      'getVersion',
+      'createVersion',
+      'deployVersion',
+      'getAllTriggers',
+      'testTrigger',
+      'getTriggerBindings',
+      'updateTriggerBindings'
+    ];
 
     methods.forEach(function(method) {
       it('should have a ' + method + ' method', function() {
@@ -44,552 +60,1131 @@ describe('ActionsManager', function() {
     });
   });
 
-  describe('#getAll', function() {
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .get('/actions/actions')
-        .reply(200);
-    });
+  describe('#actions', () => {
+    describe('#getAll', function() {
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .get('/actions/actions')
+          .reply(200);
+      });
 
-    it('should accept a callback', function(done) {
-      this.actions.getAll(function() {
-        done();
+      it('should accept a callback', function(done) {
+        this.actions.getAll(function() {
+          done();
+        });
       });
-    });
 
-    it('should return a promise if no callback is given', function(done) {
-      this.actions
-        .getAll()
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .getAll()
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .get('/actions/actions')
-        .reply(500);
+        var request = nock(API_URL)
+          .get('/actions/actions')
+          .reply(500);
 
-      this.actions.getAll().catch(function(err) {
-        expect(err).to.exist;
-        done();
+        this.actions.getAll().catch(function(err) {
+          expect(err).to.exist;
+          done();
+        });
       });
-    });
 
-    it('should pass the body of the response to the "then" handler', function(done) {
-      nock.cleanAll();
+      it('should pass the body of the response to the "then" handler', function(done) {
+        nock.cleanAll();
 
-      var data = [{ test: true }];
-      var request = nock(API_URL)
-        .get('/actions/actions')
-        .reply(200, data);
+        var data = [{ test: true }];
+        var request = nock(API_URL)
+          .get('/actions/actions')
+          .reply(200, data);
 
-      this.actions.getAll().then(function(credentials) {
-        expect(credentials).to.be.an.instanceOf(Array);
+        this.actions.getAll().then(function(credentials) {
+          expect(credentials).to.be.an.instanceOf(Array);
 
-        expect(credentials.length).to.equal(data.length);
+          expect(credentials.length).to.equal(data.length);
 
-        expect(credentials[0].test).to.equal(data[0].test);
+          expect(credentials[0].test).to.equal(data[0].test);
 
-        done();
+          done();
+        });
       });
-    });
 
-    it('should perform a GET request', function(done) {
-      var request = this.request;
+      it('should perform a GET request', function(done) {
+        var request = this.request;
 
-      this.actions.getAll().then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.getAll().then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
       });
-    });
 
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .get('/actions/actions')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
+        var request = nock(API_URL)
+          .get('/actions/actions')
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
 
-      this.actions.getAll().then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.getAll().then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
       });
-    });
 
-    it('should pass the parameters in the query-string', function(done) {
-      nock.cleanAll();
+      it('should pass the parameters in the query-string', function(done) {
+        nock.cleanAll();
 
-      var params = {
-        include_fields: true,
-        fields: 'test'
-      };
-      var request = nock(API_URL)
-        .get('/actions/actions')
-        .query(params)
-        .reply(200);
+        var params = {
+          include_fields: true,
+          fields: 'test'
+        };
+        var request = nock(API_URL)
+          .get('/actions/actions')
+          .query(params)
+          .reply(200);
 
-      this.actions.getAll(params).then(function() {
-        expect(request.isDone()).to.be.true;
+        this.actions.getAll(params).then(function() {
+          expect(request.isDone()).to.be.true;
 
-        done();
+          done();
+        });
       });
     });
-  });
 
-  describe('#getAllTriggers', function() {
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .get('/actions/triggers')
-        .reply(200);
-    });
+    describe('#get', function() {
+      beforeEach(function() {
+        this.data = {
+          id: '0d565aa1-d8ce-4802-83e7-82e3d2040222',
+          name: 'Test Action',
+          supported_triggers: [
+            {
+              id: 'post-login',
+              version: 'v1'
+            }
+          ],
+          required_configuration: [],
+          required_secrets: [],
+          created_at: '2020-07-29T19:45:15.725999098Z',
+          updated_at: '2020-07-29T19:45:15.725999098Z'
+        };
+
+        this.request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id)
+          .reply(200, this.data);
+      });
+
+      it('should accept a callback', function(done) {
+        var params = { action_id: this.data.id };
 
-    it('should accept a callback', function(done) {
-      this.actions.getAllTriggers(function() {
-        done();
+        this.actions.get(params, done.bind(null, null));
       });
-    });
 
-    it('should return a promise if no callback is given', function(done) {
-      this.actions
-        .getAllTriggers()
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .get({ action_id: this.data.id })
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
+
+      it('should perform a GET request', function(done) {
+        var request = this.request;
+
+        this.actions.get({ action_id: this.data.id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/actions' + this.data.id)
+          .reply(500);
+
+        this.actions.get({ action_id: this.data.id }).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id)
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.get({ action_id: this.data.id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
+      });
     });
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+    describe('#create', function() {
+      var data = {
+        name: 'my-action-13',
+        supported_triggers: [
+          {
+            id: 'post-login',
+            version: 'v1'
+          }
+        ]
+      };
+
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .post('/actions/actions')
+          .reply(201);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.create(data, function() {
+          done();
+        });
+      });
 
-      var request = nock(API_URL)
-        .get('/actions/triggers')
-        .reply(500);
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .create(data)
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-      this.actions.getAllTriggers().catch(function(err) {
-        expect(err).to.exist;
-        done();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions/')
+          .reply(500);
+
+        this.actions.create(data).catch(function(err) {
+          expect(err).to.exist;
+          done();
+        });
+      });
+
+      it('should perform a POST request', function(done) {
+        var request = this.request;
+
+        this.actions.create(data).then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
+      });
+
+      it('should pass the data in the body of the request', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions', data)
+          .reply(200);
+
+        this.actions.create(data).then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
+      });
+
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions')
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.create(data).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
 
-    it('should pass the body of the response to the "then" handler', function(done) {
-      nock.cleanAll();
+    describe('#update', function() {
+      beforeEach(function() {
+        this.data = { action_id: 'ACTION_ID' };
+
+        this.request = nock(API_URL)
+          .patch('/actions/actions/' + this.data.action_id, { name: 'my-new-action-name' })
+          .reply(200, this.data);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.update(
+          { action_id: 'ACTION_ID' },
+          { name: 'my-new-action-name' },
+          done.bind(null, null)
+        );
+      });
+
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .update({ action_id: 'ACTION_ID' }, { name: 'my-new-action-name' })
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
+
+      it('should perform a PATCH request', function(done) {
+        var request = this.request;
+
+        this.actions
+          .update({ action_id: 'ACTION_ID' }, { name: 'my-new-action-name' })
+          .then(function() {
+            expect(request.isDone()).to.be.true;
 
-      var data = [{ trigger1: 'rigger1' }];
-      var request = nock(API_URL)
-        .get('/actions/triggers')
-        .reply(200, data);
+            done();
+          });
+      });
 
-      this.actions.getAllTriggers().then(function(triggers) {
-        expect(triggers).to.be.an.instanceOf(Array);
+      it('should include the new data in the body of the request', function(done) {
+        nock.cleanAll();
 
-        expect(triggers.length).to.equal(data.length);
+        var request = nock(API_URL)
+          .patch('/actions/actions/' + this.data.action_id, { name: 'my-new-action-name' })
+          .reply(200);
 
-        expect(triggers[0].trigger1).to.equal(data[0].trigger1);
+        this.actions
+          .update({ action_id: 'ACTION_ID' }, { name: 'my-new-action-name' })
+          .then(function() {
+            expect(request.isDone()).to.be.true;
 
-        done();
+            done();
+          });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .patch('/actions/actions/' + this.data.id)
+          .reply(500);
+
+        this.actions
+          .update({ action_id: this.data.id }, { name: 'my-new-action-name' })
+          .catch(function(err) {
+            expect(err).to.exist;
+
+            done();
+          });
       });
     });
 
-    it('should perform a GET request', function(done) {
-      var request = this.request;
+    describe('#deploy', function() {
+      var action_id = 'action-id-1';
+
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/deploy')
+          .reply(200);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.deploy({ action_id }, done.bind(null, null));
+      });
+
+      it('should return a promise when no callback is given', function(done) {
+        this.actions.deploy({ action_id }).then(done.bind(null, null));
+      });
+
+      it('should perform a post request' + action_id, function(done) {
+        var request = this.request;
 
-      this.actions.getAllTriggers().then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.deploy({ action_id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/deploy')
+          .reply(500);
+
+        this.actions.deploy({ action_id }).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/deploy')
+          .matchHeader('authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.deploy({ action_id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
 
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
+    describe('#test', function() {
+      var action_id = 'action-id-1';
+      const payload = { event: {} };
+
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/test')
+          .reply(200);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.test({ action_id }, { payload }, done.bind(null, null));
+      });
+
+      it('should return a promise when no callback is given', function(done) {
+        this.actions.test({ action_id }, { payload }).then(done.bind(null, null));
+      });
+
+      it('should perform a post request' + action_id, function(done) {
+        var request = this.request;
+
+        this.actions.test({ action_id }, { payload }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/test')
+          .reply(500);
+
+        this.actions.test({ action_id }, { payload }).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the authorization header', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .get('/actions/triggers')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
+        var request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/test')
+          .matchHeader('authorization', 'Bearer ' + this.token)
+          .reply(200);
 
-      this.actions.getAllTriggers().then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.test({ action_id }, { payload }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
 
-    it('should pass the parameters in the query-string', function(done) {
-      nock.cleanAll();
+    describe('#delete', function() {
+      var action_id = 'action-id-1';
 
-      var params = {
-        include_fields: true,
-        fields: 'test'
-      };
-      var request = nock(API_URL)
-        .get('/actions/triggers')
-        .query(params)
-        .reply(200);
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .delete('/actions/actions/' + action_id)
+          .reply(200);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.delete({ action_id }, done.bind(null, null));
+      });
+
+      it('should return a promise when no callback is given', function(done) {
+        this.actions.delete({ action_id }).then(done.bind(null, null));
+      });
+
+      it('should perform a delete request' + action_id, function(done) {
+        var request = this.request;
+
+        this.actions.delete({ action_id }).then(function() {
+          expect(request.isDone()).to.be.true;
 
-      this.actions.getAllTriggers(params).then(function() {
-        expect(request.isDone()).to.be.true;
+          done();
+        });
+      });
 
-        done();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .delete('/actions/actions/' + action_id)
+          .reply(500);
+
+        this.actions.delete({ action_id }).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .delete('/actions/actions/' + action_id)
+          .matchHeader('authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.delete({ action_id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
   });
 
-  describe('#testTrigger', function() {
-    const params = { trigger_id: 'post-login' };
-    const data = {
-      payload: {
-        user_info: 'userInfo'
-      }
-    };
-
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post('/actions/triggers/' + params.trigger_id + '/test', data)
-        .reply(200);
-    });
+  describe('action versions', function() {
+    describe('#getVersions', function() {
+      beforeEach(function() {
+        nock.cleanAll();
+
+        this.data = {
+          id: '0d565aa1-d8ce-4802-83e7-82e3d2040222'
+        };
 
-    it('should accept a callback', function(done) {
-      this.actions.testTrigger(params, data, function() {
-        done();
+        this.request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id + '/versions')
+          .reply(200, this.data);
       });
-    });
 
-    it('should return a promise if no callback is given', function(done) {
-      this.actions
-        .testTrigger(params, data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
+      it('should accept a callback', function(done) {
+        var params = { action_id: this.data.id };
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+        this.actions.getVersions(params, done.bind(null, null));
+      });
 
-      var request = nock(API_URL)
-        .post('/actions/triggers/' + params.trigger_id + '/test', data)
-        .reply(500);
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .get({ action_id: this.data.id })
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
+
+      it('should perform a GET request', function(done) {
+        var request = this.request;
+
+        this.actions.getVersions({ action_id: this.data.id }).then(function() {
+          expect(request.isDone()).to.be.true;
 
-      this.actions.testTrigger(params, data).catch(function(err) {
-        expect(err).to.exist;
-        done();
+          done();
+        });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id + '/versions')
+          .reply(500);
+
+        this.actions.getVersions({ action_id: this.data.id }).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id + '/versions')
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.getVersions({ action_id: this.data.id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
 
-    it('should perform a POST request', function(done) {
-      var request = this.request;
+    describe('#getVersion', function() {
+      beforeEach(function() {
+        nock.cleanAll();
+
+        this.data = {
+          id: '0d565aa1-d8ce-4802-83e7-82e3d2040222',
+          versionId: '7asd8sd9-d8ce-4802-83e7-82e3d2040222'
+        };
+
+        this.request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id + '/versions/' + this.data.versionId)
+          .reply(200, this.data);
+      });
+
+      it('should accept a callback', function(done) {
+        var params = { action_id: this.data.id, version_id: this.data.versionId };
+
+        this.actions.getVersion(params, done.bind(null, null));
+      });
+
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .get({ action_id: this.data.id, version_id: this.data.versionId })
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
+
+      it('should perform a GET request', function(done) {
+        var request = this.request;
+
+        this.actions
+          .getVersion({ action_id: this.data.id, version_id: this.data.versionId })
+          .then(function() {
+            expect(request.isDone()).to.be.true;
 
-      this.actions.testTrigger(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+            done();
+          });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id + '/versions/' + this.data.versionId)
+          .reply(500);
+
+        this.actions
+          .getVersion({ action_id: this.data.id, version_id: this.data.versionId })
+          .catch(function(err) {
+            expect(err).to.exist;
+
+            done();
+          });
+      });
+
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/actions/' + this.data.id + '/versions/' + this.data.versionId)
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions
+          .getVersion({ action_id: this.data.id, version_id: this.data.versionId })
+          .then(function() {
+            expect(request.isDone()).to.be.true;
+
+            done();
+          });
       });
     });
 
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
+    describe('#createVersion', function() {
+      beforeEach(function() {
+        nock.cleanAll();
+
+        this.data = {
+          id: '0d565aa1-d8ce-4802-83e7-82e3d2040222'
+        };
+
+        this.request = nock(API_URL)
+          .post('/actions/actions/' + this.data.id + '/versions')
+          .reply(200, this.data);
+      });
+
+      it('should accept a callback', function(done) {
+        var params = { action_id: this.data.id };
+
+        this.actions.createVersion(params, this.data, done.bind(null, null));
+      });
+
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .createVersion({ action_id: this.data.id }, {})
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
+
+      it('should perform a POST request', function(done) {
+        var request = this.request;
+
+        this.actions.createVersion({ action_id: this.data.id }, {}).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions/' + this.data.id + '/versions')
+          .reply(500);
+
+        this.actions.createVersion({ action_id: this.data.id }, {}).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .post('/actions/triggers/' + params.trigger_id + '/test', data)
-        .reply(200);
+        var request = nock(API_URL)
+          .post('/actions/actions/' + this.data.id + '/versions')
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
 
-      this.actions.testTrigger(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.createVersion({ action_id: this.data.id }, {}).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
 
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
+    describe('#deployVersion', function() {
+      var action_id = 'action-id-1';
+      var version_id = 'action-version-id-1';
+
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/versions/' + version_id + '/deploy')
+          .reply(200);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.deployVersion({ action_id, version_id }, done.bind(null, null));
+      });
+
+      it('should return a promise when no callback is given', function(done) {
+        this.actions.deployVersion({ action_id, version_id }).then(done.bind(null, null));
+      });
+
+      it('should perform a post request', function(done) {
+        var request = this.request;
+
+        this.actions.deployVersion({ action_id, version_id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
+      });
 
-      var request = nock(API_URL)
-        .post('/actions/triggers/' + params.trigger_id + '/test', data)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
 
-      this.actions.testTrigger(params, data).then(function() {
-        expect(request.isDone()).to.be.true;
+        var request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/versions/' + version_id + '/deploy')
+          .reply(500);
 
-        done();
+        this.actions.deployVersion({ action_id, version_id }).catch(function(err) {
+          expect(err).to.exist;
+
+          done();
+        });
+      });
+
+      it('should include the token in the authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .post('/actions/actions/' + action_id + '/deploy')
+          .matchHeader('authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.deploy({ action_id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
   });
 
-  describe('#get', function() {
-    beforeEach(function() {
-      this.data = {
-        id: '0d565aa1-d8ce-4802-83e7-82e3d2040222',
-        name: 'Test Action',
-        supported_triggers: [
-          {
-            id: 'post-login',
-            version: 'v1'
-          }
-        ],
-        required_configuration: [],
-        required_secrets: [],
-        created_at: '2020-07-29T19:45:15.725999098Z',
-        updated_at: '2020-07-29T19:45:15.725999098Z'
-      };
+  describe('executions', function() {
+    describe('#getExecution', function() {
+      beforeEach(function() {
+        this.data = {
+          id: '0d565aa1-d8ce-4802-83e7',
+          name: 'Execution'
+        };
+
+        this.request = nock(API_URL)
+          .get('/actions/executions/' + this.data.id)
+          .reply(200);
+      });
 
-      this.request = nock(API_URL)
-        .get('/actions/actions/' + this.data.id)
-        .reply(200, this.data);
-    });
+      it('should accept a callback', function(done) {
+        var params = { execution_id: this.data.id };
 
-    it('should accept a callback', function(done) {
-      var params = { action_id: this.data.id };
+        this.actions.getExecution(params, done.bind(null, null));
+      });
 
-      this.actions.get(params, done.bind(null, null));
-    });
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .getExecution({ execution_id: this.data.id })
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-    it('should return a promise if no callback is given', function(done) {
-      this.actions
-        .get({ action_id: this.data.id })
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
+      it('should perform a GET request', function(done) {
+        var request = this.request;
+
+        this.actions
+          .getExecution({ execution_id: this.data.id })
+          .then(function() {
+            expect(request.isDone()).to.be.true;
 
-    it('should perform a GET request', function(done) {
-      var request = this.request;
+            done();
+          })
+          .catch(function(err) {
+            console.log(err);
+          });
+      });
+
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/executions/' + this.data.id)
+          .reply(500);
 
-      this.actions.get({ action_id: this.data.id }).then(function() {
-        expect(request.isDone()).to.be.true;
+        this.actions.getExecution({ execution_id: this.data.id }).catch(function(err) {
+          expect(err).to.exist;
 
-        done();
+          done();
+        });
       });
-    });
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .get('/actions/actions' + this.data.id)
-        .reply(500);
+        var request = nock(API_URL)
+          .get('/actions/executions/' + this.data.id)
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
 
-      this.actions.get({ action_id: this.data.id }).catch(function(err) {
-        expect(err).to.exist;
+        this.actions.getExecution({ execution_id: this.data.id }).then(function() {
+          expect(request.isDone()).to.be.true;
 
-        done();
+          done();
+        });
       });
     });
+  });
+
+  describe('triggers', () => {
+    const params = { per_page: 2 };
+    describe('#getAllTriggers', function() {
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .get('/actions/triggers')
+          .reply(200);
+      });
+
+      it('should accept a callback', function(done) {
+        this.actions.getAllTriggers(params, function() {
+          done();
+        });
+      });
+
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .getAllTriggers()
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .get('/actions/actions/' + this.data.id)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
+        var request = nock(API_URL)
+          .get('/actions/triggers')
+          .reply(500);
 
-      this.actions.get({ action_id: this.data.id }).then(function() {
-        expect(request.isDone()).to.be.true;
+        this.actions.getAllTriggers().catch(function(err) {
+          expect(err).to.exist;
+          done();
+        });
+      });
+
+      it('should pass the body of the response to the "then" handler', function(done) {
+        nock.cleanAll();
+
+        var data = [{ trigger1: 'rigger1' }];
+        var request = nock(API_URL)
+          .get('/actions/triggers')
+          .reply(200, data);
+
+        this.actions.getAllTriggers().then(function(triggers) {
+          expect(triggers).to.be.an.instanceOf(Array);
 
-        done();
+          expect(triggers.length).to.equal(data.length);
+
+          expect(triggers[0].trigger1).to.equal(data[0].trigger1);
+
+          done();
+        });
+      });
+
+      it('should perform a GET request', function(done) {
+        var request = this.request;
+
+        this.actions.getAllTriggers().then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
+      });
+
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
+
+        var request = nock(API_URL)
+          .get('/actions/triggers')
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
+
+        this.actions.getAllTriggers().then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
+      });
+
+      it('should pass the parameters in the query-string', function(done) {
+        nock.cleanAll();
+
+        var params = {
+          include_fields: true,
+          fields: 'test'
+        };
+        var request = nock(API_URL)
+          .get('/actions/triggers')
+          .query(params)
+          .reply(200);
+
+        this.actions.getAllTriggers(params).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
     });
-  });
 
-  describe('#create', function() {
-    var data = {
-      name: 'my-action-13',
-      supported_triggers: [
-        {
-          id: 'post-login',
-          version: 'v1'
+    describe('#testTrigger', function() {
+      const params = { trigger_id: 'post-login' };
+      const data = {
+        payload: {
+          user_info: 'userInfo'
         }
-      ]
-    };
+      };
 
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .post('/actions/actions')
-        .reply(201);
-    });
+      beforeEach(function() {
+        this.request = nock(API_URL)
+          .post('/actions/triggers/' + params.trigger_id + '/test', data)
+          .reply(200);
+      });
 
-    it('should accept a callback', function(done) {
-      this.actions.create(data, function() {
-        done();
+      it('should accept a callback', function(done) {
+        this.actions.testTrigger(params, data, function() {
+          done();
+        });
       });
-    });
 
-    it('should return a promise if no callback is given', function(done) {
-      this.actions
-        .create(data)
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .testTrigger(params, data)
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .post('/actions/actions/')
-        .reply(500);
+        var request = nock(API_URL)
+          .post('/actions/triggers/' + params.trigger_id + '/test', data)
+          .reply(500);
 
-      this.actions.create(data).catch(function(err) {
-        expect(err).to.exist;
-        done();
+        this.actions.testTrigger(params, data).catch(function(err) {
+          expect(err).to.exist;
+          done();
+        });
       });
-    });
 
-    it('should perform a POST request', function(done) {
-      var request = this.request;
+      it('should perform a POST request', function(done) {
+        var request = this.request;
 
-      this.actions.create(data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.testTrigger(params, data).then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
       });
-    });
 
-    it('should pass the data in the body of the request', function(done) {
-      nock.cleanAll();
+      it('should pass the data in the body of the request', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .post('/actions/actions', data)
-        .reply(200);
+        var request = nock(API_URL)
+          .post('/actions/triggers/' + params.trigger_id + '/test', data)
+          .reply(200);
 
-      this.actions.create(data).then(function() {
-        expect(request.isDone()).to.be.true;
-        done();
+        this.actions.testTrigger(params, data).then(function() {
+          expect(request.isDone()).to.be.true;
+          done();
+        });
       });
-    });
 
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
+      it('should include the token in the Authorization header', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .post('/actions/actions')
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
+        var request = nock(API_URL)
+          .post('/actions/triggers/' + params.trigger_id + '/test', data)
+          .matchHeader('Authorization', 'Bearer ' + this.token)
+          .reply(200);
 
-      this.actions.create(data).then(function() {
-        expect(request.isDone()).to.be.true;
+        this.actions.testTrigger(params, data).then(function() {
+          expect(request.isDone()).to.be.true;
 
-        done();
+          done();
+        });
       });
     });
-  });
 
-  describe('#update', function() {
-    beforeEach(function() {
-      this.data = { action_id: 'ACTION_ID' };
+    describe('#updateTriggerBindings', function() {
+      const trigger_id = 'post-login';
 
-      this.request = nock(API_URL)
-        .patch('/actions/actions/' + this.data.action_id, { name: 'my-new-action-name' })
-        .reply(200, this.data);
-    });
+      beforeEach(function() {
+        this.data = { bindings: [] };
 
-    it('should accept a callback', function(done) {
-      this.actions.update(
-        { action_id: 'ACTION_ID' },
-        { name: 'my-new-action-name' },
-        done.bind(null, null)
-      );
-    });
+        this.request = nock(API_URL)
+          .patch('/actions/triggers/' + trigger_id + '/bindings')
+          .reply(200, this.data);
+      });
 
-    it('should return a promise if no callback is given', function(done) {
-      this.actions
-        .update({ action_id: 'ACTION_ID' }, { name: 'my-new-action-name' })
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
+      it('should accept a callback', function(done) {
+        this.actions.updateTriggerBindings({ trigger_id }, this.data, done.bind(null, null));
+      });
+
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .updateTriggerBindings({ trigger_id }, this.data)
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-    it('should perform a PATCH request', function(done) {
-      var request = this.request;
+      it('should perform a PATCH request', function(done) {
+        var request = this.request;
 
-      this.actions
-        .update({ action_id: 'ACTION_ID' }, { name: 'my-new-action-name' })
-        .then(function() {
+        this.actions.updateTriggerBindings({ trigger_id }, this.data).then(function() {
           expect(request.isDone()).to.be.true;
 
           done();
         });
-    });
+      });
 
-    it('should include the new data in the body of the request', function(done) {
-      nock.cleanAll();
+      it('should include the new data in the body of the request', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .patch('/actions/actions/' + this.data.action_id, { name: 'my-new-action-name' })
-        .reply(200);
+        var request = nock(API_URL)
+          .patch('/actions/triggers/' + trigger_id + '/bindings')
+          .reply(200);
 
-      this.actions
-        .update({ action_id: 'ACTION_ID' }, { name: 'my-new-action-name' })
-        .then(function() {
+        this.actions.updateTriggerBindings({ trigger_id }, this.data).then(function() {
           expect(request.isDone()).to.be.true;
 
           done();
         });
-    });
+      });
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .patch('/actions/actions/' + this.data.id)
-        .reply(500);
+        var request = nock(API_URL)
+          .patch('/actions/triggers/' + trigger_id + '/bindings')
+          .reply(500);
 
-      this.actions
-        .update({ action_id: this.data.id }, { name: 'my-new-action-name' })
-        .catch(function(err) {
+        this.actions.updateTriggerBindings({ trigger_id }, this.data).catch(function(err) {
           expect(err).to.exist;
 
           done();
         });
+      });
     });
-  });
 
-  describe('#delete', function() {
-    var action_id = 'action-id-1';
+    describe('#getTriggerBindings', function() {
+      const trigger_id = 'post-login';
 
-    beforeEach(function() {
-      this.request = nock(API_URL)
-        .delete('/actions/actions/' + action_id)
-        .reply(200);
-    });
+      beforeEach(function() {
+        this.data = { bindings: {} };
 
-    it('should accept a callback', function(done) {
-      this.actions.delete({ action_id }, done.bind(null, null));
-    });
+        this.request = nock(API_URL)
+          .get('/actions/triggers/' + trigger_id + '/bindings')
+          .reply(200, this.data);
+      });
 
-    it('should return a promise when no callback is given', function(done) {
-      this.actions.delete({ action_id }).then(done.bind(null, null));
-    });
+      it('should accept a callback', function(done) {
+        this.actions.getTriggerBindings({ trigger_id }, done.bind(null, null));
+      });
 
-    it('should perform a delete request' + action_id, function(done) {
-      var request = this.request;
+      it('should return a promise if no callback is given', function(done) {
+        this.actions
+          .getTriggerBindings({ trigger_id })
+          .then(done.bind(null, null))
+          .catch(done.bind(null, null));
+      });
 
-      this.actions.delete({ action_id }).then(function() {
-        expect(request.isDone()).to.be.true;
+      it('should perform a GET request', function(done) {
+        var request = this.request;
 
-        done();
+        this.actions.getTriggerBindings({ trigger_id }).then(function() {
+          expect(request.isDone()).to.be.true;
+
+          done();
+        });
       });
-    });
 
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
+      it('should include the new data in the body of the request', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .delete('/actions/actions/' + action_id)
-        .reply(500);
+        var request = nock(API_URL)
+          .get('/actions/triggers/' + trigger_id + '/bindings')
+          .reply(200);
 
-      this.actions.delete({ action_id }).catch(function(err) {
-        expect(err).to.exist;
+        this.actions.getTriggerBindings({ trigger_id }).then(function() {
+          expect(request.isDone()).to.be.true;
 
-        done();
+          done();
+        });
       });
-    });
 
-    it('should include the token in the authorization header', function(done) {
-      nock.cleanAll();
+      it('should pass any errors to the promise catch handler', function(done) {
+        nock.cleanAll();
 
-      var request = nock(API_URL)
-        .delete('/actions/actions/' + action_id)
-        .matchHeader('authorization', 'Bearer ' + this.token)
-        .reply(200);
+        var request = nock(API_URL)
+          .patch('/actions/triggers/' + trigger_id + '/bindings')
+          .reply(500);
 
-      this.actions.delete({ action_id }).then(function() {
-        expect(request.isDone()).to.be.true;
+        this.actions.getTriggerBindings({ trigger_id }).catch(function(err) {
+          expect(err).to.exist;
 
-        done();
+          done();
+        });
       });
     });
   });
diff --git a/test/management/actionsExecutions.tests.js b/test/management/actionsExecutions.tests.js
deleted file mode 100644
index 1849c75e3..000000000
--- a/test/management/actionsExecutions.tests.js
+++ /dev/null
@@ -1,116 +0,0 @@
-var expect = require('chai').expect;
-var nock = require('nock');
-
-var SRC_DIR = '../../src';
-var API_URL = 'https://tenant.auth0.com';
-
-var ActionExecutionsManager = require(SRC_DIR + '/management/ActionExecutionsManager');
-var ArgumentError = require('rest-facade').ArgumentError;
-
-describe('ActionExecutionsManager', function() {
-  before(function() {
-    this.token = 'TOKEN';
-    this.actionExecutions = new ActionExecutionsManager({
-      headers: { authorization: 'Bearer ' + this.token },
-      baseUrl: API_URL
-    });
-  });
-
-  describe('instance', function() {
-    var methods = ['get'];
-
-    methods.forEach(function(method) {
-      it('should have a ' + method + ' method', function() {
-        expect(this.actionExecutions[method]).to.exist.to.be.an.instanceOf(Function);
-      });
-    });
-  });
-
-  describe('#constructor', function() {
-    it('should error when no options are provided', function() {
-      expect(ActionExecutionsManager).to.throw(ArgumentError, 'Must provide client options');
-    });
-
-    it('should throw an error when no base URL is provided', function() {
-      var client = ActionExecutionsManager.bind(null, {});
-
-      expect(client).to.throw(ArgumentError, 'Must provide a base URL for the API');
-    });
-
-    it('should throw an error when the base URL is invalid', function() {
-      var client = ActionExecutionsManager.bind(null, { baseUrl: '' });
-
-      expect(client).to.throw(ArgumentError, 'The provided base URL is invalid');
-    });
-  });
-
-  describe('#get', function() {
-    beforeEach(function() {
-      this.data = {
-        id: '0d565aa1-d8ce-4802-83e7',
-        name: 'Execution'
-      };
-
-      this.request = nock(API_URL)
-        .get('/actions/executions/' + this.data.id)
-        .reply(200);
-    });
-
-    it('should accept a callback', function(done) {
-      var params = { execution_id: this.data.id };
-
-      this.actionExecutions.get(params, done.bind(null, null));
-    });
-
-    it('should return a promise if no callback is given', function(done) {
-      this.actionExecutions
-        .get({ execution_id: this.data.id })
-        .then(done.bind(null, null))
-        .catch(done.bind(null, null));
-    });
-
-    it('should perform a GET request', function(done) {
-      var request = this.request;
-
-      this.actionExecutions
-        .get({ execution_id: this.data.id })
-        .then(function() {
-          expect(request.isDone()).to.be.true;
-
-          done();
-        })
-        .catch(function(err) {
-          console.log(err);
-        });
-    });
-
-    it('should pass any errors to the promise catch handler', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get('/actions/executions/' + this.data.id)
-        .reply(500);
-
-      this.actionExecutions.get({ execution_id: this.data.id }).catch(function(err) {
-        expect(err).to.exist;
-
-        done();
-      });
-    });
-
-    it('should include the token in the Authorization header', function(done) {
-      nock.cleanAll();
-
-      var request = nock(API_URL)
-        .get('/actions/executions/' + this.data.id)
-        .matchHeader('Authorization', 'Bearer ' + this.token)
-        .reply(200);
-
-      this.actionExecutions.get({ execution_id: this.data.id }).then(function() {
-        expect(request.isDone()).to.be.true;
-
-        done();
-      });
-    });
-  });
-});