Files
hayyaksiandGitHub 386a66c19c Show the filename in the audio player title when the event has one (#34479)
MAudioBody passed the event body straight to the player, so an audio message
sent with a caption showed the caption text instead of the file name. It now
uses presentableTextForFile, the same helper m.file and m.image already use.

Fixes https://github.com/element-hq/element-web/issues/31116
2026-08-05 08:56:26 +00:00

67 lines
2.7 KiB
TypeScript

/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { EventType, MatrixEvent } from "matrix-js-sdk/src/matrix";
import { render, screen, act } from "jest-matrix-react";
import { MockedPlayback } from "../../../audio/MockedPlayback";
import { type Playback, PlaybackState } from "../../../../../src/audio/Playback";
import MAudioBody from "../../../../../src/components/views/messages/MAudioBody";
import { PlaybackManager } from "../../../../../src/audio/PlaybackManager";
import { type MediaEventHelper } from "../../../../../src/utils/MediaEventHelper";
describe("<MAudioBody />", () => {
let event: MatrixEvent;
const mediaEventHelper = {
sourceBlob: {
value: {
arrayBuffer: () => new ArrayBuffer(8),
},
},
} as unknown as MediaEventHelper;
beforeEach(() => {
const playback = new MockedPlayback(PlaybackState.Decoding, 50, 10) as unknown as Playback;
jest.spyOn(PlaybackManager.instance, "createPlaybackInstance").mockReturnValue(playback);
event = new MatrixEvent({
room_id: "!room:server",
sender: "@alice.example.org",
type: EventType.RoomMessage,
content: {
body: "audio name ",
msgtype: "m.audio",
url: "mxc://server/audio",
},
});
});
it("should render", async () => {
await act(() => render(<MAudioBody mxEvent={event} mediaEventHelper={mediaEventHelper} />));
expect(await screen.findByRole("region", { name: "Audio player" })).toBeInTheDocument();
});
it("should show the body as the title when there is no filename", async () => {
await act(() => render(<MAudioBody mxEvent={event} mediaEventHelper={mediaEventHelper} />));
expect(await screen.findByRole("region", { name: "Audio player" })).toBeInTheDocument();
expect(screen.getByText("audio name")).toBeInTheDocument();
});
it("should prefer the filename over the body as the title", async () => {
// A caption puts the human readable text in `body` and the actual file name in `filename`.
event.getContent().filename = "recording.ogg";
event.getContent().body = "Listen to this!";
await act(() => render(<MAudioBody mxEvent={event} mediaEventHelper={mediaEventHelper} />));
expect(await screen.findByRole("region", { name: "Audio player" })).toBeInTheDocument();
expect(screen.getByText("recording.ogg")).toBeInTheDocument();
expect(screen.queryByText("Listen to this!")).not.toBeInTheDocument();
});
});