+++ title = "Validation Tests" weight = 300 +++ ### Validation Tests Sometimes we want the inputs to be configurable, but we also want to put constraints on those inputs or validate that the input is valid. Suppose for the `HitCounter` construct we want to allow the user to specify the `read_capacity` on the DynamoDB table, but we also want to ensure the value is within a reasonable range. We can write a test to make sure that the validation logic works: pass in invalid values and see what happens. First, add a `read_capacity` property to `HitCounter`: {{}} class HitCounter(Construct): @property def handler(self): return self._handler @property def table(self): return self._table def __init__(self, scope: Construct, id: str, downstream: _lambda.IFunction, read_capacity: int = 5, **kwargs): ... {{}} Then update the DynamoDB table resource to add the `read_capacity` property. {{}} self._table = ddb.Table( self, 'Hits', partition_key={'name': 'path', 'type': ddb.AttributeType.STRING}, encryption=ddb.TableEncryption.AWS_MANAGED, read_capacity=read_capacity, ) {{}} Now add a validation which will throw an error if the `read_capacity` is not in the allowed range. {{}} class HitCounter(Construct): @property def handler(self): return self._handler @property def table(self): return self._table def __init__(self, scope: Construct, id: str, downstream: _lambda.IFunction, read_capacity: int = 5, **kwargs): if read_capacity < 5 or read_capacity > 20: raise ValueError("readCapacity must be greater than 5 or less than 20") super().__init__(scope, id, **kwargs) ... {{}} Now lets add a test that validates the error is thrown. ```python def test_dynamodb_raises(): stack = Stack() with pytest.raises(Exception): HitCounter(stack, "HitCounter", downstream=_lambda.Function(stack, "TestFunction", runtime=_lambda.Runtime.PYTHON_3_7, handler='hello.handler', code=_lambda.Code.from_asset('lambda')), read_capacity=1, ) ``` Run the test. ```bash $ pytest ``` You should see an output like this: ```bash $ pytest ================================================================================================= test session starts ================================================================================================= platform linux -- Python 3.9.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 rootdir: ... collected 4 items tests/unit/test_cdk_workshop.py .... [100%] ================================================================================================== 4 passed in 1.59s ================================================================================================== ```