diff --git a/app/validators.py b/app/validators.py index 0248e7af92acf02c09b0b02409264e30b1a65107..575bc87e6e87f9a48881a9cf8f13c27fe1024593 100644 --- a/app/validators.py +++ b/app/validators.py @@ -80,6 +80,8 @@ class Unique(object): raise ValidationError(self.message) except sa.orm.exc.NoResultFound: pass + except sa.exc.DataError as e: + raise ValidationError(f"DBAPIError: {e.orig}") class UniqueAccrossModels: diff --git a/tests/functional/test_web.py b/tests/functional/test_web.py index 757e5e9ac1c56b1028621dc5d3bf890f2c1f5f51..820a66744fe412f53a6581501d97aceecc51c181 100644 --- a/tests/functional/test_web.py +++ b/tests/functional/test_web.py @@ -327,9 +327,11 @@ def test_create_host(client, domain_factory, network_factory, device_type): logout(client) # Success with user_prod user login(client, "user_prod", "userprod") - response = client.post(f"/network/hosts/create", data=form) - assert response.status_code == 302 + response = client.post(f"/network/hosts/create", data=form, follow_redirects=True) + assert response.status_code == 200 # The host was created + assert b"created!" in response.data + assert b"View host" in response.data host = models.Host.query.filter_by(name=name).first() assert host is not None assert host.interfaces[0].ip == ip @@ -337,6 +339,52 @@ def test_create_host(client, domain_factory, network_factory, device_type): assert host.interfaces[0].name == name +def test_create_host_invalid_fields( + session, client, domain_factory, network_factory, device_type +): + domain = domain_factory(name="prod.example.org") + network = network_factory( + address="192.168.1.0/24", + first_ip="192.168.1.10", + last_ip="192.168.1.250", + domain=domain, + ) + name = "myhost" + ip = "192.168.1.11" + mac = "02:42:42:45:3c:89" + form = { + "network_id": network.id, + "name": name, + "device_type_id": device_type.id, + "ip": ip, + "mac": mac, + "description": "test", + "ansible_vars": "", + "ansible_groups": [], + "tags": [], + "random_mac": False, + "cnames_string": "", + } + login(client, "user_prod", "userprod") + # Invalid mac + data = form.copy() + data["mac"] = "ea:ea:60:45:a8:96:se" + response = client.post(f"/network/hosts/create", data=data, follow_redirects=True) + assert response.status_code == 200 + assert b"Register new host" in response.data + assert b"Invalid MAC address" in response.data + # An exception was raised during validation (on Select in the Unique Validator), + # so we need to rollback. + session.rollback() + # Invalid hostname + data = form.copy() + data["name"] = "invalid_host" + response = client.post(f"/network/hosts/create", data=data, follow_redirects=True) + assert response.status_code == 200 + assert b"Register new host" in response.data + assert b"Invalid input" in response.data + + def test_create_interface( client, host_factory, domain_factory, network_factory, interface_factory ):