serverless/test/unit/lib/cli/parse-args.test.js
2024-05-29 11:51:04 -04:00

205 lines
6.3 KiB
JavaScript

'use strict'
const { expect } = require('chai')
const ServerlessError = require('../../../../lib/serverless-error')
const parseArgs = require('../../../../lib/cli/parse-args')
describe('test/unit/lib/cli/parse-args.test.js', () => {
let parsedArgs
before(() => {
parsedArgs = parseArgs(
[
'--string',
'one space separated',
'--unspecified-string=two space separated',
'--unspecified-boolean',
'--unspecified-multiple',
'one',
'--unspecified-multiple=',
'--unspecified-multiple=',
'--unspecified-multiple',
'test',
'--unspecified-multiple=another',
'--unspecified-multiple',
'another2',
'--unspecified-multiple2',
'one',
'--unspecified-multiple2',
'other',
'--multiple',
'single',
'--string-empty=',
'-a',
'value',
'--multiple=',
'--multiple',
'other',
'--boolean',
'elo',
'--no-other-boolean',
'foo',
'--empty=',
'-bc',
'--underscore_separator',
'underscored_value',
'--UPPER_CASE_PARAM',
'UPPER_CASE_VALUE',
'--',
'--ignored1',
'--ignored2',
],
{
boolean: new Set(['boolean', 'other-boolean']),
string: new Set(['string', 'string-empty']),
multiple: new Set(['multiple']),
alias: new Map([['a', 'alias']]),
},
)
})
it('should recognize string param', async () => {
expect(parsedArgs.string).to.equal('one space separated')
delete parsedArgs.string
})
it('should recognize unspecified string param', async () => {
expect(parsedArgs['unspecified-string']).to.equal('two space separated')
delete parsedArgs['unspecified-string']
})
it('should recognize unspecified boolean param', async () => {
expect(parsedArgs['unspecified-boolean']).to.equal(true)
delete parsedArgs['unspecified-boolean']
})
it('should recognize unspecified multiple param', async () => {
expect(parsedArgs['unspecified-multiple']).to.deep.equal([
'one',
null,
null,
'test',
'another',
'another2',
])
expect(parsedArgs['unspecified-multiple2']).to.deep.equal(['one', 'other'])
delete parsedArgs['unspecified-multiple']
delete parsedArgs['unspecified-multiple2']
})
it('should recognize multiple param', async () => {
expect(parsedArgs.multiple).to.deep.equal(['single', null, 'other'])
delete parsedArgs.multiple
})
it('should recognize alias', async () => {
expect(parsedArgs.alias).to.equal('value')
delete parsedArgs.alias
})
it('should recognize boolean', async () => {
expect(parsedArgs.boolean).to.equal(true)
delete parsedArgs.boolean
})
it('should recognize negated boolean', async () => {
expect(parsedArgs['other-boolean']).to.equal(false)
delete parsedArgs['other-boolean']
})
it('should recognize mutliple aliases shortcut', async () => {
expect(parsedArgs.b).to.equal(true)
expect(parsedArgs.c).to.equal(true)
delete parsedArgs.b
delete parsedArgs.c
})
it('should recognize empty value', async () => {
expect(parsedArgs.empty).to.equal(null)
expect(parsedArgs['string-empty']).to.equal(null)
delete parsedArgs.empty
delete parsedArgs['string-empty']
})
it('should recognize underscore chars in params', async () => {
expect(parsedArgs.underscore_separator).to.equal('underscored_value')
delete parsedArgs.underscore_separator
})
it('should recognize uppercased params', async () => {
expect(parsedArgs.UPPER_CASE_PARAM).to.equal('UPPER_CASE_VALUE')
delete parsedArgs.UPPER_CASE_PARAM
})
it('should recognize positional arguments', async () => {
expect(parsedArgs._).to.deep.equal([
'elo',
'foo',
'--ignored1',
'--ignored2',
])
delete parsedArgs._
})
it('should not expose unexpected properties', async () => {
expect(parsedArgs).to.deep.equal({})
})
it('should not throw if -h or --help param', () => {
parseArgs(['-ab=foo', '--help'], {})
parseArgs(['--boolean=value', '-h'], { boolean: new Set(['boolean']) })
})
it('should reject value for mutliple boolean properties alias', () =>
expect(() => parseArgs(['-ab=foo'], {}))
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_VALUE'))
it('should reject multiple values for aliased boolean properties', () =>
expect(() => parseArgs(['-a', 'foo', '-ab'], {}))
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_MULTIPLE_VALUE'))
it('should reject value for negated boolean properties', () =>
expect(() =>
parseArgs(['--no-boolean=value'], { boolean: new Set(['boolean']) }),
)
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_VALUE'))
it('should reject multiple values for negated boolean properties', () =>
expect(() => parseArgs(['--boolean', 'foo', '--no-boolean'], {}))
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_MULTIPLE_VALUE'))
it('should reject value for boolean properties', () =>
expect(() =>
parseArgs(['--boolean=value'], { boolean: new Set(['boolean']) }),
)
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_VALUE'))
it('should reject multiple values for boolean properties', () =>
expect(() => parseArgs(['--boolean', 'foo', '--boolean'], {}))
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_MULTIPLE_VALUE'))
it('should reject boolean value for string property', () =>
expect(() => parseArgs(['--string'], { string: new Set(['string']) }))
.to.throw(ServerlessError)
.with.property('code', 'MISSING_CLI_PARAM_VALUE'))
it('should reject multiple values for singular properties', () =>
expect(() =>
parseArgs(['--string', 'foo', '--string=bar'], {
string: new Set(['string']),
}),
)
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_MULTIPLE_VALUE'))
it('should reject multiple values for unspecified boolean properties', () =>
expect(() => parseArgs(['--boolean', '--boolean=foo'], {}))
.to.throw(ServerlessError)
.with.property('code', 'UNEXPECTED_CLI_PARAM_MULTIPLE_VALUE'))
})