diff --git a/src/base-commands/twilio-api-command.js b/src/base-commands/twilio-api-command.js index 3e5240203..d3bab7d51 100644 --- a/src/base-commands/twilio-api-command.js +++ b/src/base-commands/twilio-api-command.js @@ -45,7 +45,15 @@ class TwilioApiCommand extends TwilioClientCommand { } } -TwilioApiCommand.flags = TwilioClientCommand.flags; +TwilioApiCommand.flags = Object.assign( + { + 'skip-parameter-validation': flags.boolean({ + default: false, + hidden: true + }) + }, + TwilioClientCommand.flags +); // A static function to help us add the other static // fields required by oclif on our dynamically created diff --git a/src/services/twilio-api/api-command-runner.js b/src/services/twilio-api/api-command-runner.js index d017c4dc4..f6a1b1073 100644 --- a/src/services/twilio-api/api-command-runner.js +++ b/src/services/twilio-api/api-command-runner.js @@ -44,7 +44,7 @@ class ApiCommandRunner { // If there were any errors validating the flag values, log them by flag // key and throw. - if (Object.keys(flagErrors).length > 0) { + if (Object.keys(flagErrors).length > 0 && !this.flagValues['skip-parameter-validation']) { logger.error('Flag value validation errors:'); Object.keys(flagErrors).forEach(key => { flagErrors[key].forEach(error => { diff --git a/test/base-commands/twilio-api-command.test.js b/test/base-commands/twilio-api-command.test.js index a250dbb3f..0fca7ef25 100644 --- a/test/base-commands/twilio-api-command.test.js +++ b/test/base-commands/twilio-api-command.test.js @@ -4,7 +4,7 @@ const { expect, test, constants } = require('@twilio/cli-test'); const { fakeResource, fakeCallResponse } = require('./twilio-api-command.fixtures'); const { Config, ConfigData } = require('@twilio/cli-core').services.config; -const NUMBER_OF_BASE_COMMAND_FLAGS = 4; +const NUMBER_OF_BASE_COMMAND_FLAGS = 5; const NUMBER_OF_PARAMS_FOR_CALL_CREATE = fakeResource.actions.create.parameters.length; describe('base-commands', () => { @@ -101,10 +101,7 @@ describe('base-commands', () => { .nock('https://api.twilio.com', api => api.delete(`/2010-04-01/Accounts/${constants.FAKE_ACCOUNT_SID}/Calls/${fakeCallResponse.sid}.json`).reply(204) ) - .twilioCommand(getCommandClass(callRemoveActionDefinition), [ - '--sid', - fakeCallResponse.sid - ]) + .twilioCommand(getCommandClass(callRemoveActionDefinition), ['--sid', fakeCallResponse.sid]) .it('creates a call', ctx => { expect(ctx.stdout).to.be.empty; expect(ctx.stderr).to.contain('success'); @@ -128,6 +125,28 @@ describe('base-commands', () => { .it('exits with a failure code and prints validation errors', ctx => { expect(ctx.stderr).to.contain('validation errors'); }); + + test + .twilioFakeProject(ConfigData) + .twilioCliEnv(Config) + .stdout() + .nock('https://api.twilio.com', api => + api.post(`/2010-04-01/Accounts/${constants.FAKE_ACCOUNT_SID}/Calls.json`).reply(201, fakeCallResponse) + ) + .twilioCommand(getCommandClass(), [ + '--skip-parameter-validation', + '--from', + '+15555555555', + '--to', + '+14155555555', + '--url', + 'http://example.com/', + '--account-sid', + 'ac12345678901234567890123456789012' // Lower-cased 'ac' + ]) + .it('creates a call with invalid parameter', ctx => { + expect(ctx.stdout).to.contain(fakeCallResponse.sid); + }); }); }); });