1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
"""
The Node page's "No operator paired" banner.
A node publishes its roster only once it has signed in to the hub, and until
then it has no way to know who is paired. It used to answer `false` in that
window and the page took `!operator_paired` for "not paired" -- so a node stuck
waiting for its account told its operator to pair again, about a pairing that
was intact, and sent them after the wrong problem.
"""
import json
import re
import shutil
import subprocess
from pathlib import Path
import pytest
STATIC = Path(__file__).resolve().parents[1] / "src" / "meshbay_hub" / "static"
NODE_PAGE = STATIC / "node-page.js"
def _source() -> str:
return NODE_PAGE.read_text(encoding="utf-8")
@pytest.mark.skipif(shutil.which("node") is None, reason="node is not available")
def test_paired_is_unknown_unless_the_node_says_true_or_false(tmp_path):
m = re.search(r"^export function pairedFrom\(.*?^\}", _source(), re.M | re.S)
assert m, "node-page.js no longer has pairedFrom"
script = tmp_path / "case.js"
cases = [{"operator_paired": True}, {"operator_paired": False},
{"operator_paired": None}, {}, None, {"operator_paired": "yes"}]
script.write_text(m.group(0).replace("export ", "")
+ f"\nconsole.log(JSON.stringify({json.dumps(cases)}.map(pairedFrom)));",
encoding="utf-8")
out = subprocess.run(["node", str(script)], capture_output=True, encoding="utf-8", check=True)
assert json.loads(out.stdout) == [True, False, None, None, None, None]
def test_the_banner_needs_an_explicit_false():
src = _source()
banner = src.index('class="node-pair-banner"')
guard = src.rindex("${", 0, banner)
assert src[guard:banner].startswith("${operatorPaired === 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
|