Repository: cisagov/manage.get.gov

Issue:
Alternative domain as a space results in 500 error
### Current Behavior

On a domain request, adding an alternative domain that is an empty space " " or a series of empty spaces "    " results in a 500 error when clicking save

### Expected Behavior

The user should be able to save and the fields should auto-clear themselves

### Steps to Reproduce

1.start a request and enter a valid domain name 
2. in the alternate domain name section add an alternative that is a space (" ")
3. click save
4. see 500 error


### Environment

_No response_

### Additional Context

[slack thread](https://cisa-corp.slack.com/archives/C066ZBWFLRW/p1708554213930319)

### Issue Links

_No response_


Discussion:

Resolving patch:
diff --git a/src/registrar/models/domain.py b/src/registrar/models/domain.py
--- a/src/registrar/models/domain.py
+++ b/src/registrar/models/domain.py
@@ -13,6 +13,7 @@
 from registrar.models.host import Host
 from registrar.models.host_ip import HostIP
 from registrar.utility.enums import DefaultEmail
+from registrar.utility import errors
 
 from registrar.utility.errors import (
     ActionNotAllowed,
@@ -192,9 +193,17 @@ def __delete__(self, obj):
 
     @classmethod
     def available(cls, domain: str) -> bool:
-        """Check if a domain is available."""
+        """Check if a domain is available.
+        This is called by the availablility api and
+        is called in the validate function on the request/domain page
+
+        throws- RegistryError or InvalidDomainError"""
         if not cls.string_could_be_domain(domain):
-            raise ValueError("Not a valid domain: %s" % str(domain))
+            logger.warning("Not a valid domain: %s" % str(domain))
+            # throw invalid domain error so that it can be caught in
+            # validate_and_handle_errors in domain_helper
+            raise errors.InvalidDomainError()
+
         domain_name = domain.lower()
         req = commands.CheckDomain([domain_name])
         return registry.send(req, cleaned=True).res_data[0].avail
diff --git a/src/registrar/models/utility/domain_helper.py b/src/registrar/models/utility/domain_helper.py
--- a/src/registrar/models/utility/domain_helper.py
+++ b/src/registrar/models/utility/domain_helper.py
@@ -33,11 +33,12 @@ def validate(cls, domain: str, blank_ok=False) -> str:
         # Split into pieces for the linter
         domain = cls._validate_domain_string(domain, blank_ok)
 
-        try:
-            if not check_domain_available(domain):
-                raise errors.DomainUnavailableError()
-        except RegistryError as err:
-            raise errors.RegistrySystemError() from err
+        if domain != "":
+            try:
+                if not check_domain_available(domain):
+                    raise errors.DomainUnavailableError()
+            except RegistryError as err:
+                raise errors.RegistrySystemError() from err
         return domain
 
     @staticmethod


Test patch:
diff --git a/src/registrar/tests/test_models_domain.py b/src/registrar/tests/test_models_domain.py
--- a/src/registrar/tests/test_models_domain.py
+++ b/src/registrar/tests/test_models_domain.py
@@ -20,7 +20,7 @@
 from registrar.utility.errors import ActionNotAllowed, NameserverError
 
 from registrar.models.utility.contact_error import ContactError, ContactErrorCodes
-
+from registrar.utility import errors
 
 from django_fsm import TransitionNotAllowed  # type: ignore
 from epplibwrapper import (
@@ -502,16 +502,26 @@ def side_effect(_request, cleaned):
         self.assertFalse(available)
         patcher.stop()
 
-    def test_domain_available_with_value_error(self):
+    def test_domain_available_with_invalid_error(self):
         """
         Scenario: Testing whether an invalid domain is available
-            Should throw ValueError
+            Should throw InvalidDomainError
 
-            Validate ValueError is raised
+            Validate InvalidDomainError is raised
         """
-        with self.assertRaises(ValueError):
+        with self.assertRaises(errors.InvalidDomainError):
             Domain.available("invalid-string")
 
+    def test_domain_available_with_empty_string(self):
+        """
+        Scenario: Testing whether an empty string domain name is available
+            Should throw InvalidDomainError
+
+            Validate InvalidDomainError is raised
+        """
+        with self.assertRaises(errors.InvalidDomainError):
+            Domain.available("")
+
     def test_domain_available_unsuccessful(self):
         """
         Scenario: Testing behavior when registry raises a RegistryError