"""Tests for Validation.""" import copy from jsonschema import Draft3Validator from sales_goals.constants import error from sales_goals.constants import header from sales_goals.validation import validation def test_add_error_to_errors(): """Test creating a standard validation errors object.""" initial_errors_object = {} mutated_object = validation.add_error_to_errors( initial_errors_object, 'square', '4_sided', True, 'Shape does not have 4 sides.') assert mutated_object == initial_errors_object == { 'square': { 'validator': '4_sided', 'validator_value': True, 'message': 'Shape does not have 4 sides.'}} def test_validate_post_header_success( valid_post_header, post_header_validation_schema): """Test general use case valid POST header success.""" response = validation.validate( data=valid_post_header, validator=Draft3Validator(post_header_validation_schema)) assert response.status == 200 def test_validate_post_header_fail_pattern( valid_post_header, post_header_validation_schema): """Test general use case invalid POST header fail because pattern.""" mutated_header = copy.copy(valid_post_header) mutated_header[header.CONTENT_TYPE] = 'application/farts' mutated_header[header.GRASS_ACCOUNT_TYPE] = 'banana' mutated_header[header.GRASS_ACCOUNT_ID] = 'pizza' response = validation.validate( data=mutated_header, validator=Draft3Validator(post_header_validation_schema)) message = response.errors.get('message') assert response.status == 400 assert 'pattern' in message.get( header.CONTENT_TYPE).get('validator') assert 'pattern' in message.get( header.GRASS_ACCOUNT_TYPE).get('validator') assert 'pattern' in message.get( header.GRASS_ACCOUNT_ID).get('validator') def test_validate_post_header_fail_type( valid_post_header, post_header_validation_schema): """Test general use case invalid POST header fail because type.""" mutated_header = copy.copy(valid_post_header) mutated_header[header.CONTENT_TYPE] = 1234 mutated_header[header.GRASS_ACCOUNT_TYPE] = 555 mutated_header[header.CORRELATION_ID] = 444 response = validation.validate( data=mutated_header, validator=Draft3Validator(post_header_validation_schema)) message = response.errors.get('message') assert response.status == 400 assert 'type' in message.get( header.CONTENT_TYPE).get('validator') assert 'type' in message.get( header.GRASS_ACCOUNT_TYPE).get('validator') assert 'type' in message.get( header.CORRELATION_ID).get('validator') def test_validate_get_header_success( valid_get_header, get_header_validation_schema): """Test general use case valid GET header success.""" response = validation.validate( data=valid_get_header, validator=Draft3Validator(get_header_validation_schema)) assert response.status == 200 def test_validate_get_header_fail_pattern( valid_get_header, get_header_validation_schema): """Test general use case invalid GET header fail because pattern.""" mutated_header = copy.copy(valid_get_header) mutated_header[header.GRASS_ACCOUNT_TYPE] = 'banana' mutated_header[header.GRASS_ACCOUNT_ID] = 'pizza' response = validation.validate( data=mutated_header, validator=Draft3Validator(get_header_validation_schema)) message = response.errors.get('message') assert response.status == 400 assert 'pattern' in message.get( header.GRASS_ACCOUNT_TYPE).get('validator') assert 'pattern' in message.get( header.GRASS_ACCOUNT_ID).get('validator') def test_validate_get_header_fail_type( valid_get_header, get_header_validation_schema): """Test general use case invalid GET header fail because type.""" mutated_header = copy.copy(valid_get_header) mutated_header[header.CONTENT_TYPE] = 1234 mutated_header[header.GRASS_ACCOUNT_TYPE] = 555 mutated_header[header.CORRELATION_ID] = 444 response = validation.validate( data=mutated_header, validator=Draft3Validator(get_header_validation_schema)) message = response.errors.get('message') assert response.status == 400 assert 'type' in message.get( header.GRASS_ACCOUNT_TYPE).get('validator') assert 'type' in message.get( header.CORRELATION_ID).get('validator') def test_validation_success( monkeypatch, example_data_to_validate, example_validation_schema): """Test example validation is successful using a validator.""" response = validation.validate( data=example_data_to_validate, validator=Draft3Validator(example_validation_schema)) assert response.status == 200 def test_validation_error( monkeypatch, example_data_to_validate, example_validation_schema): """Test example validation fails using our validator. It should return error messages in our desired format. """ mutated_data = copy.copy(example_data_to_validate) mutated_data.pop('apple') mutated_data['orange'] = 333333 mutated_data['banana'] = '12345678901' mutated_data['mango'] = 3333333 mutated_data['pizza'] = 'party' response = validation.validate( data=mutated_data, validator=Draft3Validator(example_validation_schema)) message = response.errors.get('message') assert response.status == 400 assert response.errors.get('code') == error.VALIDATION_ERROR assert 'required' == message.get('apple').get('validator') assert 'type' == message.get('orange').get('validator') assert 'maxLength' in message.get('banana').get('validator') assert 'pizza' in message.get('additionalProperties').get('message') def test_validation_error_if_negative_integer_passed( monkeypatch, example_data_to_validate, example_validation_schema): """Test example validation fails if integer passed less than minimum.""" mutated_data = copy.copy(example_data_to_validate) mutated_data['apple'] = -20 response = validation.validate( data=mutated_data, validator=Draft3Validator(example_validation_schema)) message = response.errors.get('message') assert response.status == 400 assert response.errors.get('code') == error.VALIDATION_ERROR assert 'minimum' == message.get('apple').get('validator') def test_validate_delete_header_success( valid_delete_header, delete_header_validation_schema): """Test general use case valid DELETE header success.""" response = validation.validate( data=valid_delete_header, validator=Draft3Validator(delete_header_validation_schema)) assert response.status == 200 def test_validate_delete_goals_header_success( valid_delete_header, delete_header_validation_schema): """Test general use case valid goals DELETE header success.""" response = validation.validate( data=valid_delete_header, validator=Draft3Validator(delete_header_validation_schema)) assert response.status == 200