From 647804417b15ea9328dc745767dd2f75a381b5be Mon Sep 17 00:00:00 2001 From: Lujeni Date: Mon, 12 Jan 2026 23:17:48 +0100 Subject: [PATCH] test(dev-server): support UI port see #748 --- temporalio/bridge/src/testing.rs | 2 ++ temporalio/bridge/testing.py | 1 + temporalio/testing/_workflow.py | 5 +++++ tests/testing/test_workflow.py | 10 ++++++++++ 4 files changed, 18 insertions(+) diff --git a/temporalio/bridge/src/testing.rs b/temporalio/bridge/src/testing.rs index e6f50afdd..33f2be74f 100644 --- a/temporalio/bridge/src/testing.rs +++ b/temporalio/bridge/src/testing.rs @@ -25,6 +25,7 @@ pub struct DevServerConfig { port: Option, database_filename: Option, ui: bool, + ui_port: Option, log_format: String, log_level: String, extra_args: Vec, @@ -133,6 +134,7 @@ impl From for ephemeral_server::TemporalDevServerConfig { .maybe_port(conf.port) .maybe_db_filename(conf.database_filename) .ui(conf.ui) + .maybe_ui_port(conf.ui_port) .log((conf.log_format, conf.log_level)) .extra_args(conf.extra_args) .build() diff --git a/temporalio/bridge/testing.py b/temporalio/bridge/testing.py index 9f0db3098..e428a33b2 100644 --- a/temporalio/bridge/testing.py +++ b/temporalio/bridge/testing.py @@ -27,6 +27,7 @@ class DevServerConfig: port: int | None database_filename: str | None ui: bool + ui_port: int | None log_format: str log_level: str extra_args: Sequence[str] diff --git a/temporalio/testing/_workflow.py b/temporalio/testing/_workflow.py index 62da91b6e..9966df76f 100644 --- a/temporalio/testing/_workflow.py +++ b/temporalio/testing/_workflow.py @@ -91,6 +91,7 @@ async def start_local( dev_server_download_version: str = "default", dev_server_extra_args: Sequence[str] = [], dev_server_download_ttl: timedelta | None = None, + ui_port: int | None = None, ) -> WorkflowEnvironment: """Start a full Temporal server locally, downloading if necessary. @@ -149,6 +150,7 @@ async def start_local( dev_server_extra_args: Extra arguments for the CLI binary. dev_server_download_ttl: TTL for the downloaded CLI binary. If unset, it will be cached indefinitely. + ui_port: UI port to use if UI is enabled. Returns: The started CLI dev server workflow environment. @@ -173,6 +175,7 @@ async def start_local( new_args.append(f"{attr.name}={attr._metadata_type}") new_args += dev_server_extra_args dev_server_extra_args = new_args + # Start CLI dev server runtime = runtime or temporalio.runtime.Runtime.default() download_ttl_ms = None @@ -191,12 +194,14 @@ async def start_local( port=port, database_filename=dev_server_database_filename, ui=ui, + ui_port=ui_port, log_format=dev_server_log_format, log_level=dev_server_log_level, extra_args=dev_server_extra_args, download_ttl_ms=download_ttl_ms, ), ) + # If we can't connect to the server, we should shut it down try: return _EphemeralServerWorkflowEnvironment( diff --git a/tests/testing/test_workflow.py b/tests/testing/test_workflow.py index b0082d1cd..d5f2aae5c 100644 --- a/tests/testing/test_workflow.py +++ b/tests/testing/test_workflow.py @@ -317,6 +317,16 @@ async def test_search_attributes_on_dev_server( assert attrs == desc.typed_search_attributes +async def test_ui_port(): + """Test that ui_port parameter works correctly.""" + async with await WorkflowEnvironment.start_local( + ui=True, + ui_port=18080, + ) as env: + # Just verify it starts without error + assert env.client is not None + + def assert_timestamp_from_now( ts: datetime | float, expected_from_now: float, max_delta: float = 30 ) -> None: