Skip to content

Commit

Permalink
✅ [#4699] Validate postcode and houseNumber
Browse files Browse the repository at this point in the history
When the addressNL component is optional, the postcode and houseNumber fields should also be considered optional. But, if either postcode or houseNumber is provided, both fields become required
  • Loading branch information
robinmolen committed Jan 27, 2025
1 parent 2ad5650 commit f07b7c3
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 25 deletions.
16 changes: 14 additions & 2 deletions src/openforms/formio/components/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -468,11 +468,23 @@ def validate(self, attrs):

city = attrs.get("city", "")
street_name = attrs.get("streetName", "")
postcode = attrs.get("postcode", "")
number = attrs.get("houseNumber", "")

if postcode and not number:
raise serializers.ValidationError(
{"houseNumber": _('This field is required if "postcode" is provided')},
code="required",
)

if not postcode and number:
raise serializers.ValidationError(
{"postcode": _('This field is required if "house number" is provided')},
code="required",
)

if self.derive_address:
existing_hmac = attrs.get("secretStreetCity", "")
postcode = attrs.get("postcode", "")
number = attrs.get("houseNumber", "")

computed_hmac = salt_location_message(
{
Expand Down
77 changes: 54 additions & 23 deletions src/openforms/formio/tests/validation/test_addressnl.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,29 +106,6 @@ def test_addressNL_field_regex_pattern_success(self):

self.assertTrue(is_valid)

def test_missing_keys(self):
component: AddressNLComponent = {
"key": "addressNl",
"type": "addressNL",
"label": "AddressNL missing keys",
"deriveAddress": False,
}

invalid_values = {
"addressNl": {
"houseLetter": "A",
}
}

is_valid, errors = validate_formio_data(component, invalid_values)

postcode_error = extract_error(errors["addressNl"], "postcode")
house_number_error = extract_error(errors["addressNl"], "houseNumber")

self.assertFalse(is_valid)
self.assertEqual(postcode_error.code, "required")
self.assertEqual(house_number_error.code, "required")

def test_plugin_validator(self):
with replace_validators_registry() as register:
register("postcode_validator")(PostcodeValidator)
Expand Down Expand Up @@ -376,3 +353,57 @@ def test_addressNL_custom_postcode_and_city_validation_success(self):
is_valid, _ = validate_formio_data(component, data)

self.assertTrue(is_valid)

def test_addressNL_when_non_required_postcode_is_required_if_houseNumber_is_provided(
self,
):
component: AddressNLComponent = {
"key": "addressNl",
"type": "addressNL",
"label": "AddressNL",
"deriveAddress": False,
}

data = {
"addressNl": {
"postcode": "",
"houseNumber": "117",
"houseLetter": "",
"houseNumberAddition": "",
"city": "Amsterdam",
"streetName": "",
}
}

is_valid, errors = validate_formio_data(component, data)
postcode_error = extract_error(errors["addressNl"], "postcode")

self.assertFalse(is_valid)
self.assertEqual(postcode_error.code, "required")

def test_addressNL_when_non_required_houseNumber_is_required_if_postcode_is_provided(
self,
):
component: AddressNLComponent = {
"key": "addressNl",
"type": "addressNL",
"label": "AddressNL",
"deriveAddress": False,
}

data = {
"addressNl": {
"postcode": "1234 AB",
"houseNumber": "",
"houseLetter": "",
"houseNumberAddition": "",
"city": "Amsterdam",
"streetName": "",
}
}

is_valid, errors = validate_formio_data(component, data)
house_number_error = extract_error(errors["addressNl"], "houseNumber")

self.assertFalse(is_valid)
self.assertEqual(house_number_error.code, "required")

0 comments on commit f07b7c3

Please sign in to comment.