diff --git a/samtranslator/model/api/api_generator.py b/samtranslator/model/api/api_generator.py index fba368f8a4..04cf78e749 100644 --- a/samtranslator/model/api/api_generator.py +++ b/samtranslator/model/api/api_generator.py @@ -18,7 +18,7 @@ ApiGatewayApiKey, ) from samtranslator.model.route53 import Route53RecordSetGroup -from samtranslator.model.exceptions import InvalidResourceException, InvalidTemplateException +from samtranslator.model.exceptions import InvalidResourceException, InvalidTemplateException, InvalidDocumentException from samtranslator.model.s3_utils.uri_parser import parse_s3_uri from samtranslator.region_configuration import RegionConfiguration from samtranslator.swagger.swagger import SwaggerEditor @@ -980,6 +980,15 @@ def _openapi_postprocess(self, definition_body): # add schema for the headers in options section for openapi3 if field in ["responses"]: options_path = definition_body["paths"][path]["options"] + if options_path and not isinstance(options_path.get(field), dict): + raise InvalidDocumentException( + [ + InvalidTemplateException( + "Value of responses in options method for path {} must be a " + "dictionary according to Swagger spec.".format(path) + ) + ] + ) if ( options_path and options_path.get(field).get("200") diff --git a/tests/translator/input/error_api_invalid_openapi_path.yaml b/tests/translator/input/error_api_invalid_openapi_path.yaml new file mode 100644 index 0000000000..db21fc2c20 --- /dev/null +++ b/tests/translator/input/error_api_invalid_openapi_path.yaml @@ -0,0 +1,13 @@ +Resources: + ApiWithInvalidPath: + Type: AWS::Serverless::Api + Properties: + StageName: Prod + Cors: "'*'" + OpenApiVersion: 3.0.1 + DefinitionBody: + openapi: 3.0.1 + info: + title: test invalid paths Api + paths: + /foo: \ No newline at end of file diff --git a/tests/translator/input/error_api_invalid_openapi_path_with_empty_responses.yaml b/tests/translator/input/error_api_invalid_openapi_path_with_empty_responses.yaml new file mode 100644 index 0000000000..b2a2e52368 --- /dev/null +++ b/tests/translator/input/error_api_invalid_openapi_path_with_empty_responses.yaml @@ -0,0 +1,15 @@ +Resources: + ApiWithInvalidPath: + Type: AWS::Serverless::Api + Properties: + StageName: Prod + Cors: "'*'" + OpenApiVersion: 3.0.1 + DefinitionBody: + openapi: 3.0.1 + info: + title: test invalid paths Api + paths: + /foo: + options: + responses: \ No newline at end of file diff --git a/tests/translator/input/error_api_invalid_openapi_path_with_string_responses.yaml b/tests/translator/input/error_api_invalid_openapi_path_with_string_responses.yaml new file mode 100644 index 0000000000..596839e458 --- /dev/null +++ b/tests/translator/input/error_api_invalid_openapi_path_with_string_responses.yaml @@ -0,0 +1,15 @@ +Resources: + ApiWithInvalidPath: + Type: AWS::Serverless::Api + Properties: + StageName: Prod + Cors: "'*'" + OpenApiVersion: 3.0.1 + DefinitionBody: + openapi: 3.0.1 + info: + title: test invalid paths Api + paths: + /foo: + options: + responses: invalid \ No newline at end of file diff --git a/tests/translator/output/error_api_invalid_openapi_path.json b/tests/translator/output/error_api_invalid_openapi_path.json new file mode 100644 index 0000000000..2aedc06844 --- /dev/null +++ b/tests/translator/output/error_api_invalid_openapi_path.json @@ -0,0 +1,3 @@ +{ + "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Structure of the SAM template is invalid. Value of '/foo' path must be a dictionary according to Swagger spec." +} \ No newline at end of file diff --git a/tests/translator/output/error_api_invalid_openapi_path_with_empty_responses.json b/tests/translator/output/error_api_invalid_openapi_path_with_empty_responses.json new file mode 100644 index 0000000000..73a7f49ac3 --- /dev/null +++ b/tests/translator/output/error_api_invalid_openapi_path_with_empty_responses.json @@ -0,0 +1,3 @@ +{ + "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Structure of the SAM template is invalid. Value of responses in options method for path /foo must be a dictionary according to Swagger spec." +} \ No newline at end of file diff --git a/tests/translator/output/error_api_invalid_openapi_path_with_string_responses.json b/tests/translator/output/error_api_invalid_openapi_path_with_string_responses.json new file mode 100644 index 0000000000..73a7f49ac3 --- /dev/null +++ b/tests/translator/output/error_api_invalid_openapi_path_with_string_responses.json @@ -0,0 +1,3 @@ +{ + "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Structure of the SAM template is invalid. Value of responses in options method for path /foo must be a dictionary according to Swagger spec." +} \ No newline at end of file