aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/tests/test_video_series_stays_open.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-09-28 11:09:12 +0200
committerChristophe Besson <cbesson@gmail.com>2026-09-28 11:09:12 +0200
commit694a3832f4b57d007b79b3b21dd47b55e6ef3c42 (patch)
tree3213225f5a26ce0014735536b9ff575f2f87e96f /packages/meshbay-hub/tests/test_video_series_stays_open.py
parent19c1e280cbbfc83f0c2cbadadc8e0fb692d8dd70 (diff)
downloadmeshbay-694a3832f4b57d007b79b3b21dd47b55e6ef3c42.tar.gz
feat(hub): keep a show's detail modal open under the player
Closing the player lands back on the season being watched, with the episode just started marked. A film's modal still closes on Play. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-hub/tests/test_video_series_stays_open.py')
-rw-r--r--packages/meshbay-hub/tests/test_video_series_stays_open.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/packages/meshbay-hub/tests/test_video_series_stays_open.py b/packages/meshbay-hub/tests/test_video_series_stays_open.py
new file mode 100644
index 0000000..e0fe3f0
--- /dev/null
+++ b/packages/meshbay-hub/tests/test_video_series_stays_open.py
@@ -0,0 +1,74 @@
+"""
+A show's detail modal stays open under the player.
+
+Playing an episode closed the modal, so watching the next one meant finding the
+show's card again, opening it, and picking the season again — every episode.
+The modal now stays where it was, on the same season, with the episode just
+started marked, and the player is drawn over it.
+
+Measured rather than read: whether the reader lands back on the modal depends on
+`PosterGrid`, on `GroupPage` mounting the player beside it, and on which of two
+`.video-overlay`s the stylesheet puts on top. The probe renders the shipped
+`GroupPage` against a stub node and walks it.
+"""
+import json
+import shutil
+import subprocess
+from pathlib import Path
+
+import pytest
+
+HARNESS = Path(__file__).parent / "harness" / "video_series_probe.py"
+STATIC = Path(__file__).resolve().parents[1] / "src" / "meshbay_hub" / "static"
+
+pytestmark = pytest.mark.skipif(
+ shutil.which("google-chrome") is None or not (STATIC / "video-app.js").exists(),
+ reason="Chrome or the SPA sources are not available")
+
+
+@pytest.fixture(scope="module")
+def walk():
+ run = subprocess.run(["python3", str(HARNESS)], capture_output=True, timeout=150)
+ assert run.returncode == 0, run.stderr.decode()[-2000:]
+ out = json.loads(run.stdout.decode())
+ assert "error" not in out, out["error"]
+ return out
+
+
+def test_the_player_is_drawn_over_the_modal(walk):
+ assert walk["playing"]["detail"], "the show's modal closed when an episode started"
+ assert walk["playing"]["player"]
+ assert walk["playing"]["topmost"] == "player"
+
+
+@pytest.mark.parametrize("step", ["afterEscape", "afterClose"])
+def test_closing_the_player_lands_back_on_the_season_being_watched(walk, step):
+ after = walk[step]
+ assert after["detail"] and not after["player"]
+ assert after["topmost"] == "detail"
+ assert after["season"] == walk["playing"]["season"], "the season picked was lost"
+ assert after["rows"] == walk["playing"]["rows"]
+
+
+def test_the_episode_just_started_is_marked(walk):
+ rows = walk["playing"]["rows"]
+ assert walk["playing"]["marked"] == [rows[1]]
+ assert walk["afterEscape"]["marked"] == [rows[1]]
+ # Starting the next one from the modal moves the mark with it.
+ assert walk["afterClose"]["marked"] == [rows[2]]
+
+
+def test_the_modal_still_closes_and_reopens_clean(walk):
+ assert not walk["afterModalClose"]["detail"]
+ reopened = walk["reopened"]
+ assert reopened["detail"]
+ assert reopened["marked"] == [], "a mark from the last visit carried over"
+ assert reopened["season"] != walk["playing"]["season"], (
+ "a reopened show starts on its default season, as it always did")
+
+
+def test_a_film_still_closes_its_modal(walk):
+ """Nothing left to pick once a film starts, so nothing to come back to."""
+ assert walk["film"]["player"]
+ assert not walk["film"]["detail"]
+ assert walk["film"]["topmost"] == "player"