返回 CodeWhale
session-media.test.ts
根目录 / web / lib / session-media.test.ts
1 import { createElement } from "react";
2 import { renderToStaticMarkup } from "react-dom/server";
3 import { describe, expect, it } from "vitest";
4 import { SessionMedia } from "../components/session-media";
5 import type { MediaAsset } from "./media-manifest";
6
7 const published: MediaAsset = {
8 id: "sample",
9 title: { en: "Sample", zh: "示例" },
10 description: { en: "Sample session", zh: "示例会话" },
11 status: "published",
12 pendingLabel: { en: "Pending", zh: "待录制" },
13 poster: { src: "media/sample.png", width: 1280, height: 720, alt: { en: "Poster", zh: "海报" } },
14 video: { src: "media/sample.mp4", durationSeconds: 30, width: 1280, height: 720 },
15 captions: [
16 { src: "media/sample.en.vtt", srclang: "en", label: "English" },
17 { src: "media/sample.zh.vtt", srclang: "zh", label: "中文" },
18 ],
19 };
20
21 function defaultTrack(locale: string): string | undefined {
22 const html = renderToStaticMarkup(createElement(SessionMedia, { asset: published, locale }));
23 const tracks = [...html.matchAll(/<track [^>]*>/g)].map((match) => match[0]);
24 const defaults = tracks.filter((track) => /\sdefault(=""|\s|>|\/)/.test(track));
25 expect(defaults, html).toHaveLength(1);
26 return defaults[0].match(/srcLang="([^"]+)"/i)?.[1];
27 }
28
29 describe("SessionMedia captions", () => {
30 it("defaults to the page's caption track, else English (W01-m2)", () => {
31 expect(defaultTrack("zh")).toBe("zh");
32 expect(defaultTrack("en")).toBe("en");
33 // A routed locale with no caption track of its own falls back to English.
34 expect(defaultTrack("ja")).toBe("en");
35 });
36 });
37
37 lines TYPESCRIPT