Skip to content

Commit

Permalink
Merge pull request #46 from apiaryio/honzajavorek/required-params-use…
Browse files Browse the repository at this point in the history
…-default

Use default value even though the parameter is required
  • Loading branch information
pksunkara committed Jul 20, 2016
2 parents 4268f80 + 11eac57 commit c5a545c
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 39 deletions.
53 changes: 30 additions & 23 deletions src/expand-uri-template-with-parameters.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ expandUriTemplateWithParameters = (uriTemplate, parameters) ->
try
parsed = ut.parse uriTemplate
catch e
text = "\n Failed to parse URI template: #{uriTemplate}"
text += "\n Error: #{e}"
result.errors.push text
result.errors.push("""\
Failed to parse URI template: #{uriTemplate}
Error: #{e}\
""")
return result

# get parameters from expression object
Expand All @@ -30,32 +31,38 @@ expandUriTemplateWithParameters = (uriTemplate, parameters) ->
for uriParameter in uriParameters
if Object.keys(parameters).indexOf(uriParameter) is -1
ambiguous = true
text = "\nAmbiguous URI parameter in template: #{uriTemplate} " + \
"\nParameter not defined in API description document: " + \
"'" + uriParameter + "'"
result.warnings.push text
result.warnings.push("""\
Ambiguous URI parameter in template: #{uriTemplate}
Parameter not defined in API description document: #{uriParameter}\
""")

if ambiguous is false
unless ambiguous
toExpand = {}
for uriParameter in uriParameters
param = parameters[uriParameter]
if param.required is true
if not param.example
ambiguous = true
text = "\nAmbiguous URI parameter in template: #{uriTemplate} " + \
"\nNo example value for required parameter in API description document: " + \
"'" + uriParameter + "'"
result.warnings.push text
else
toExpand[uriParameter] = param.example

if param.example
toExpand[uriParameter] = param.example
else if param.default
toExpand[uriParameter] = param.default
else
if param.example
toExpand[uriParameter] = param.example
else if param.default
toExpand[uriParameter] = param.default
if param.required
ambiguous = true
result.warnings.push("""\
Ambiguous URI parameter in template: #{uriTemplate}
No example value for required parameter in API description \
document: #{uriParameter}\
""")

if param.required and param.default
result.warnings.push("""\
Required URI parameter '#{uriParameter}' has a default value.
Default value for a required parameter doesn't make sense from \
API description perspective. Use example value instead.\
""")

if ambiguous is false
result.uri = parsed.expand toExpand
unless ambiguous
result.uri = parsed.expand(toExpand)

return result

Expand Down
1 change: 0 additions & 1 deletion test/fixtures/swagger/uri-validation-annotation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ paths:
required: true
type: integer
format: int64
default: certainly-not-a-number
responses:
200:
description: pet response
Expand Down
60 changes: 45 additions & 15 deletions test/unit/expand-uri-template-with-parameters-test.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -203,56 +203,87 @@ describe 'expandUriTemplateWithParameters', ->
it 'should return URI', ->
assert.isNotNull data['uri']

describe 'when example and default value is given', ->
describe 'when default value is given', ->
before ->
uriTemplate = '/machines/{name}'
parameters =
name:
description: 'Machine name'
type: 'string'
required: true
example: 'example-one'
default: 'default-one'
example: ''
default: 'example-one'

data = expandUriTemplateWithParameters uriTemplate, parameters

it 'should return no error', ->
assert.equal data['errors'].length, 0

it 'should return no warning', ->
assert.equal data['warnings'].length, 0
it 'should return one warning', ->
assert.equal data['warnings'].length, 1

it 'should use example value to URI parameter expansion', ->
assert.include data['uri'], parameters['name']['example']
it 'should return warning about pointlessness of default value of a required parameter', ->
assert.include data.warnings[0], 'Default value for a required parameter'

it 'should use default value to URI parameter expansion', ->
assert.include data['uri'], parameters['name']['default']

it 'should return URI', ->
assert.isNotNull data['uri']

describe 'when expression parameter is optional', ->
describe 'when example and default values are given', ->
before ->
uriTemplate = '/machines/{name}'
parameters =
name:
description: 'Machine name'
type: 'string'
required: false
required: true
example: 'example-one'
default: ''
default: 'default-one'

data = expandUriTemplateWithParameters uriTemplate, parameters

it 'should return no error', ->
assert.equal data['errors'].length, 0

it 'should return no warning', ->
assert.equal data['warnings'].length, 0
it 'should return one warning', ->
assert.equal data['warnings'].length, 1

it 'should return warning about pointlessness of default value of a required parameter', ->
assert.include data.warnings[0], 'Default value for a required parameter'

it 'should use example value to URI parameter expansion', ->
assert.include data['uri'], parameters['name']['example']

it 'should return URI', ->
assert.isNotNull data['uri']

describe 'when expression parameter is optional', ->
before ->
uriTemplate = '/machines/{name}'
parameters =
name:
description: 'Machine name'
type: 'string'
required: false
example: 'example-one'
default: ''

data = expandUriTemplateWithParameters uriTemplate, parameters

it 'should return no error', ->
assert.equal data['errors'].length, 0

it 'should return no warning', ->
assert.equal data['warnings'].length, 0

it 'should use example value to URI parameter expansion', ->
assert.include data['uri'], parameters['name']['example']

it 'should return URI', ->
assert.isNotNull data['uri']

describe 'when default value is given and example is empty', ->
before ->
uriTemplate = '/machines/{name}'
Expand All @@ -278,7 +309,7 @@ describe 'expandUriTemplateWithParameters', ->
it 'should return URI', ->
assert.isNotNull data['uri']

describe 'when example and default value is given', ->
describe 'when example and default values are given', ->
before ->
uriTemplate = '/machines/{name}'
parameters =
Expand All @@ -303,8 +334,7 @@ describe 'expandUriTemplateWithParameters', ->
it 'should return some URI', ->
assert.isNotNull data['uri']


describe 'when example and default value is not given', ->
describe 'when example and default values are not given', ->
before ->
uriTemplate = '/machines/{name}'
parameters =
Expand Down

0 comments on commit c5a545c

Please sign in to comment.