Testing Audio Interface Components in Gradio-App
This test suite validates audio functionality in the Gradio application, focusing on waveform controls, streaming capabilities, and audio recording features. The tests ensure proper interaction with audio playback controls and microphone access.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
gradio-app/gradio
js/spa/test/audio_debugger.spec.ts
import { test, expect } from "@self/tootils";
import { chromium } from "playwright";
// we cannot currently test the waveform canvas with playwright (https://github.com/microsoft/playwright/issues/23964)
// so this test covers the interactive elements around the waveform canvas
test("audio waveform", async ({ page }) => {
await expect(page.getByRole("tab", { name: "Audio" })).toHaveAttribute(
"aria-selected",
"true"
);
await page.getByRole("tab", { name: "Interface" }).click();
await page.getByRole("tab", { name: "Interface" }).click();
await page.getByRole("button", { name: "cantina.wav" }).click();
await page
.getByTestId("waveform-x")
.getByLabel("Adjust playback speed to 1.5x")
.click();
await page.getByLabel("Adjust playback speed to 2x").click();
await page
.getByTestId("waveform-x")
.getByLabel("Skip forward by 0.15 seconds")
.click();
await page
.getByTestId("waveform-x")
.getByLabel("Skip backwards by 0.15 seconds")
.click();
await page.getByLabel("Trim audio to selection").click();
await page.getByRole("button", { name: "Trim" }).click();
await page.getByLabel("Reset audio").click();
await page.getByRole("button", { name: "Submit" }).click();
await page
.getByTestId("waveform-output")
.getByLabel("Adjust playback speed to 1.5x")
.click();
await page
.getByTestId("waveform-output")
.getByLabel("Skip backwards by 0.15 seconds")
.click();
await page
.getByTestId("waveform-output")
.getByLabel("Skip forward by 0.15 seconds")
.click();
});
test("audio streaming tab", async ({ page }) => {
const browser = await chromium.launch({
args: ["--use-fake-ui-for-media-stream"]
});
const context = await browser.newContext({
permissions: ["microphone"]
});
context.grantPermissions(["microphone"]);
await page.getByRole("tab", { name: "Streaming" }).click();
await expect(page.getByLabel("Select input device")).toContainText(
"Fake Default Audio InputFake Audio Input 1Fake Audio Input 2"
);
});
test("recording audio", async ({ page }) => {
const browser = await chromium.launch({
args: ["--use-fake-ui-for-media-stream"]
});
const context = await browser.newContext({
permissions: ["microphone"]
});
await page.getByRole("tab", { name: "Interface" }).click();
await page.getByLabel("Record audio").click();
context.grantPermissions(["microphone"]);
await expect(page.getByRole("combobox")).toContainText(
"Fake Default Audio InputFake Audio Input 1Fake Audio Input 2"
);
await page.getByRole("button", { name: "Record", exact: true }).click();
await page.waitForTimeout(1000);
await expect(page.getByText("0:01", { exact: true })).toBeAttached();
await page.getByText("Stop", { exact: true }).nth(0).click();
});