From 786165208ff2a4c5588f5e8d8cb5144634aa51bf Mon Sep 17 00:00:00 2001 From: Marc Diaz Date: Wed, 29 Apr 2026 22:45:41 -0400 Subject: [PATCH] misc: remove misc changes --- package-lock.json | 12 ++--- ...owser.test.ts => useCameraDevices.test.ts} | 46 ++++++++++++------- .../tutorialHelpTranslations.test.ts | 2 - src/lib/blurEffects.test.ts | 2 +- src/lib/exporter/streamingDecoder.test.ts | 14 ------ vitest.config.ts | 3 +- 6 files changed, 36 insertions(+), 43 deletions(-) rename src/hooks/{useCameraDevices.browser.test.ts => useCameraDevices.test.ts} (72%) diff --git a/package-lock.json b/package-lock.json index ed0c9af..ba40beb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7222,15 +7222,13 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.15.tgz", + "integrity": "sha512-qsJ8/X+UypqxHXN75M7dF88jNK37dLBRW7LeUzCPz+TNs37G8cfWy9nWzS+LS//g600zrt2le9KuXt0rWfDz5Q==", "dev": true, + "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" + "baseline-browser-mapping": "dist/cli.js" } }, "node_modules/bcrypt-pbkdf": { diff --git a/src/hooks/useCameraDevices.browser.test.ts b/src/hooks/useCameraDevices.test.ts similarity index 72% rename from src/hooks/useCameraDevices.browser.test.ts rename to src/hooks/useCameraDevices.test.ts index 71709fd..5ca21bc 100644 --- a/src/hooks/useCameraDevices.browser.test.ts +++ b/src/hooks/useCameraDevices.test.ts @@ -2,26 +2,40 @@ import { act, renderHook, waitFor } from "@testing-library/react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useCameraDevices } from "./useCameraDevices"; +// Mock navigator.mediaDevices const mockDevices = [ { kind: "videoinput", deviceId: "cam1", label: "Camera 1", groupId: "group1" }, { kind: "videoinput", deviceId: "cam2", label: "Camera 2", groupId: "group1" }, { kind: "audioinput", deviceId: "mic1", label: "Mic 1", groupId: "group2" }, ]; +const mockGetUserMedia = vi.fn().mockResolvedValue({ + getTracks: () => [{ stop: vi.fn() }], +}); + +const mockEnumerateDevices = vi.fn().mockResolvedValue(mockDevices); + +Object.defineProperty(global.navigator, "mediaDevices", { + value: { + enumerateDevices: mockEnumerateDevices, + getUserMedia: mockGetUserMedia, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + }, + configurable: true, +}); + describe("useCameraDevices", () => { beforeEach(() => { - vi.spyOn(navigator.mediaDevices, "enumerateDevices").mockResolvedValue( - mockDevices as MediaDeviceInfo[], - ); - vi.spyOn(navigator.mediaDevices, "getUserMedia").mockResolvedValue({ + vi.clearAllMocks(); + mockEnumerateDevices.mockResolvedValue(mockDevices); + mockGetUserMedia.mockResolvedValue({ getTracks: () => [{ stop: vi.fn() }], - } as unknown as MediaStream); - vi.spyOn(navigator.mediaDevices, "addEventListener"); - vi.spyOn(navigator.mediaDevices, "removeEventListener"); + }); }); afterEach(() => { - vi.restoreAllMocks(); + vi.resetAllMocks(); }); it("should list video input devices", async () => { @@ -44,9 +58,9 @@ describe("useCameraDevices", () => { }); it("should use device ID as fallback label when label is missing", async () => { - vi.mocked(navigator.mediaDevices.enumerateDevices).mockResolvedValueOnce([ + mockEnumerateDevices.mockResolvedValueOnce([ { kind: "videoinput", deviceId: "cam1abc123456", label: "", groupId: "group1" }, - ] as MediaDeviceInfo[]); + ]); const { result } = renderHook(() => useCameraDevices(true)); @@ -54,13 +68,11 @@ describe("useCameraDevices", () => { expect(result.current.devices[0]?.label).toBe("Camera cam1abc1"); }); - expect(navigator.mediaDevices.getUserMedia).not.toHaveBeenCalled(); + expect(mockGetUserMedia).not.toHaveBeenCalled(); }); it("should set error state when enumeration fails", async () => { - vi.mocked(navigator.mediaDevices.enumerateDevices).mockRejectedValueOnce( - new Error("Permission denied"), - ); + mockEnumerateDevices.mockRejectedValueOnce(new Error("Permission denied")); const { result } = renderHook(() => useCameraDevices(true)); @@ -79,13 +91,13 @@ describe("useCameraDevices", () => { expect(result.current.selectedDeviceId).toBe("cam1"); }); + // Simulate cam1 being unplugged — only cam2 remains const cam2Only = [ { kind: "videoinput", deviceId: "cam2", label: "Camera 2", groupId: "group1" }, ]; - vi.mocked(navigator.mediaDevices.enumerateDevices).mockResolvedValueOnce( - cam2Only as MediaDeviceInfo[], - ); + mockEnumerateDevices.mockResolvedValueOnce(cam2Only); + // Trigger devicechange event via the registered handler const devicechangeHandler = ( navigator.mediaDevices.addEventListener as ReturnType ).mock.calls[0]?.[1] as (() => void) | undefined; diff --git a/src/i18n/__tests__/tutorialHelpTranslations.test.ts b/src/i18n/__tests__/tutorialHelpTranslations.test.ts index ac45daa..fcfa9d3 100644 --- a/src/i18n/__tests__/tutorialHelpTranslations.test.ts +++ b/src/i18n/__tests__/tutorialHelpTranslations.test.ts @@ -6,7 +6,6 @@ import frDialogs from "@/i18n/locales/fr/dialogs.json"; import koKRDialogs from "@/i18n/locales/ko-KR/dialogs.json"; import trDialogs from "@/i18n/locales/tr/dialogs.json"; import zhCNDialogs from "@/i18n/locales/zh-CN/dialogs.json"; -import zhTWDialogs from "@/i18n/locales/zh-TW/dialogs.json"; const tutorialHelpKeys = [ "triggerLabel", @@ -36,7 +35,6 @@ const keysThatMayBeEmpty = new Set<(typeof tutorialHelpKeys)[number]>(["step1Des const dialogsByLocale = { en: enDialogs, "zh-CN": zhCNDialogs, - "zh-TW": zhTWDialogs, es: esDialogs, fr: frDialogs, tr: trDialogs, diff --git a/src/lib/blurEffects.test.ts b/src/lib/blurEffects.test.ts index 1a6a9c9..4797e69 100644 --- a/src/lib/blurEffects.test.ts +++ b/src/lib/blurEffects.test.ts @@ -75,6 +75,6 @@ describe("blur color helpers", () => { intensity: 12, blockSize: 12, }), - ).toBe("rgba(0, 0, 0, 0.56)"); + ).toBe("rgba(0, 0, 0, 0.18)"); }); }); diff --git a/src/lib/exporter/streamingDecoder.test.ts b/src/lib/exporter/streamingDecoder.test.ts index 45be92b..55b9123 100644 --- a/src/lib/exporter/streamingDecoder.test.ts +++ b/src/lib/exporter/streamingDecoder.test.ts @@ -83,18 +83,4 @@ describe("shouldFailDecodeEndedEarly", () => { }), ).toBe(true); }); - - it("does not fail when decoder reached stream end but container tail is large (inflated metadata)", () => { - // Real case: ~20min video where container reports 1234s but actual stream - // ends at 1226s. Decoder correctly stops at 1226s (= streamDurationSec). - // The 8s tail is container metadata inflation, not a real decode failure. - expect( - shouldFailDecodeEndedEarly({ - cancelled: false, - lastDecodedFrameSec: 1226, - requiredEndSec: 1234, - streamDurationSec: 1226, - }), - ).toBe(false); - }); }); diff --git a/vitest.config.ts b/vitest.config.ts index 8ad92d3..ea60216 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,9 +4,8 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { globals: true, - environment: "node", + environment: "jsdom", include: ["src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], - exclude: ["src/**/*.browser.test.{ts,tsx}", "node_modules"], }, resolve: { alias: {