text: from django.test import TestCase
  from django.forms import ValidationError, Form
  from address.forms import AddressField, AddressWidget
  
  
  class TestForm(Form):
      address = AddressField()
  
  
  class AddressFieldTestCase(TestCase):
      def setUp(self):
          self.form = TestForm()
          self.field = self.form.base_fields["address"]
          self.missing_state = {
              "country": "UK",
              "locality": "Somewhere",
              "postal_code": "34904",
              "route": "A street?",
              "street_number": "3",
              "raw": "3 A street?, Somewhere, UK",
          }
  
      def test_to_python_none(self):
          self.assertEqual(self.field.to_python(None), None)
  
      def test_to_python_empty(self):
          self.assertEqual(self.field.to_python(""), None)
  
      def test_to_python_invalid_lat_lng(self):
          self.assertRaises(ValidationError, self.field.to_python, {"latitude": "x"})
          self.assertRaises(ValidationError, self.field.to_python, {"longitude": "x"})
  
      def test_to_python_invalid_empty_lat_lng(self):
          self.assertEqual(self.field.to_python({"latitude": ""}), None)
          self.assertEqual(self.field.to_python({"longitude": ""}), None)
  
      def test_to_python_no_locality(self):
          input = {
              "country": "United States",
              "country_code": "US",
              "state": "New York",
              "state_code": "NY",
              "locality": "",
              "sublocality": "Brooklyn",
              "postal_code": "11201",
              "route": "Joralemon St",
              "street_number": "209",
              "raw": "209 Joralemon Street, Brooklyn, NY, United States",
          }
          res = self.field.to_python(input)
          self.assertEqual(res.locality.name, "Brooklyn")
  
      def test_to_python_postal_town(self):
          """UK addresses with no `locality`, but a populated `postal_town`, should use the
          `postal_town` as the `locality`"""
          data = {
              "raw": "High Street, Leamington Spa",
              "route": "High Street",
              "postal_town": "Leamington Spa",
              "state": "England",
              "state_code": "England",
              "country": "United Kingdom",
              "country_code": "GB",
              "postal_code": "CV31",
              "formatted": "High St, Royal Leamington Spa, Leamington Spa CV31, UK",
          }
          address = self.field.to_python(data)
          self.assertIsNotNone(address.locality)
          self.assertEqual(address.locality.name, data["postal_town"])
  
      # TODO: Fix
      # def test_to_python_empty_state(self):
      #     val = self.field.to_python(self.missing_state)
      #     self.assertTrue(isinstance(val, Address))
      #     self.assertNotEqual(val.locality, None)
  
      def test_to_python(self):
          res = self.field.to_python({"raw": "Someplace"})
          self.assertEqual(res.raw, "Someplace")
  
      def test_render(self):
          # TODO: Check return value.
          self.form.as_table()
  
  
  class AddressWidgetTestCase(TestCase):
      def test_attributes_set_correctly(self):
          wid = AddressWidget(attrs={"size": "150"})
          self.assertEqual(wid.attrs["size"], "150")
          html = wid.render("test", None)
          self.assertNotEqual(html.find('size="150"'), -1)
  