diff options
Diffstat (limited to 'packages/meshbay-hub/tests/test_indexing_dock.py')
| -rw-r--r-- | packages/meshbay-hub/tests/test_indexing_dock.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/packages/meshbay-hub/tests/test_indexing_dock.py b/packages/meshbay-hub/tests/test_indexing_dock.py index 1619b57..4510dfc 100644 --- a/packages/meshbay-hub/tests/test_indexing_dock.py +++ b/packages/meshbay-hub/tests/test_indexing_dock.py @@ -224,3 +224,61 @@ def test_the_dock_polls_the_node_wide_route_not_one_group(): source = DOCK.read_text(encoding="utf-8") assert "node.op('indexStatus')" in source assert "groupIndexStatus" not in source + + +# ── A disk that stops answering ───────────────────────────────────────────── + +@needs_node +def test_a_silent_disk_is_named_by_the_loopback_answer_only(tmp_path): + """A scan that sat still showed a bar that had stopped and a folder's name. + What it is waiting on is a path: the node's own machine, never a push.""" + paths = ["C:\\Music\\Some Album\\track 02.flac", "/srv/music/some album/track 02.flac", ""] + out = _run(tmp_path, f""" + const paths = {json.dumps(paths)}; + console.log(JSON.stringify({{ + local: m.fromLoopback({{ group_id: 'g', scanning: true, slow_path: paths[0], + slow_secs: 23 }}), + idle: m.fromLoopback({{ group_id: 'g', scanning: true }}), + push: m.fromPush('g', {{ scanning: true, slow_path: paths[0], slow_secs: 23 }}, []), + names: paths.map(m.baseName), + }})); + """) + assert (out["local"]["slowPath"], out["local"]["slowSecs"]) == (paths[0], 23) + assert (out["idle"]["slowPath"], out["idle"]["slowSecs"]) == ("", 0) + assert (out["push"]["slowPath"], out["push"]["slowSecs"]) == ("", 0), ( + "a member's connection must not be able to put a path on screen") + assert out["names"] == ["track 02.flac", "track 02.flac", ""], "either separator" + + +def test_the_row_says_what_the_disk_is_silent_on(): + dock = DOCK.read_text(encoding="utf-8") + row = dock[dock.index("function DockRow("):dock.index("export function IndexingDock(")] + assert ("t('indexdock.slow', { secs: number(row.slowSecs), " + "file: baseName(row.slowPath) })") in row + # Before the percentage: a bar that no longer moves is not the news. + assert row.index("else if (slow)") < row.index("else if (listing)") + assert "title=${slow ? row.slowPath : null}" in row, "the whole path, on hover" + + +def test_group_settings_list_what_the_node_could_not_read(): + """With paths, so asked of the loopback API and of nothing else: an operator + elsewhere sees the folder paused, as any member does.""" + settings = (STATIC / "group-settings.js").read_text(encoding="utf-8") + effect = settings[settings.index("if (!onNodeMachine) { setTrouble(null)"):] + effect = effect[:effect.index("}, [onNodeMachine, groupId, troubleTick]);")] + assert "platform.node.op('groupIndexStatus', { groupId })" in effect + assert "transport." not in effect + + note = settings[settings.index("const troubleNote ="):] + note = note[:note.index("if (!displayRoots.length)")] + assert "t('node.root_stalled_hint', { name, file })" in note + assert "t('node.unread_summary', { count: trouble.total })" in note + assert "u.reason === 'no_answer'" in note and "t('node.unread_no_answer')" in note + # Only for a folder that is still paused: resumed, the note has had its day. + assert "r.name === s.root && r.paused" in settings + assert "${troubleNote}" in settings[settings.index('<table class="shared-dirs-tbl">'):] + + css = (STATIC / "style.css").read_text(encoding="utf-8") + rule = css[css.index(".unread-files li {"):] + assert "word-break: break-word" in rule[:rule.index("}")], ( + "a path has no spaces to break at, and unpins the page on a phone") |