Skip to content

Commit

Permalink
Test the output from validating file that causes all validation messages
Browse files Browse the repository at this point in the history
  • Loading branch information
Bjwebb committed Feb 25, 2019
1 parent dbb3cd4 commit b01c917
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 10 deletions.
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
-e git+https://github.com/OpenDataServices/[email protected]#egg=flattentool
-e git+https://github.com/OpenDataServices/lib-cove.git@e1a6132fecdc2000ed03d82da9c2cc4dae3bd442#egg=libcove
-e git+https://github.com/OpenDataServices/lib-cove.git@fe0ec370280e2986e6d47dff458a08313acceaef#egg=libcove
-e .
2 changes: 1 addition & 1 deletion requirements_dev.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
-e git+https://github.com/OpenDataServices/[email protected]#egg=flattentool
-e git+https://github.com/OpenDataServices/lib-cove.git@e1a6132fecdc2000ed03d82da9c2cc4dae3bd442#egg=libcove
-e git+https://github.com/OpenDataServices/lib-cove.git@fe0ec370280e2986e6d47dff458a08313acceaef#egg=libcove
-e .
pytest
flake8
73 changes: 65 additions & 8 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,42 @@
from libcovebods.api import bods_json_output


BADFILE_RESULTS = [
({'message': "'entityType' is missing but required. Check that the field is included and correctly spelled.", 'message_safe': '<code>entityType</code> is missing but required. Check that the field is included and correctly spelled.', 'message_type': 'required', 'path_no_number': ''}, [{'path': '21'}]),
({'message': "'exact' should be a number. Check that the value is not null, and doesn’t contain any characters other than 0-9 and dot ('.'). Number values should not be in quotes. ", 'message_safe': '<code>exact</code> should be a number. Check that the value is not null, and doesn’t contain any characters other than 0-9 and dot (<code>.</code>). Number values should not be in quotes. ', 'message_type': 'number', 'path_no_number': 'interests/share/exact'}, [{'path': '16/interests/0/share/exact', 'value': 'not a number'}]),
({'message': "'exclusiveMinimum' should be a JSON boolean, 'true' or 'false'.", 'message_safe': '<code>exclusiveMinimum</code> should be a JSON boolean, <code>true</code> or <code>false</code>.', 'message_type': 'boolean', 'path_no_number': 'interests/share/exclusiveMinimum'}, [{'path': '19/interests/0/share/exclusiveMinimum', 'value': 'not a bool'}]),
({'message': "'interestedParty' is missing but required. Check that the field is included and correctly spelled.", 'message_safe': '<code>interestedParty</code> is missing but required. Check that the field is included and correctly spelled.', 'message_type': 'required', 'path_no_number': ''}, [{'path': '16'}, {'path': '17'}, {'path': '18'}, {'path': '19'}, {'path': '20'}]),
({'message': "'interests' should be a JSON array. Check that value(s) appear within square brackets, [...]", 'message_safe': '<code>interests</code> should be a JSON array. Check that value(s) appear within square brackets, [...]', 'message_type': 'array', 'path_no_number': 'interests'}, [{'path': '17/interests'}]),
({'message': "'interests/0' should be a JSON object", 'message_safe': '<code>interests/0</code> should be a JSON object', 'message_type': 'object', 'path_no_number': 'interests'}, [{'path': '18/interests/0', 'value': 'not an object'}]),
({'message': "'missingPersonType' is a dependency of 'missingPersonReason'", 'message_safe': '&#39;missingPersonType&#39; is a dependency of &#39;missingPersonReason&#39;', 'message_type': 'dependencies', 'path_no_number': ''}, [{'path': '14'}]),
({'message': "'motivation' contains an unrecognised value. Check the related codelist for allowed code values.", 'message_safe': '<code>motivation</code> contains an unrecognised value. Check the related codelist for allowed code values.', 'message_type': 'enum', 'path_no_number': 'annotations/motivation'}, [{'path': '20/annotations/0/motivation', 'value': 'not on open list'}]),
({'message': "'not a date' does not match '^([\\\\+-]?\\\\d{4}(?!\\\\d{2}\\x08))((-?)((0[1-9]|1[0-2])(\\\\3([12]\\\\d|0[1-9]|3[01]))?|W([0-4]\\\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\\\d|[12]\\\\d{2}|3([0-5]\\\\d|6[1-6])))([T\\\\s]((([01]\\\\d|2[0-3])((:?)[0-5]\\\\d)?|24\\\\:?00)([\\\\.,]\\\\d+(?!:))?)?(\\\\17[0-5]\\\\d([\\\\.,]\\\\d+)?)?([zZ]|([\\\\+-])([01]\\\\d|2[0-3]):?([0-5]\\\\d)?)?)?)?$'", 'message_safe': '<code>birthDate</code> does not match the regex <code>^([\\+-]?\\d{4}(?!\\d{2}\x08))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24\\:?00)([\\.,]\\d+(?!:))?)?(\\17[0-5]\\d([\\.,]\\d+)?)?([zZ]|([\\+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$</code>', 'message_type': 'pattern', 'path_no_number': 'birthDate'}, [{'path': '12/birthDate', 'value': 'not a date'}]),
({'message': "'personType' contains an unrecognised value. Check the related codelist for allowed code values.", 'message_safe': '<code>personType</code> contains an unrecognised value. Check the related codelist for allowed code values.', 'message_type': 'enum', 'path_no_number': 'personType'}, [{'path': '11/personType', 'value': 'bad person type'}]),
({'message': "'replacesStatements' should be a JSON array. Check that value(s) appear within square brackets, [...]", 'message_safe': '<code>replacesStatements</code> should be a JSON array. Check that value(s) appear within square brackets, [...]', 'message_type': 'array', 'path_no_number': 'replacesStatements'}, [{'path': '9/replacesStatements', 'value': 'not an array'}]),
({'message': "'statementID' is missing but required. Check that the field is included and correctly spelled.", 'message_safe': '<code>statementID</code> is missing but required. Check that the field is included and correctly spelled.', 'message_type': 'required', 'path_no_number': ''}, [{'path': '2'}, {'path': '7'}, {'path': '8'}, {'path': '9'}, {'path': '10'}]),
({'message': "'statementID' should be a string. Check that the value is not null, and has quotes at the start and end. Escape any quotes in the value with '\\'", 'message_safe': '<code>statementID</code> should be a string. Check that the value is not null, and has quotes at the start and end. Escape any quotes in the value with <code>\\</code>', 'message_type': 'string', 'path_no_number': 'statementID'}, [{'path': '4/statementID', 'value': 100}]),
({'message': "'statementType' contains an unrecognised value. Check the related codelist for allowed code values.", 'message_safe': '<code>statementType</code> contains an unrecognised value. Check the related codelist for allowed code values.', 'message_type': 'enum', 'path_no_number': 'statementType'}, [{'path': '1/statementType', 'value': 'bad statement type'}, {'path': '3/statementType'}]),
({'message': "'statementType' is missing but required. Check that the field is included and correctly spelled.", 'message_safe': '<code>statementType</code> is missing but required. Check that the field is included and correctly spelled.', 'message_type': 'required', 'path_no_number': ''}, [{'path': '0'}]),
({'message': "'subject' is missing but required. Check that the field is included and correctly spelled.", 'message_safe': '<code>subject</code> is missing but required. Check that the field is included and correctly spelled.', 'message_type': 'required', 'path_no_number': ''}, [{'path': '16'}, {'path': '17'}, {'path': '18'}, {'path': '19'}, {'path': '20'}]),
({'message': "'too long long long long long long long long long long long long long long long long' is too long", 'message_safe': '<code>replacesStatements/0</code> is too long. It should not exceed 64 characters.', 'message_type': 'maxLength', 'path_no_number': 'replacesStatements'}, [{'path': '8/replacesStatements/0', 'value': 'too long long long long long long long long long long long long long long long long'}]),
({'message': "'tooshort' is too short", 'message_safe': '<code>replacesStatements/0</code> is too short. It should be at least 32 characters.', 'message_type': 'minLength', 'path_no_number': 'replacesStatements'}, [{'path': '7/replacesStatements/0', 'value': 'tooshort'}]),
({'message': "'tooshort' is too short", 'message_safe': '<code>statementID</code> is too short. It should be at least 32 characters.', 'message_type': 'minLength', 'path_no_number': 'statementID'}, [{'path': '5/statementID', 'value': 'tooshort'}]),
({'message': '-1 is less than the minimum of 0', 'message_safe': '<code>minimum</code> is too small. The minimum allowed value is 0.', 'message_type': 'minimum', 'path_no_number': 'interests/share/minimum'}, [{'path': '16/interests/0/share/minimum', 'value': -1}]),
({'message': '101 is greater than the maximum of 100', 'message_safe': '<code>maximum</code> is too large. The maximum allowed value is 100.', 'message_type': 'maximum', 'path_no_number': 'interests/share/maximum'}, [{'path': '16/interests/0/share/maximum', 'value': 101}]),
({'message': 'Date is not in the correct format. The correct format is YYYY-MM-DD.', 'message_safe': 'Date is not in the correct format. The correct format is YYYY-MM-DD.', 'message_type': 'date', 'path_no_number': 'statementDate'}, [{'path': '10/statementDate', 'value': 'not a date'}]),
({'message': 'Date is not in the correct format. The correct format is YYYY-MM-DDThh:mm:ssZ.', 'message_safe': 'Date is not in the correct format. The correct format is YYYY-MM-DDT00:00:00Z.', 'message_type': 'date-time', 'path_no_number': 'source/retrievedAt'}, [{'path': '13/source/retrievedAt', 'value': 'not a date-time'}]),
({'message': 'Invalid uri found', 'message_safe': 'Invalid uri found', 'message_type': 'uri', 'path_no_number': 'uri'}, [{'path': '21/uri', 'value': 'not a uri'}]),
({'message': "{'motivation': 'not on open list'} is not valid under any of the given schemas", 'message_safe': '{&#39;motivation&#39;: &#39;not on open list&#39;} is not valid under any of the given schemas', 'message_type': 'anyOf', 'path_no_number': 'annotations'}, [{'path': '20/annotations/0'}]),
({'message': '{} is not valid under any of the given schemas', 'message_safe': '{} is not valid under any of the given schemas', 'message_type': 'anyOf', 'path_no_number': 'identifiers'}, [{'path': '15/identifiers/0'}]),
]


def unpack_validation_error(validation_error_result):
validation_error, data = validation_error_result
validation_error_data = json.loads(validation_error)
return validation_error_data, data


def test_basic_1():

cove_temp_folder = tempfile.mkdtemp(prefix='lib-cove-bods-tests-', dir=tempfile.gettempdir())
Expand Down Expand Up @@ -153,11 +189,6 @@ def test_basic_statement_id_and_type_errors():
assert results['statistics']['count_ownership_or_control_statement_interested_party_with_person'] == 1
assert results['statistics']['count_ownership_or_control_statement_interested_party_with_entity'] == 0

def unpack_validation_error(validation_error_result):
validation_error, data = validation_error_result
validation_error_data = json.loads(validation_error)
return validation_error_data, data

validation_error_data, data = unpack_validation_error(results['validation_errors'][0])
assert "'shortID' is too short" in validation_error_data['message']
assert data[0]['path'] == '1/statementID'
Expand All @@ -168,12 +199,12 @@ def unpack_validation_error(validation_error_result):
assert data[0]['path'] == '0'
assert data[1]['path'] == '2'

validation_error_data, data = unpack_validation_error(results['validation_errors'][2])
validation_error_data, data = unpack_validation_error(results['validation_errors'][3])
assert "'statementType' is missing but required" in validation_error_data['message']
assert data[0]['path'] == '3'

validation_error_data, data = unpack_validation_error(results['validation_errors'][3])
assert "Invalid code found in 'statementType'" in validation_error_data['message']
validation_error_data, data = unpack_validation_error(results['validation_errors'][2])
assert "'statementType' contains an unrecognised value. Check the related codelist for allowed code values." in validation_error_data['message']
assert data[0]['path'] == '4/statementType'
assert data[0]['value'] == 'test'

Expand Down Expand Up @@ -374,3 +405,29 @@ def test_basic_bad_identifier_scheme():
assert results['additional_checks'][0]['type'] == 'entity_identifier_scheme_not_known'
assert results['additional_checks'][0]['scheme'] == 'GB-COH-THIS-SCHEME-IS-NOT-REAL-I-JUST-MADE-IT-UP-MWAHAHAHAHA'
assert results['additional_checks'][0]['entity_statement'] == '1dc0e987-5c57-4a1c-b3ad-61353b66a9b7'


def test_badfile_all_validation_errors():

cove_temp_folder = tempfile.mkdtemp(prefix='lib-cove-bods-tests-', dir=tempfile.gettempdir())
json_filename = os.path.join(os.path.dirname(
os.path.realpath(__file__)), 'fixtures', 'api', 'badfile_all_validation_errors.json'
)

results = bods_json_output(cove_temp_folder, json_filename)

assert results['validation_errors_count'] == 39
assert results['additional_fields_count'] == 1
assert results['additional_checks_count'] == 9
assert results['file_type'] == 'json'

for (i, (expected_error, expected_values)) in enumerate(BADFILE_RESULTS):
error, values = unpack_validation_error(results['validation_errors'][i])
assert error['message'] == expected_error['message']
assert error['message_safe'] == expected_error['message_safe']
assert error['message_type'] == expected_error['message_type']
assert error['path_no_number'] == expected_error['path_no_number']

for j, value in enumerate(expected_values):
assert value['path'] == expected_values[j]['path']

0 comments on commit b01c917

Please sign in to comment.