diff --git a/plugins/career/venue-packs/club/bored.mp4 b/plugins/career/venue-packs/club/bored.mp4 new file mode 100644 index 0000000..c95ac43 Binary files /dev/null and b/plugins/career/venue-packs/club/bored.mp4 differ diff --git a/plugins/career/venue-packs/club/cheer.mp4 b/plugins/career/venue-packs/club/cheer.mp4 new file mode 100644 index 0000000..f28cbb2 Binary files /dev/null and b/plugins/career/venue-packs/club/cheer.mp4 differ diff --git a/plugins/career/venue-packs/club/clap.mp4 b/plugins/career/venue-packs/club/clap.mp4 new file mode 100644 index 0000000..1a98cfe Binary files /dev/null and b/plugins/career/venue-packs/club/clap.mp4 differ diff --git a/plugins/career/venue-packs/club/club-ambience.mp3 b/plugins/career/venue-packs/club/club-ambience.mp3 new file mode 100644 index 0000000..56c8a2f Binary files /dev/null and b/plugins/career/venue-packs/club/club-ambience.mp3 differ diff --git a/plugins/career/venue-packs/club/ecstatic.mp4 b/plugins/career/venue-packs/club/ecstatic.mp4 new file mode 100644 index 0000000..b72c0e7 Binary files /dev/null and b/plugins/career/venue-packs/club/ecstatic.mp4 differ diff --git a/plugins/career/venue-packs/club/engaged.mp4 b/plugins/career/venue-packs/club/engaged.mp4 new file mode 100644 index 0000000..af035f3 Binary files /dev/null and b/plugins/career/venue-packs/club/engaged.mp4 differ diff --git a/plugins/career/venue-packs/club/intro.mp4 b/plugins/career/venue-packs/club/intro.mp4 new file mode 100644 index 0000000..675dc4b Binary files /dev/null and b/plugins/career/venue-packs/club/intro.mp4 differ diff --git a/plugins/career/venue-packs/club/manifest.json b/plugins/career/venue-packs/club/manifest.json new file mode 100644 index 0000000..054b99a --- /dev/null +++ b/plugins/career/venue-packs/club/manifest.json @@ -0,0 +1,8 @@ +{ + "venue": "club", + "version": 1, + "loops": {"bored": "bored.mp4", "neutral": "neutral.mp4", "engaged": "engaged.mp4", "ecstatic": "ecstatic.mp4"}, + "stingers": {"clap": "clap.mp4", "cheer": "cheer.mp4"}, + "intro": {"video": "intro.mp4", "audio": "club-ambience.mp3"}, + "sfx": {"up": "sfx-up.mp3", "down": "sfx-down.mp3"} +} diff --git a/plugins/career/venue-packs/club/neutral.mp4 b/plugins/career/venue-packs/club/neutral.mp4 new file mode 100644 index 0000000..630a850 Binary files /dev/null and b/plugins/career/venue-packs/club/neutral.mp4 differ diff --git a/plugins/career/venue-packs/club/sfx-down.mp3 b/plugins/career/venue-packs/club/sfx-down.mp3 new file mode 100644 index 0000000..835b03b Binary files /dev/null and b/plugins/career/venue-packs/club/sfx-down.mp3 differ diff --git a/plugins/career/venue-packs/club/sfx-up.mp3 b/plugins/career/venue-packs/club/sfx-up.mp3 new file mode 100644 index 0000000..b80b56b Binary files /dev/null and b/plugins/career/venue-packs/club/sfx-up.mp3 differ diff --git a/tests/js/career_plugin.test.js b/tests/js/career_plugin.test.js index d2b9d9b..f038727 100644 --- a/tests/js/career_plugin.test.js +++ b/tests/js/career_plugin.test.js @@ -76,6 +76,31 @@ test('arena venue pack ships with full media in the plugin checkout', () => { } }); +test('club venue pack ships with full media in the plugin checkout', () => { + const packDir = path.join(PLUGIN_DIR, 'venue-packs', 'club'); + const manifest = JSON.parse(fs.readFileSync(path.join(packDir, 'manifest.json'), 'utf8')); + assert.equal(manifest.venue, 'club'); + assert.deepEqual(manifest.loops, { + bored: 'bored.mp4', neutral: 'neutral.mp4', + engaged: 'engaged.mp4', ecstatic: 'ecstatic.mp4', + }); + assert.deepEqual(manifest.stingers, { clap: 'clap.mp4', cheer: 'cheer.mp4' }); + assert.deepEqual(manifest.sfx, { up: 'sfx-up.mp3', down: 'sfx-down.mp3' }); + assert.equal(manifest.intro.video, 'intro.mp4'); + assert.equal(manifest.intro.audio, 'club-ambience.mp3'); + for (const f of [ + ...Object.values(manifest.loops), + ...Object.values(manifest.stingers), + manifest.intro.video, + manifest.intro.audio, + manifest.sfx.up, + manifest.sfx.down, + ]) { + const stat = fs.statSync(path.join(packDir, f)); + assert.ok(stat.size > 0, `${f} must be present`); + } +}); + test('shell promotes the career plugin into the sidebar', () => { const src = fs.readFileSync(SHELL_JS, 'utf8'); assert.match(src, /key: 'career',\s*screen: 'plugin-career'/); diff --git a/tests/plugins/career/test_routes.py b/tests/plugins/career/test_routes.py index e104740..e1ed626 100644 --- a/tests/plugins/career/test_routes.py +++ b/tests/plugins/career/test_routes.py @@ -121,12 +121,17 @@ def test_pack_file_serving_and_traversal_guard(client): def test_state_reports_installed_and_delete_removes(client): + # All three venues now ship bundled, so deleting the downloaded copy + # falls back to the bundled pack: installed stays True by design + # (downloaded packs override bundled ones, never replace them). _install_fake_pack("club") state = client.get("/api/plugins/career/state").json() assert {v["id"]: v["installed"] for v in state["venues"]}["club"] is True assert client.delete("/api/plugins/career/packs/club").status_code == 200 state = client.get("/api/plugins/career/state").json() - assert {v["id"]: v["installed"] for v in state["venues"]}["club"] is False + assert {v["id"]: v["installed"] for v in state["venues"]}["club"] is True + # the downloaded override itself is gone + assert not (career_routes._venue_dir("club") / "manifest.json").exists() def test_download_worker_end_to_end(client, tmp_path):