mirror of
https://github.com/vector-im/element-call.git
synced 2026-07-09 18:29:21 +00:00
Report group call errors to sentry
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
|||||||
} from "react";
|
} from "react";
|
||||||
import { BrowserRouter } from "react-router-dom";
|
import { BrowserRouter } from "react-router-dom";
|
||||||
import userEvent from "@testing-library/user-event";
|
import userEvent from "@testing-library/user-event";
|
||||||
|
import * as Sentry from "@sentry/react";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
type CallErrorRecoveryAction,
|
type CallErrorRecoveryAction,
|
||||||
@@ -32,6 +33,15 @@ import {
|
|||||||
import { mockConfig } from "../utils/test.ts";
|
import { mockConfig } from "../utils/test.ts";
|
||||||
import { ElementWidgetActions, type WidgetHelpers } from "../widget.ts";
|
import { ElementWidgetActions, type WidgetHelpers } from "../widget.ts";
|
||||||
|
|
||||||
|
// Mock Sentry before importing the component
|
||||||
|
vi.mock("@sentry/react", async () => {
|
||||||
|
const actual = await vi.importActual("@sentry/react");
|
||||||
|
return {
|
||||||
|
...actual,
|
||||||
|
captureException: vi.fn(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
test.each([
|
test.each([
|
||||||
{
|
{
|
||||||
error: new MatrixRTCTransportMissingError("example.com"),
|
error: new MatrixRTCTransportMissingError("example.com"),
|
||||||
@@ -212,6 +222,33 @@ describe("Rageshake button", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("should call Sentry.captureException for unknown errors", async () => {
|
||||||
|
vi.mocked(Sentry.captureException).mockClear(); // Clear previous calls
|
||||||
|
|
||||||
|
const originalError = new Error("Unknown test error");
|
||||||
|
const error = new UnknownCallError(originalError);
|
||||||
|
const TestComponent = (): ReactNode => {
|
||||||
|
throw error;
|
||||||
|
};
|
||||||
|
|
||||||
|
render(
|
||||||
|
<BrowserRouter>
|
||||||
|
<GroupCallErrorBoundary
|
||||||
|
onError={vi.fn()}
|
||||||
|
recoveryActionHandler={vi.fn()}
|
||||||
|
widget={null}
|
||||||
|
>
|
||||||
|
<TestComponent />
|
||||||
|
</GroupCallErrorBoundary>
|
||||||
|
</BrowserRouter>,
|
||||||
|
);
|
||||||
|
|
||||||
|
await screen.findByText(/Something went wrong/);
|
||||||
|
|
||||||
|
expect(Sentry.captureException).toHaveBeenCalledWith(error);
|
||||||
|
expect(Sentry.captureException).toHaveBeenCalledOnce();
|
||||||
|
});
|
||||||
|
|
||||||
test("should have a close button in widget mode", async () => {
|
test("should have a close button in widget mode", async () => {
|
||||||
const error = new MatrixRTCTransportMissingError("example.com");
|
const error = new MatrixRTCTransportMissingError("example.com");
|
||||||
const TestComponent = (): ReactNode => {
|
const TestComponent = (): ReactNode => {
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ import {
|
|||||||
type ReactNode,
|
type ReactNode,
|
||||||
type SVGAttributes,
|
type SVGAttributes,
|
||||||
useCallback,
|
useCallback,
|
||||||
|
useEffect,
|
||||||
} from "react";
|
} from "react";
|
||||||
|
import * as Sentry from "@sentry/react";
|
||||||
import { Trans, useTranslation } from "react-i18next";
|
import { Trans, useTranslation } from "react-i18next";
|
||||||
import {
|
import {
|
||||||
ErrorSolidIcon,
|
ErrorSolidIcon,
|
||||||
@@ -53,6 +55,11 @@ const ErrorPage: FC<ErrorPageProps> = ({
|
|||||||
recoveryActionHandler,
|
recoveryActionHandler,
|
||||||
widget,
|
widget,
|
||||||
}: ErrorPageProps): ReactElement => {
|
}: ErrorPageProps): ReactElement => {
|
||||||
|
// We want to auto capture to sentry
|
||||||
|
useEffect(() => {
|
||||||
|
Sentry.captureException(error);
|
||||||
|
}, [error]);
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
logger.error("Error boundary caught:", error);
|
logger.error("Error boundary caught:", error);
|
||||||
let icon: ComponentType<SVGAttributes<SVGElement>>;
|
let icon: ComponentType<SVGAttributes<SVGElement>>;
|
||||||
|
|||||||
Reference in New Issue
Block a user