Skip to content

Commit

Permalink
Add try catch to prevent schema validation fails transform while pars…
Browse files Browse the repository at this point in the history
…ing (#2205)
  • Loading branch information
hawflau committed Nov 3, 2021
1 parent e9b740f commit 0bc383f
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 5 deletions.
13 changes: 8 additions & 5 deletions samtranslator/parser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,12 @@ def _validate(self, sam_template, parameter_values):
)
]
)
try:
validator = SamTemplateValidator()
validation_errors = validator.validate(sam_template)

validator = SamTemplateValidator()
validation_errors = validator.validate(sam_template)

if validation_errors:
LOG.warn("Template schema validation reported the following errors: " + ", ".join(validation_errors))
if validation_errors:
LOG.warn("Template schema validation reported the following errors: " + ", ".join(validation_errors))
except Exception as e:
# Catching any exception and not re-raising to make sure any validation process won't break transform
LOG.exception("Exception from SamTemplateValidator: %s", e)
Empty file added tests/parser/__init__.py
Empty file.
58 changes: 58 additions & 0 deletions tests/parser/test_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from unittest import TestCase
from mock import patch, Mock, call

from samtranslator.parser.parser import Parser
from samtranslator.plugins import LifeCycleEvents
from samtranslator.model.exceptions import InvalidDocumentException, InvalidTemplateException, InvalidResourceException


class TestParser(TestCase):
def test_parse(self):
parser = Parser()
parser._validate = Mock()
sam_plugins_mock = Mock()
sam_plugins_mock.act = Mock()
sam_template = {}
parameter_values = {}

parser.parse(sam_template, parameter_values, sam_plugins_mock)
parser._validate.assert_has_calls([call(sam_template, parameter_values)])
sam_plugins_mock.act.assert_has_calls([call(LifeCycleEvents.before_transform_template, sam_template)])

@patch("samtranslator.parser.parser.SamTemplateValidator")
@patch("samtranslator.parser.parser.LOG")
def test_validate_validator_failure(self, log_mock, sam_template_validator_class_mock):
exception = Exception()
sam_template_validator_class_mock.side_effect = exception
log_mock.exception = Mock()

sam_template = {
"Resources": {
"Function": {},
"Api": {},
}
}
paramerter_values = {"Param": "value"}
parser = Parser()
parser._validate(sam_template, paramerter_values)
log_mock.exception.assert_has_calls([call("Exception from SamTemplateValidator: %s", exception)])

def test_validate_parameter_values_is_required(self):
parser = Parser()
with self.assertRaises(ValueError):
parser._validate({}, None)

def test_validate_template_with_no_resource(self):
parser = Parser()
with self.assertRaises(InvalidDocumentException):
parser._validate({}, {})

def test_validate_template_with_non_dict_resources(self):
parser = Parser()
with self.assertRaises(InvalidDocumentException):
parser._validate({"Resources": "string"}, {})

def test_validate_template_with_empty_resources(self):
parser = Parser()
with self.assertRaises(InvalidDocumentException):
parser._validate({"Resources": {}}, {})

0 comments on commit 0bc383f

Please sign in to comment.