import json import application import pytest from ows_accounting.validation import json_schema from ows_accounting.validation import json_validators def test_populate_validate_result_success( example_validation_schema, example_data_to_validate_success): """Test basic json schema functionality, success case. """ response = json_schema.populate_validate_result( example_data_to_validate_success, example_validation_schema) assert response.status == 200 def test_populate_validate_result_failure( example_validation_schema, example_data_to_validate_failure): """Test basic json schema functionality, failure case. """ response = json_schema.populate_validate_result( example_data_to_validate_failure, example_validation_schema) assert response.errors.get('message') == 'Invalid user data required' assert response.status == 400 def test_populate_validate_result_fail_required( example_validation_schema, example_data_to_validate_success): """Test basic json schema functionality, failure case.""" del (example_data_to_validate_success['apple']) response = json_schema.populate_validate_result( example_data_to_validate_success, example_validation_schema) assert response.errors.get('message') == '\'apple\' is a required property' assert response.status == 400 def test_get_report_success(valid_get_report_request): """Test valid GET report success. """ response = json_schema.populate_validate_result( data=valid_get_report_request, validator=json_validators.REPORT_GET_VALIDATOR) assert response.status == 200 def test_get_report_failure(invalid_get_report_request): """Test invalid GET report failure for parent schema. """ response = json_schema.populate_validate_result( data=invalid_get_report_request, validator=json_validators.REPORT_GET_VALIDATOR) assert response.errors.get('message') == \ 'Invalid number format pattern' assert response.status == 400 def test_get_report_regex_failure(invalid_get_report_trailing_spaces): """Test invalid GET report failure regex check. """ response = json_schema.populate_validate_result( data=invalid_get_report_trailing_spaces, validator=json_validators.REPORT_GET_VALIDATOR) assert response.errors.get('message') == \ 'Invalid accounting period pattern' assert response.status == 400 @pytest.mark.parametrize('report_version', [None, 1, 2]) def test_post_report_success(valid_get_report_request, report_version): """Test valid POST report. """ data = valid_get_report_request if report_version: data['report_version'] = report_version response = json_schema.populate_validate_result( data=data, validator=json_validators.REPORT_POST_VALIDATOR) assert response.status == 200 def test_post_report_user_data_failure(invalid_get_report_request_context): """Test invalid POST report failure for child schema. """ response = json_schema.populate_validate_result( data=invalid_get_report_request_context, validator=json_validators.REPORT_POST_VALIDATOR) # @todo: make the message more descriptive assert response.errors.get('message') == 'No match for request' assert response.status == 400 def test_get_transaction_types(invalid_get_report_trailing_spaces): """Test invalid GET report failure regex check. """ response = json_schema.populate_validate_result( data=invalid_get_report_trailing_spaces, validator=json_validators.TRANSACTION_TYPES_GET_VALIDATOR) assert response.errors.get('message') == \ 'Invalid accounting period pattern' assert response.status == 400 def test_get_transaction_types_too_many_params( invalid_get_transaction_types): """Test invalid GET report with extra params. """ response = json_schema.populate_validate_result( data=invalid_get_transaction_types, validator=json_validators.TRANSACTION_TYPES_GET_VALIDATOR) assert response.status == 400 def test_validate_request_query_string(mock_handler, test_header): """Test validation decorator for JSON Schema if Request is query string. """ with application.app.test_request_context( '?periods=200&account_id=1234&transaction_types=DT' '&file_type=txt&number_format=en_US&account_type=vendor', headers=test_header): actual = json_schema.validate_request( args_schema=json_validators.REPORT_GET_VALIDATOR)(mock_handler) assert actual() == 'Not decorated.' def test_validate_request_body( mock_handler, valid_get_report_request, test_header): """Test validation decorator for JSON Schema for data in Request. """ with application.app.test_request_context( '/report', method='post', data=json.dumps(valid_get_report_request), content_type='application/json', headers=test_header): actual = json_schema.validate_request( body_schema=json_validators.REPORT_POST_VALIDATOR)(mock_handler) assert actual() == 'Not decorated.'