Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 14 additions & 12 deletions p3analysis/data/_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,34 @@
import jsonschema


def _validate_coverage_json(json_string: str) -> object:
def _validate_coverage_json(json_data: str | dict | list) -> object:
"""
Validate coverage JSON string against schema.
Validate coverage JSON against schema.

Parameters
----------
json_string : String
The JSON string to validate.
json_data : str | dict | list
The JSON string or object to validate.

Returns
-------
Object
A Python object corresponding to the JSON string.
A Python object corresponding to the JSON provided.

Raises
------
ValueError
If the JSON string fails to validate.
If the JSON fails to validate.

TypeError
If the JSON string is not a string.
If the JSON data is not a string, dict or list.
"""
if not isinstance(json_string, str):
raise TypeError("Coverage must be a JSON string.")

instance = json.loads(json_string)
if isinstance(json_data, str):
instance = json.loads(json_data)
elif isinstance(json_data, dict | list):
Comment thread
Pennycook marked this conversation as resolved.
instance = json_data
else:
raise TypeError("JSON data must be a string, dict, or list")

schema_string = pkgutil.get_data(__name__, "coverage.schema")
if not schema_string:
Expand All @@ -44,7 +46,7 @@ def _validate_coverage_json(json_string: str) -> object:
try:
jsonschema.validate(instance=instance, schema=schema)
except jsonschema.exceptions.ValidationError:
msg = "Coverage string failed schema validation"
msg = "Coverage data failed schema validation"
raise ValueError(msg)
except jsonschema.exceptions.SchemaError:
msg = "coverage.schema is not a valid schema"
Expand Down
18 changes: 15 additions & 3 deletions tests/data/test_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,33 @@ class TestValidation(unittest.TestCase):

def test_coverage_json_valid(self):
"""p3analysis.data.validation.coverage_json_valid"""
expected_object = [{"file": "path", "id": "sha", "used_lines": [1, 2, 3, 5], "unused_lines": []}]

json_string = '[{"file": "path", "id": "sha", "used_lines": [1, 2, 3, 5], "unused_lines": []}]'
result_object = _validate_coverage_json(json_string)
expected_object = [{"file": "path", "id": "sha", "used_lines": [1, 2, 3, 5], "unused_lines": []}]
self.assertTrue(result_object == expected_object)
self.assertEqual(result_object, expected_object)

json_object = expected_object
result_object = _validate_coverage_json(json_object)
self.assertEqual(result_object, expected_object)

def test_coverage_json_invalid(self):
"""p3analysis.data.validation.coverage_json_invalid"""
json_string = '[{"file": "path", "id": "sha", "used_lines": [["1"]], "unused_lines": []}]'
with self.assertRaises(ValueError):
_validate_coverage_json(json_string)

with self.assertRaises(TypeError):
with self.assertRaises(ValueError):
json_object = [{"file": "path", "id": "sha", "used_lines": [["1"]], "unused_lines": []}]
_validate_coverage_json(json_object)

# Check that we only accept strings, lists and dicts.
with self.assertRaises(TypeError):
_validate_coverage_json(3)

# Check that we rejects dicts based on schema rather than type.
with self.assertRaises(ValueError):
_validate_coverage_json({})

if __name__ == "__main__":
unittest.main()
Loading