Start allowing any three lines in addresses

This is part of moving away from `postcode` and towards `address line 7`

We think it will be easier for people to map their existing data to our
API if we let them fill in any 3 lines, instead of requiring at least
1, 2, and postcode specifically.
This commit is contained in:
Chris Hill-Scott
2020-04-03 14:28:36 +01:00
parent 264fbed04e
commit 7032bac178
4 changed files with 25 additions and 39 deletions

View File

@@ -27,29 +27,6 @@ personalisation = {
} }
letter_personalisation = dict(
personalisation,
properties={
"address_line_1": {
"type": "string",
"minLength": 1,
"validationMessage": "address_line_1 is required"
},
"address_line_2": {
"type": "string",
"minLength": 1,
"validationMessage": "address_line_2 is required"
},
"postcode": {
"type": "string",
"minLength": 1,
"validationMessage": "postcode is required"
},
},
required=["address_line_1", "address_line_2", "postcode"],
)
https_url = { https_url = {
"type": "string", "type": "string",
"format": "uri", "format": "uri",

View File

@@ -4,7 +4,7 @@ from app.models import (
NOTIFICATION_STATUS_LETTER_RECEIVED, NOTIFICATION_STATUS_LETTER_RECEIVED,
TEMPLATE_TYPES TEMPLATE_TYPES
) )
from app.schema_validation.definitions import (uuid, personalisation, letter_personalisation) from app.schema_validation.definitions import (uuid, personalisation)
template = { template = {
@@ -226,7 +226,7 @@ post_letter_request = {
"properties": { "properties": {
"reference": {"type": "string"}, "reference": {"type": "string"},
"template_id": uuid, "template_id": uuid,
"personalisation": letter_personalisation "personalisation": personalisation
}, },
"required": ["template_id", "personalisation"], "required": ["template_id", "personalisation"],
"additionalProperties": False "additionalProperties": False

View File

@@ -348,8 +348,22 @@ def process_letter_notification(*, letter_data, api_key, template, reply_to_text
template=template, template=template,
reply_to_text=reply_to_text) reply_to_text=reply_to_text)
if not PostalAddress.from_personalisation(letter_data['personalisation']).postcode: address = PostalAddress.from_personalisation(letter_data['personalisation'])
raise ValidationError(message='Must be a real UK postcode')
if not address.has_enough_lines:
raise ValidationError(
message=f'Address must be at least {PostalAddress.MIN_LINES} lines'
)
if address.has_too_many_lines:
raise ValidationError(
message=f'Address must be no more than {PostalAddress.MAX_LINES} lines'
)
if not address.postcode:
raise ValidationError(
message='Must be a real UK postcode'
)
test_key = api_key.key_type == KEY_TYPE_TEST test_key = api_key.key_type == KEY_TYPE_TEST

View File

@@ -270,9 +270,7 @@ def test_post_letter_notification_returns_400_for_empty_personalisation(
assert error_json['status_code'] == 400 assert error_json['status_code'] == 400
assert all([e['error'] == 'ValidationError' for e in error_json['errors']]) assert all([e['error'] == 'ValidationError' for e in error_json['errors']])
assert set([e['message'] for e in error_json['errors']]) == { assert set([e['message'] for e in error_json['errors']]) == {
'personalisation address_line_1 is required', 'Address must be at least 3 lines',
'personalisation address_line_2 is required',
'personalisation postcode is required'
} }
@@ -344,15 +342,12 @@ def test_notification_returns_400_if_address_doesnt_have_underscores(
error_json = letter_request(client, data, service_id=sample_letter_template.service_id, _expected_status=400) error_json = letter_request(client, data, service_id=sample_letter_template.service_id, _expected_status=400)
assert error_json['status_code'] == 400 assert error_json['status_code'] == 400
assert len(error_json['errors']) == 2 assert error_json['errors'] == [
assert { {
'error': 'ValidationError', 'error': 'ValidationError',
'message': 'personalisation address_line_1 is a required property' 'message': 'Address must be at least 3 lines'
} in error_json['errors'] }
assert { ]
'error': 'ValidationError',
'message': 'personalisation address_line_2 is a required property'
} in error_json['errors']
def test_returns_a_429_limit_exceeded_if_rate_limit_exceeded( def test_returns_a_429_limit_exceeded_if_rate_limit_exceeded(