aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/tests
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/tests')
-rw-r--r--packages/meshbay-hub/tests/test_downloads.py8
-rw-r--r--packages/meshbay-hub/tests/test_hook_ordering.py1
-rw-r--r--packages/meshbay-hub/tests/test_transport_contracts.py26
3 files changed, 32 insertions, 3 deletions
diff --git a/packages/meshbay-hub/tests/test_downloads.py b/packages/meshbay-hub/tests/test_downloads.py
index 80c3b05..32d3e11 100644
--- a/packages/meshbay-hub/tests/test_downloads.py
+++ b/packages/meshbay-hub/tests/test_downloads.py
@@ -145,9 +145,11 @@ def test_a_length_is_only_promised_when_it_is_known(tmp_path):
src = SW.read_text()
assert "if (entry.size > 0)" in src
- # The zip-directory download is Files' own, moved to files-app.js in the
- # group-page refactor.
- app = (STATIC / "files-app.js").read_text()
+ # The zip-directory download started in files-app.js (group-page refactor)
+ # and was lifted into file-utils.js's downloadDirectory (docs/photos.md
+ # §3) so photos-app.js's own "zip this album" button calls the same
+ # implementation rather than a second one.
+ app = (STATIC / "file-utils.js").read_text()
zip_call = app[app.index("const target = await _openDownloadTarget(suggested"):]
zip_call = zip_call[:zip_call.index(");") + 2]
assert zip_call.rstrip().endswith(", 0);"), (
diff --git a/packages/meshbay-hub/tests/test_hook_ordering.py b/packages/meshbay-hub/tests/test_hook_ordering.py
index 48a9376..2114b45 100644
--- a/packages/meshbay-hub/tests/test_hook_ordering.py
+++ b/packages/meshbay-hub/tests/test_hook_ordering.py
@@ -35,6 +35,7 @@ APP = STATIC / "app.js"
STATIC_FILES = [
"app.js", "group-page.js", "chat-app.js", "files-app.js",
"video-player.js", "video-app.js", "music-app.js", "music-player.js",
+ "photos-app.js",
"group-settings.js",
]
diff --git a/packages/meshbay-hub/tests/test_transport_contracts.py b/packages/meshbay-hub/tests/test_transport_contracts.py
index 98ebd66..6c178a6 100644
--- a/packages/meshbay-hub/tests/test_transport_contracts.py
+++ b/packages/meshbay-hub/tests/test_transport_contracts.py
@@ -30,6 +30,7 @@ GROUP_PAGE = STATIC / "group-page.js"
SPLIT_FILES = [APP, GROUP_PAGE, CHAT_APP, STATIC / "files-app.js",
STATIC / "video-player.js", STATIC / "video-app.js",
STATIC / "music-app.js", STATIC / "music-player.js",
+ STATIC / "photos-app.js",
STATIC / "group-settings.js"]
pytestmark = pytest.mark.skipif(
@@ -119,6 +120,31 @@ def test_the_view_only_follows_new_messages_when_already_at_the_bottom(chat):
"scrolling unconditionally fights someone reading back through history")
+def test_every_authorize_admin_op_call_is_registered_in_admin_op_types(transport):
+ """
+ Found live (docs/photos.md's photo_roots): `setPhotoRoots` called
+ `_authorizeAdminOp(msg, 'photo_roots', ...)` like every other admin op,
+ but `photo_roots` was never added to `ADMIN_OP_TYPES` — so its initial
+ request was never keyed `admin:photo_roots`, the node's `admin_challenge`
+ reply matched no pending request (_dispatch's own keyed block, which
+ `return`s unconditionally whether or not it found a match), and the
+ request sat until its 30 s timeout with no error and no admin prompt.
+ `ADMIN_OP_TYPES`'s own comment already narrates this exact bug once,
+ for `audio_root`/`apps_enabled` — this pins it so a third op cannot
+ reintroduce it silently.
+ """
+ set_body = transport[transport.index("const ADMIN_OP_TYPES = new Set(["):]
+ set_body = set_body[:set_body.index("]);")]
+ registered = set(re.findall(r"'([a-z_]+)'", set_body))
+
+ called = set(re.findall(r"_authorizeAdminOp\(\s*\w+,\s*'([a-z_]+)'", transport))
+ assert called, "the extraction pattern itself found nothing — check it against transport.js"
+ missing = called - registered
+ assert not missing, (
+ f"{sorted(missing)} call _authorizeAdminOp but are missing from ADMIN_OP_TYPES — "
+ "their admin_challenge will silently time out instead of ever reaching the user")
+
+
def test_the_bottom_is_reached_by_scrollTop_not_a_sentinel(chat):
"""scrollIntoView on a zero-height marker stops short of the true bottom.