Skip to content

Commit 63f17fc

Browse files
committed
fix: disable adding unevaluatedPropeties if activity alumina + tests
1 parent 30965ed commit 63f17fc

2 files changed

Lines changed: 55 additions & 10 deletions

File tree

bc_obps/reporting/service/report_validation/validators/report_activity_json_validation.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33
from typing import Any
44
import jsonschema
5+
from registration.models.activity import Activity
56
from reporting.models.report_version import ReportVersion
67
from reporting.models.source_type import SourceType
78
from reporting.service.report_validation.report_validation_error import (
@@ -18,7 +19,7 @@
1819
TAGS = [ValidationTags.REPORT_VALIDATION, ValidationTags.ON_SUBMIT]
1920

2021

21-
def enable_jsonschema_draft_2020_validation(schema: Any) -> None:
22+
def enable_jsonschema_draft_2020_validation(schema: Any, validateUnevaluatedProperties: bool = True) -> None:
2223
"""
2324
RJSF uses draft-07 and doesn't support the `unevaluatedProperties` keyword.
2425
This method replaces the `dependencies` keyword with `dependentSchemas` and adds
@@ -28,14 +29,16 @@ def enable_jsonschema_draft_2020_validation(schema: Any) -> None:
2829

2930
if isinstance(schema, list):
3031
for item in schema:
31-
enable_jsonschema_draft_2020_validation(item)
32+
enable_jsonschema_draft_2020_validation(item, validateUnevaluatedProperties)
3233

3334
if isinstance(schema, dict):
3435
for key in schema:
35-
enable_jsonschema_draft_2020_validation(schema[key])
36-
37-
if "properties" in schema and schema.get("type") == "object":
38-
schema["unevaluatedProperties"] = False
36+
enable_jsonschema_draft_2020_validation(schema[key], validateUnevaluatedProperties)
37+
# Schemas with complex schema dependencies recommended to not set this due to validation failure
38+
# https://rjsf-team.github.io/react-jsonschema-form/docs/advanced-customization/internals/#json-schema-supporting-status
39+
if validateUnevaluatedProperties:
40+
if "properties" in schema and schema.get("type") == "object":
41+
schema["unevaluatedProperties"] = False
3942

4043
if "dependencies" in schema:
4144
schema["dependentSchemas"] = schema.pop("dependencies")
@@ -52,6 +55,7 @@ def validate(report_version: ReportVersion) -> dict[str, ReportValidationError]:
5255
source_type_ids = list(
5356
SourceType.objects.filter(json_key__in=source_type_json_keys).values_list("id", flat=True)
5457
)
58+
alumina_activity = Activity.objects.get(slug='aluminum_production')
5559

5660
activity_schema = json.loads(
5761
FormBuilderService.build_form_schema(
@@ -61,8 +65,9 @@ def validate(report_version: ReportVersion) -> dict[str, ReportValidationError]:
6165
str(facility_report.facility_id),
6266
)
6367
)["schema"]
64-
65-
enable_jsonschema_draft_2020_validation(activity_schema)
68+
enable_jsonschema_draft_2020_validation(
69+
activity_schema, report_raw_activity.activity_id != alumina_activity.id
70+
)
6671

6772
validator = jsonschema.Draft202012Validator(activity_schema)
6873

bc_obps/reporting/tests/service/report_validation/validators/test_report_activity_json_validator.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from reporting.models.reporting_year import ReportingYear
77
from reporting.service.report_validation.report_validation_error import (
88
ReportValidationError,
9+
ReportValidationErrorKey,
910
Severity,
1011
)
1112
from reporting.service.report_validation.validators.report_activity_json_validation import (
@@ -56,7 +57,6 @@ def test_enable_jsonschema_draft_2020_validation(self):
5657
and "dependencies" not in schema["properties"]["test_prop"]
5758
)
5859

59-
@pytest.mark.skip("Validator disabled until fixes with jsonschema draft2020 can be addressed. (reporting/#941)")
6060
@patch("service.form_builder_service.FormBuilderService.build_form_schema")
6161
def test_validate_with_extra_field(self, mock_build_form_schema):
6262
mock_build_form_schema.return_value = json.dumps(
@@ -102,7 +102,7 @@ def test_validate_with_extra_field(self, mock_build_form_schema):
102102

103103
raw_activity_data = make_recipe(
104104
"reporting.tests.utils.report_raw_activity_data",
105-
report_version=1,
105+
report_version=raw_activity_data.facility_report.report_version,
106106
facility_report__facility__id="00000000-0000-0000-0000-000000000012",
107107
activity__slug="test-activity",
108108
json_data={
@@ -121,6 +121,7 @@ def test_validate_with_extra_field(self, mock_build_form_schema):
121121
"facility_00000000-0000-0000-0000-000000000012_test-activity": ReportValidationError(
122122
Severity.ERROR,
123123
"Validation error: Unevaluated properties are not allowed ('prop3' was unexpected) at: sourceTypes > testSourceType",
124+
ReportValidationErrorKey.ACTIVITY_JSON_SCHEMA_VALIDATION_ERROR,
124125
)
125126
}
126127

@@ -289,3 +290,42 @@ def test_validate_integration(self):
289290
errors = validate(raw_activity_data.facility_report.report_version)
290291

291292
assert errors == {}
293+
294+
def test_validate_with_flag_exludes_unevaluated_properties(self):
295+
schema = {
296+
"type": "object",
297+
"properties": {
298+
"name": {"type": "string"},
299+
"test_prop": {
300+
"type": "object",
301+
"properties": {
302+
"test_prop_1": {"type": "string"},
303+
"test_prop_2": {"type": "object", "properties": {"test_prop_3": {"type": "string"}}},
304+
},
305+
"dependencies": {
306+
"test_prop_1": {
307+
"properties": {
308+
"test_prop_2": {
309+
"type": "object",
310+
"properties": {"test_prop_3": {}},
311+
},
312+
}
313+
}
314+
},
315+
},
316+
},
317+
"dependencies": {"name": {"minLength": 3}},
318+
}
319+
320+
enable_jsonschema_draft_2020_validation(schema, False)
321+
322+
assert "unevaluatedProperties" not in schema
323+
assert "unevaluatedProperties" not in schema["properties"]["test_prop"]
324+
assert (
325+
"unevaluatedProperties"
326+
not in schema["properties"]["test_prop"]["properties"]["test_prop_2"]["properties"]["test_prop_3"]
327+
)
328+
assert (
329+
"unevaluatedProperties"
330+
not in schema["properties"]["test_prop"]["dependentSchemas"]["test_prop_1"]["properties"]["test_prop_2"]
331+
)

0 commit comments

Comments
 (0)