aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/test_ops.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/tests/test_ops.py')
-rw-r--r--packages/meshbay-node/tests/test_ops.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/packages/meshbay-node/tests/test_ops.py b/packages/meshbay-node/tests/test_ops.py
index d2ccc0d..83758ae 100644
--- a/packages/meshbay-node/tests/test_ops.py
+++ b/packages/meshbay-node/tests/test_ops.py
@@ -9,6 +9,7 @@ appeared: the adapters must be thin, and the operations must not decide who may
call them.
"""
+import asyncio
import inspect
from pathlib import Path
@@ -221,3 +222,32 @@ async def test_reload_config_without_fn_is_refused(tmp_path):
state = _state(tmp_path)
with pytest.raises(ops.OpError, match="Reload not available"):
await ops.reload_config(state)
+
+
+async def test_start_reload_returns_before_reload_fn_finishes(tmp_path):
+ """The loopback route uses this one: a brand-new group's initial scan
+ can take minutes, and the Electron bridge caps every loopback call at
+ 30s (main.js node:call) — start_reload must not block on it."""
+ state = _state(tmp_path)
+ release = asyncio.Event()
+ called = []
+
+ async def slow_reload():
+ await release.wait()
+ called.append(True)
+ state["reload_fn"] = slow_reload
+
+ out = await asyncio.wait_for(ops.start_reload(state), timeout=1.0)
+
+ assert out["status"] == "reloading"
+ assert not called, "start_reload must return before reload_fn finishes"
+
+ release.set()
+ await asyncio.sleep(0) # let the still-running reload_fn task complete
+ assert called, "reload_fn must still actually run, just not be waited on"
+
+
+async def test_start_reload_without_fn_is_refused(tmp_path):
+ state = _state(tmp_path)
+ with pytest.raises(ops.OpError, match="Reload not available"):
+ await ops.start_reload(state)