from django.core.exceptions import ValidationError
from django.test import TestCase

from .fields import AddressField


class TestRequiredFields(TestCase):
    def build_validation_data(self, fields=None, required=None):
        if fields is None:
            fields = []
        if required is None:
            required = []

        return {
            "COUNTRY": {
                "fields": [
                    {field: {"label": field}} for field in set(fields + required)
                ],
                "required": required,
            }
        }

    def test_non_required(self):
        field = AddressField()
        field.data = self.build_validation_data(fields=["postalcode"])
        field.clean({"country": "COUNTRY"})

    def test_non_required_blank_data(self):
        field = AddressField()
        field.data = self.build_validation_data(fields=["postalcode"])
        field.clean({"country": "COUNTRY", "postalcode": ""})

    def test_one_field_required(self):
        field = AddressField()
        field.data = self.build_validation_data(required=["postalcode"])
        with self.assertRaises(ValidationError):
            field.clean({"country": "COUNTRY"})

    def test_one_field_required_blank_data(self):
        field = AddressField()
        field.data = self.build_validation_data(required=["postalcode"])
        with self.assertRaises(ValidationError):
            field.clean({"country": "COUNTRY", "postalcode": ""})

    def test_one_field_required_supplied_data(self):
        field = AddressField()
        field.data = self.build_validation_data(required=["postalcode"])
        field.clean({"country": "COUNTRY", "postalcode": "BS1 2AB"})