diff --git a/l4d2web/routes/server_routes.py b/l4d2web/routes/server_routes.py index da2745a..f284815 100644 --- a/l4d2web/routes/server_routes.py +++ b/l4d2web/routes/server_routes.py @@ -128,6 +128,8 @@ def update_server_form(server_id: int) -> Response: if server is None: return Response(status=404) server.name = name + if "hostname" in request.form: + server.hostname = request.form["hostname"] try: db.flush() except IntegrityError as exc: diff --git a/l4d2web/tests/test_servers.py b/l4d2web/tests/test_servers.py index 4b71166..aca053a 100644 --- a/l4d2web/tests/test_servers.py +++ b/l4d2web/tests/test_servers.py @@ -608,3 +608,110 @@ def test_reset_operation_enqueues_job_and_stops_desired_state(user_client_with_b ).all() assert len(jobs) == 1 assert jobs[0].state == "queued" + + +def test_create_server_hostname_defaults_empty(user_client_with_blueprints) -> None: + from sqlalchemy import select + from l4d2web.models import Server + + client, data = user_client_with_blueprints + response = client.post( + "/servers", + data={"name": "alpha", "port": "27015", "blueprint_id": str(data["blueprint_id"])}, + headers={"X-CSRF-Token": "test-token"}, + ) + assert response.status_code == 302 + + with session_scope() as session: + server = session.scalar(select(Server).where(Server.name == "alpha")) + assert server is not None + assert server.hostname == "" + + +def test_update_server_hostname_via_form(user_client_with_blueprints) -> None: + from sqlalchemy import select + from l4d2web.models import Server + + client, data = user_client_with_blueprints + create = client.post( + "/servers", + data={"name": "alpha", "port": "27015", "blueprint_id": str(data["blueprint_id"])}, + headers={"X-CSRF-Token": "test-token"}, + ) + server_id = create.headers["Location"].rsplit("/", 1)[1] + + update = client.post( + f"/servers/{server_id}", + data={"name": "alpha", "hostname": "My Cool Server"}, + headers={"X-CSRF-Token": "test-token"}, + ) + assert update.status_code == 302 + + with session_scope() as session: + server = session.scalar(select(Server).where(Server.name == "alpha")) + assert server is not None + assert server.hostname == "My Cool Server" + + +def test_rename_preserves_hostname(user_client_with_blueprints) -> None: + from sqlalchemy import select + from l4d2web.models import Server + + client, data = user_client_with_blueprints + create = client.post( + "/servers", + data={"name": "alpha", "port": "27015", "blueprint_id": str(data["blueprint_id"])}, + headers={"X-CSRF-Token": "test-token"}, + ) + server_id = create.headers["Location"].rsplit("/", 1)[1] + + # Set hostname first + client.post( + f"/servers/{server_id}", + data={"name": "alpha", "hostname": "My Cool Server"}, + headers={"X-CSRF-Token": "test-token"}, + ) + + # Rename without sending hostname (simulates rename modal) + client.post( + f"/servers/{server_id}", + data={"name": "beta"}, + headers={"X-CSRF-Token": "test-token"}, + ) + + with session_scope() as session: + server = session.scalar(select(Server).where(Server.name == "beta")) + assert server is not None + assert server.hostname == "My Cool Server", "rename must not wipe hostname" + + +def test_update_server_clears_hostname(user_client_with_blueprints) -> None: + from sqlalchemy import select + from l4d2web.models import Server + + client, data = user_client_with_blueprints + create = client.post( + "/servers", + data={"name": "alpha", "port": "27015", "blueprint_id": str(data["blueprint_id"])}, + headers={"X-CSRF-Token": "test-token"}, + ) + server_id = create.headers["Location"].rsplit("/", 1)[1] + + # Set hostname first + client.post( + f"/servers/{server_id}", + data={"name": "alpha", "hostname": "My Cool Server"}, + headers={"X-CSRF-Token": "test-token"}, + ) + + # Clear it + client.post( + f"/servers/{server_id}", + data={"name": "alpha", "hostname": ""}, + headers={"X-CSRF-Token": "test-token"}, + ) + + with session_scope() as session: + server = session.scalar(select(Server).where(Server.name == "alpha")) + assert server is not None + assert server.hostname == ""