aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/tests/test_node_page_pairing.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-10-07 21:25:47 +0200
committerChristophe Besson <cbesson@gmail.com>2026-10-07 22:22:51 +0200
commite833fe1bfc8eb6f66cc5dc53997cc4158bab583f (patch)
tree6874dfd09cb210eaf61e4f5761d0bad23c9cd0a3 /packages/meshbay-hub/tests/test_node_page_pairing.py
parent92e25ffcc5edf5d1a9996bfb921b5a95b826134b (diff)
downloadmeshbay-e833fe1bfc8eb6f66cc5dc53997cc4158bab583f.tar.gz
fix: set the Windows node up at sign-in, and stop it for real
Found by the first Windows beta tester, then reproduced on a clean install. After a service-mode install nothing set the node up for the account that signed in: the boot task started a node that quit ("hub.username not set"), and the sidebar showed Node / Create group only once the hub held a node key. The only way to the wizard that provisions was the home page's welcome card, which an account already in a group never sees. The way out was `meshbay-node init` and the key pasted on the profile page -- which is also what PACKAGING-GUIDE.md told people to do. - main.js `node:ensure`, called by app.js at sign-in: provisions, starts and links the node this build ships (Windows, bundled node only). A node set up for another account, or an account linked to another node, is left alone. node:start waits for it, so the two never race. - The sidebar shows the Node section when a node exists on this machine. - The Node page's status is the node's: its control API and the process list, not the service task's state (a node started from a terminal ran while the page said Stopped). Stop says Stopped only once no meshbay-node.exe is left, and stays offered for a process that answers nothing. - CLI stop kills the pid that answered when a graceful stop does not finish, and fails with the reason when a node process is still there. - The daemon ends its process 3s after _shutdown(): Python's exit waited for a busy indexer thread, with the control API already closed. Armed by main() only, never by a daemon run inside a test. - node.toml is read as utf-8-sig (PowerShell 5.1 writes a BOM), and a config that cannot be read is logged instead of dying silently in service mode. - "Pair this browser" queues the code for the next group of this node to open instead of saying "Paired successfully"; no banner before a group. - test_e2e_windows_app.py (opt-in, MESHBAY_WIN_E2E=1) drives the installed app against a throwaway hub: fresh account to linked node, Stop, Start, Restart, checked against the real processes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-hub/tests/test_node_page_pairing.py')
-rw-r--r--packages/meshbay-hub/tests/test_node_page_pairing.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/packages/meshbay-hub/tests/test_node_page_pairing.py b/packages/meshbay-hub/tests/test_node_page_pairing.py
index 435488e..c716e0a 100644
--- a/packages/meshbay-hub/tests/test_node_page_pairing.py
+++ b/packages/meshbay-hub/tests/test_node_page_pairing.py
@@ -46,3 +46,23 @@ def test_the_banner_needs_an_explicit_false():
"the pairing banner must not show for a node that has not read its roster")
assert "useState(null)" in src.split("const [operatorPaired", 1)[1].split("\n", 1)[0]
assert "setOperatorPaired(!!" not in src
+
+
+def test_pair_this_browser_queues_the_code_instead_of_claiming_success():
+ """It stored the code where nothing read it, said "Paired successfully",
+ and the banner came back on the next refresh. The code is redeemed over
+ MNP by the next group of this node to open, as the wizard's is."""
+ src = _source()
+ pair = src.split("const doPairOperator = useCallback(", 1)[1].split("}, [refresh]);", 1)[0]
+ assert "session.pendingJoinCode = result.code;" in pair
+ assert "setOperatorPaired(true)" not in pair
+ assert "import { HUB, session } from './hub-client.js';" in src
+
+
+def test_no_pairing_banner_for_a_node_with_no_group_yet():
+ """A node set up at sign-in hosts nothing yet: there is nothing to pair
+ for until a group exists, and creating one pairs."""
+ src = _source()
+ banner = src.index('class="node-pair-banner"')
+ guard = src.rindex("${", 0, banner)
+ assert "nodeGroups.length > 0" in src[guard:banner]