| 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 |