Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/App.test.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { describe, expect, it } from "vitest";
import { describe, expect, it, vi } from "vitest";
import App from "./App";
import { BugReporterProvider } from "./contexts/BugReporterContext";

// Mock useVersionCheck to prevent act() warning from async state updates
vi.mock("./hooks/useVersionCheck", () => ({
useVersionCheck: () => ({
updateAvailable: false,
applyUpdate: vi.fn(),
dismissUpdate: vi.fn(),
}),
}));

function renderApp() {
return render(
<BugReporterProvider>
Expand Down
21 changes: 19 additions & 2 deletions src/services/audioService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class MockAudioContext {
state: "suspended" | "running" | "closed" = "suspended";
currentTime = 0;
destination = {};
private listeners: Map<string, Function[]> = new Map();

resume = vi.fn().mockImplementation(() => {
this.state = "running";
Expand All @@ -22,6 +23,13 @@ class MockAudioContext {
return Promise.resolve();
});

addEventListener = vi.fn().mockImplementation((event: string, handler: Function) => {
if (!this.listeners.has(event)) {
this.listeners.set(event, []);
}
this.listeners.get(event)!.push(handler);
});

createOscillator = vi.fn().mockReturnValue({
connect: vi.fn(),
frequency: { value: 0 },
Expand All @@ -37,6 +45,14 @@ class MockAudioContext {
exponentialRampToValueAtTime: vi.fn(),
},
});

// For silent buffer warmup
createBuffer = vi.fn().mockReturnValue({});
createBufferSource = vi.fn().mockReturnValue({
buffer: null,
connect: vi.fn(),
start: vi.fn(),
});
}

// Store original
Expand Down Expand Up @@ -183,7 +199,7 @@ describe("AudioService", () => {
});

describe("testSound timeout", () => {
it("should timeout and return error if resume hangs", async () => {
it("should timeout and destroy context if resume hangs", async () => {
// Make resume hang forever
mockAudioContext.resume = vi.fn().mockImplementation(() => new Promise(() => {}));

Expand All @@ -197,7 +213,8 @@ describe("AudioService", () => {

const result = await promise;
expect(result.played).toBe(false);
expect(result.error).toContain("timeout");
// Context gets destroyed after timeout, so it reports destroyed state
expect(result.error).toContain("destroyed");

vi.useRealTimers();
});
Expand Down
Loading