Move ResizerNotifier into SDKContext (#30939)

* Move ResizerNotifier into SDKContext

so we don't have to pass it into RoomView

* Fix test

* Unused import

* Add tests

* Remove a bunch of resizeNotifier props

* Remove more resizeNotifier props

* Add resizenotifier to test

* Add more sdkcontext wrappers in tests

* More sdkcontext wrappers

* Even more sdkcontext wrappers

* Add test to make sonarcloud happy

* Context isn't always there unlike props

* Test actual resizing too

* Remove commented line
This commit is contained in:
David Baker
2025-10-06 10:23:06 +01:00
committed by GitHub
parent 87fdf96192
commit c08775588d
32 changed files with 490 additions and 443 deletions

View File

@@ -62,3 +62,13 @@ export function withClientContextRenderOptions(client: MatrixClient): RenderOpti
),
};
}
export function clientAndSDKContextRenderOptions(client: MatrixClient, sdkContext: SdkContextClass): RenderOptions {
return {
wrapper: ({ children }) => (
<SDKContext.Provider value={sdkContext}>
<MatrixClientContext.Provider value={client}>{children}</MatrixClientContext.Provider>
</SDKContext.Provider>
),
};
}

View File

@@ -12,7 +12,6 @@ import { screen, render, waitFor } from "jest-matrix-react";
import { mocked } from "jest-mock";
import FilePanel from "../../../../src/components/structures/FilePanel";
import ResizeNotifier from "../../../../src/utils/ResizeNotifier";
import { mkEvent, stubClient } from "../../../test-utils";
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
@@ -39,9 +38,7 @@ describe("FilePanel", () => {
room.getOrCreateFilteredTimelineSet = jest.fn().mockReturnValue(timelineSet);
mocked(cli.getRoom).mockReturnValue(room);
const { asFragment } = render(
<FilePanel roomId={room.roomId} onClose={jest.fn()} resizeNotifier={new ResizeNotifier()} />,
);
const { asFragment } = render(<FilePanel roomId={room.roomId} onClose={jest.fn()} />);
await waitFor(() => {
expect(screen.getByText("No files visible in this room")).toBeInTheDocument();
});
@@ -64,7 +61,6 @@ describe("FilePanel", () => {
<FilePanel
roomId={room.roomId}
onClose={jest.fn()}
resizeNotifier={new ResizeNotifier()}
ref={(ref) => {
filePanel = ref;
}}

View File

@@ -10,30 +10,26 @@ import React from "react";
import { render, fireEvent } from "jest-matrix-react";
import MainSplit from "../../../../src/components/structures/MainSplit";
import ResizeNotifier from "../../../../src/utils/ResizeNotifier";
import { PosthogAnalytics } from "../../../../src/PosthogAnalytics.ts";
import { SDKContext, SdkContextClass } from "../../../../src/contexts/SDKContext.ts";
describe("<MainSplit/>", () => {
const resizeNotifier = new ResizeNotifier();
const children = (
<div>
Child<span>Foo</span>Bar
</div>
);
const panel = <div>Right panel</div>;
let sdkContext: SdkContextClass;
beforeEach(() => {
localStorage.clear();
sdkContext = new SdkContextClass();
});
it("renders", () => {
const { asFragment, container } = render(
<MainSplit
resizeNotifier={resizeNotifier}
children={children}
panel={panel}
analyticsRoomType="other_room"
/>,
<MainSplit children={children} panel={panel} analyticsRoomType="other_room" />,
);
expect(asFragment()).toMatchSnapshot();
// Assert it matches the default width of 320
@@ -42,13 +38,7 @@ describe("<MainSplit/>", () => {
it("respects defaultSize prop", () => {
const { asFragment, container } = render(
<MainSplit
resizeNotifier={resizeNotifier}
children={children}
panel={panel}
defaultSize={500}
analyticsRoomType="other_room"
/>,
<MainSplit children={children} panel={panel} defaultSize={500} analyticsRoomType="other_room" />,
);
expect(asFragment()).toMatchSnapshot();
// Assert it matches the default width of 350
@@ -59,7 +49,6 @@ describe("<MainSplit/>", () => {
localStorage.setItem("mx_rhs_size_thread", "333");
const { container } = render(
<MainSplit
resizeNotifier={resizeNotifier}
children={children}
panel={panel}
sizeKey="thread"
@@ -73,18 +62,19 @@ describe("<MainSplit/>", () => {
it("should report to analytics on resize stop", () => {
const { container } = render(
<MainSplit
resizeNotifier={resizeNotifier}
children={children}
panel={panel}
sizeKey="thread"
defaultSize={400}
analyticsRoomType="other_room"
/>,
{ wrapper: ({ children }) => <SDKContext.Provider value={sdkContext}>{children}</SDKContext.Provider> },
);
const spy = jest.spyOn(PosthogAnalytics.instance, "trackEvent");
const handle = container.querySelector(".mx_ResizeHandle--horizontal")!;
expect(handle).toBeInTheDocument();
fireEvent.mouseDown(handle);
fireEvent.resize(handle, { clientX: 0 });
fireEvent.mouseUp(handle);

View File

@@ -307,6 +307,30 @@ describe("<MatrixChat />", () => {
});
});
it("should notify resizenotifier when left panel hidden", async () => {
getComponent();
jest.spyOn(SdkContextClass.instance.resizeNotifier, "notifyLeftHandleResized");
defaultDispatcher.dispatch({ action: "hide_left_panel" });
await waitFor(() =>
expect(mocked(SdkContextClass.instance.resizeNotifier.notifyLeftHandleResized)).toHaveBeenCalled(),
);
});
it("should notify resizenotifier when left panel shown", async () => {
getComponent();
jest.spyOn(SdkContextClass.instance.resizeNotifier, "notifyLeftHandleResized");
defaultDispatcher.dispatch({ action: "show_left_panel" });
await waitFor(() =>
expect(mocked(SdkContextClass.instance.resizeNotifier.notifyLeftHandleResized)).toHaveBeenCalled(),
);
});
describe("when query params have a OIDC params", () => {
const issuer = "https://auth.com/";
const homeserverUrl = "https://matrix.org";

View File

@@ -15,11 +15,11 @@ import { render } from "jest-matrix-react";
import MessagePanel, { shouldFormContinuation } from "../../../../src/components/structures/MessagePanel";
import SettingsStore from "../../../../src/settings/SettingsStore";
import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
import RoomContext, { TimelineRenderingType } from "../../../../src/contexts/RoomContext";
import DMRoomMap from "../../../../src/utils/DMRoomMap";
import * as TestUtilsMatrix from "../../../test-utils";
import {
clientAndSDKContextRenderOptions,
createTestClient,
getMockClientWithEventEmitter,
makeBeaconInfoEvent,
@@ -32,6 +32,7 @@ import type ResizeNotifier from "../../../../src/utils/ResizeNotifier";
import { type IRoomState } from "../../../../src/components/structures/RoomView";
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
import { ScopedRoomContextProvider } from "../../../../src/contexts/ScopedRoomContext.tsx";
import { SdkContextClass } from "../../../../src/contexts/SDKContext.ts";
jest.mock("../../../../src/utils/beacon", () => ({
useBeacon: jest.fn(),
@@ -54,6 +55,7 @@ describe("MessagePanel", function () {
getClientWellKnown: jest.fn().mockReturnValue({}),
supportsThreads: jest.fn().mockReturnValue(true),
});
let sdkContext: SdkContextClass;
jest.spyOn(MatrixClientPeg, "get").mockReturnValue(client);
const room = new Room(roomId, client, userId);
@@ -93,11 +95,9 @@ describe("MessagePanel", function () {
} as unknown as IRoomState;
const getComponent = (props = {}, roomContext: Partial<IRoomState> = {}) => (
<MatrixClientContext.Provider value={client}>
<ScopedRoomContextProvider {...defaultRoomContext} {...roomContext}>
<MessagePanel {...defaultProps} {...props} />
</ScopedRoomContextProvider>
</MatrixClientContext.Provider>
<ScopedRoomContextProvider {...defaultRoomContext} {...roomContext}>
<MessagePanel {...defaultProps} {...props} />
</ScopedRoomContextProvider>
);
beforeEach(function () {
@@ -107,6 +107,8 @@ describe("MessagePanel", function () {
return arg === "showDisplaynameChanges";
});
sdkContext = new SdkContextClass();
DMRoomMap.makeShared(client);
});
@@ -314,7 +316,7 @@ describe("MessagePanel", function () {
}
it("should show the events", function () {
const { container } = render(getComponent({ events }));
const { container } = render(getComponent({ events }), clientAndSDKContextRenderOptions(client, sdkContext));
// just check we have the right number of tiles for now
const tiles = container.getElementsByClassName("mx_EventTile");
@@ -322,7 +324,10 @@ describe("MessagePanel", function () {
});
it("should collapse adjacent member events", function () {
const { container } = render(getComponent({ events: mkMelsEvents() }));
const { container } = render(
getComponent({ events: mkMelsEvents() }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
// just check we have the right number of tiles for now
const tiles = container.getElementsByClassName("mx_EventTile");
@@ -339,6 +344,7 @@ describe("MessagePanel", function () {
readMarkerEventId: events[4].getId(),
readMarkerVisible: true,
}),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const tiles = container.getElementsByClassName("mx_EventTile");
@@ -359,6 +365,7 @@ describe("MessagePanel", function () {
readMarkerEventId: melsEvents[4].getId(),
readMarkerVisible: true,
}),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const [summary] = container.getElementsByClassName("mx_GenericEventListSummary");
@@ -381,6 +388,7 @@ describe("MessagePanel", function () {
readMarkerEventId: melsEvents[9].getId(),
readMarkerVisible: true,
}),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const [summary] = container.getElementsByClassName("mx_GenericEventListSummary");
@@ -406,6 +414,7 @@ describe("MessagePanel", function () {
readMarkerVisible: true,
})}
</div>,
clientAndSDKContextRenderOptions(client, sdkContext),
);
const tiles = container.getElementsByClassName("mx_EventTile");
@@ -448,7 +457,7 @@ describe("MessagePanel", function () {
client.getRoom.mockImplementation((id) => (id === createEvent!.getRoomId() ? room : null));
TestUtilsMatrix.upsertRoomStateEvents(room, events);
const { container } = render(getComponent({ events }));
const { container } = render(getComponent({ events }), clientAndSDKContextRenderOptions(client, sdkContext));
// we expect that
// - the room creation event, the room encryption event, and Alice inviting Bob,
@@ -476,7 +485,10 @@ describe("MessagePanel", function () {
});
const combinedEvents = [...events, beaconInfoEvent];
TestUtilsMatrix.upsertRoomStateEvents(room, combinedEvents);
const { container } = render(getComponent({ events: combinedEvents }));
const { container } = render(
getComponent({ events: combinedEvents }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const [summaryTile] = container.getElementsByClassName("mx_GenericEventListSummary");
@@ -498,6 +510,7 @@ describe("MessagePanel", function () {
readMarkerEventId: events[5].getId(),
readMarkerVisible: true,
}),
clientAndSDKContextRenderOptions(client, sdkContext),
);
// find the <li> which wraps the read marker
@@ -514,7 +527,10 @@ describe("MessagePanel", function () {
it("should render Date separators for the events", function () {
const events = mkOneDayEvents();
const { queryAllByRole } = render(getComponent({ events }));
const { queryAllByRole } = render(
getComponent({ events }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const dates = queryAllByRole("separator");
expect(dates.length).toEqual(1);
@@ -523,7 +539,10 @@ describe("MessagePanel", function () {
it("appends events into summaries during forward pagination without changing key", () => {
const events = mkMelsEvents().slice(1, 11);
const { container, rerender } = render(getComponent({ events }));
const { container, rerender } = render(
getComponent({ events }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
let els = container.getElementsByClassName("mx_GenericEventListSummary");
expect(els.length).toEqual(1);
expect(els[0].getAttribute("data-testid")).toEqual("eventlistsummary-" + events[0].getId());
@@ -553,7 +572,10 @@ describe("MessagePanel", function () {
it("prepends events into summaries during backward pagination without changing key", () => {
const events = mkMelsEvents().slice(1, 11);
const { container, rerender } = render(getComponent({ events }));
const { container, rerender } = render(
getComponent({ events }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
let els = container.getElementsByClassName("mx_GenericEventListSummary");
expect(els.length).toEqual(1);
expect(els[0].getAttribute("data-testid")).toEqual("eventlistsummary-" + events[0].getId());
@@ -583,7 +605,10 @@ describe("MessagePanel", function () {
it("assigns different keys to summaries that get split up", () => {
const events = mkMelsEvents().slice(1, 11);
const { container, rerender } = render(getComponent({ events }));
const { container, rerender } = render(
getComponent({ events }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
let els = container.getElementsByClassName("mx_GenericEventListSummary");
expect(els.length).toEqual(1);
expect(els[0].getAttribute("data-testid")).toEqual(`eventlistsummary-${events[0].getId()}`);
@@ -616,7 +641,7 @@ describe("MessagePanel", function () {
it("doesn't lookup showHiddenEventsInTimeline while rendering", () => {
// We're only interested in the setting lookups that happen on every render,
// rather than those happening on first mount, so let's get those out of the way
const { rerender } = render(getComponent({ events: [] }));
const { rerender } = render(getComponent({ events: [] }), clientAndSDKContextRenderOptions(client, sdkContext));
// Set up our spy and re-render with new events
const settingsSpy = jest.spyOn(SettingsStore, "getValue").mockClear();
@@ -654,7 +679,10 @@ describe("MessagePanel", function () {
ts: 3,
}),
];
const { container } = render(getComponent({ events }, { showHiddenEvents: true }));
const { container } = render(
getComponent({ events }, { showHiddenEvents: true }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const els = container.getElementsByClassName("mx_GenericEventListSummary");
expect(els.length).toEqual(1);
@@ -678,7 +706,10 @@ describe("MessagePanel", function () {
}),
);
}
const { asFragment } = render(getComponent({ events }, { showHiddenEvents: false }));
const { asFragment } = render(
getComponent({ events }, { showHiddenEvents: false }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
expect(asFragment()).toMatchSnapshot();
});
@@ -699,7 +730,10 @@ describe("MessagePanel", function () {
}),
);
}
const { asFragment } = render(getComponent({ events }, { showHiddenEvents: false }));
const { asFragment } = render(
getComponent({ events }, { showHiddenEvents: false }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
expect(asFragment()).toMatchSnapshot();
});
@@ -720,7 +754,10 @@ describe("MessagePanel", function () {
}),
);
}
const { asFragment } = render(getComponent({ events }, { showHiddenEvents: true }));
const { asFragment } = render(
getComponent({ events }, { showHiddenEvents: true }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const cpt = asFragment();
// Ignore properties that change every time
@@ -751,7 +788,10 @@ describe("MessagePanel", function () {
content: { topic: "TOPIC" },
}),
];
const { container } = render(getComponent({ events, showReadReceipts: true }));
const { container } = render(
getComponent({ events, showReadReceipts: true }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const tiles = container.getElementsByClassName("mx_EventTile");
expect(tiles.length).toEqual(2);
@@ -784,7 +824,10 @@ describe("MessagePanel", function () {
},
true,
);
const { container } = render(getComponent({ events, showReadReceipts: true }));
const { container } = render(
getComponent({ events, showReadReceipts: true }),
clientAndSDKContextRenderOptions(client, sdkContext),
);
const tiles = container.getElementsByClassName("mx_EventTile");
expect(tiles.length).toEqual(2);

View File

@@ -20,11 +20,11 @@ import {
} from "matrix-js-sdk/src/matrix";
import { RoomSearchView } from "../../../../src/components/structures/RoomSearchView";
import ResizeNotifier from "../../../../src/utils/ResizeNotifier";
import { stubClient } from "../../../test-utils";
import { clientAndSDKContextRenderOptions, stubClient } from "../../../test-utils";
import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
import { searchPagination, SearchScope } from "../../../../src/Searching";
import { SdkContextClass } from "../../../../src/contexts/SDKContext";
jest.mock("../../../../src/Searching", () => ({
searchPagination: jest.fn(),
@@ -33,13 +33,14 @@ jest.mock("../../../../src/Searching", () => ({
describe("<RoomSearchView/>", () => {
const eventMapper = (obj: Partial<IEvent>) => new MatrixEvent(obj);
const resizeNotifier = new ResizeNotifier();
let client: MatrixClient;
let sdkContext: SdkContextClass;
let room: Room;
beforeEach(async () => {
stubClient();
client = MatrixClientPeg.safeGet();
sdkContext = new SdkContextClass();
client.supportsThreads = jest.fn().mockReturnValue(true);
room = new Room("!room:server", client, client.getSafeUserId());
mocked(client.getRoom).mockReturnValue(room);
@@ -60,7 +61,6 @@ describe("<RoomSearchView/>", () => {
term="search term"
scope={SearchScope.All}
promise={deferred.promise}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>,
@@ -71,59 +71,57 @@ describe("<RoomSearchView/>", () => {
it("should render results when the promise resolves", async () => {
render(
<MatrixClientContext.Provider value={client}>
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve<ISearchResults>({
results: [
SearchResult.fromJson(
{
rank: 1,
result: {
room_id: room.roomId,
event_id: "$2",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Foo Test Bar", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [
{
room_id: room.roomId,
event_id: "$1",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Before", msgtype: "m.text" },
type: EventType.RoomMessage,
},
],
events_after: [
{
room_id: room.roomId,
event_id: "$3",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "After", msgtype: "m.text" },
type: EventType.RoomMessage,
},
],
},
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve<ISearchResults>({
results: [
SearchResult.fromJson(
{
rank: 1,
result: {
room_id: room.roomId,
event_id: "$2",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Foo Test Bar", msgtype: "m.text" },
type: EventType.RoomMessage,
},
eventMapper,
),
],
highlights: [],
count: 1,
})}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
</MatrixClientContext.Provider>,
context: {
profile_info: {},
events_before: [
{
room_id: room.roomId,
event_id: "$1",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Before", msgtype: "m.text" },
type: EventType.RoomMessage,
},
],
events_after: [
{
room_id: room.roomId,
event_id: "$3",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "After", msgtype: "m.text" },
type: EventType.RoomMessage,
},
],
},
},
eventMapper,
),
],
highlights: [],
count: 1,
})}
className="someClass"
onUpdate={jest.fn()}
/>,
clientAndSDKContextRenderOptions(client, sdkContext),
);
await screen.findByText("Before");
@@ -133,41 +131,39 @@ describe("<RoomSearchView/>", () => {
it("should highlight words correctly", async () => {
render(
<MatrixClientContext.Provider value={client}>
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.Room}
promise={Promise.resolve<ISearchResults>({
results: [
SearchResult.fromJson(
{
rank: 1,
result: {
room_id: room.roomId,
event_id: "$2",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Foo Test Bar", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.Room}
promise={Promise.resolve<ISearchResults>({
results: [
SearchResult.fromJson(
{
rank: 1,
result: {
room_id: room.roomId,
event_id: "$2",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Foo Test Bar", msgtype: "m.text" },
type: EventType.RoomMessage,
},
eventMapper,
),
],
highlights: ["test"],
count: 1,
})}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
</MatrixClientContext.Provider>,
context: {
profile_info: {},
events_before: [],
events_after: [],
},
},
eventMapper,
),
],
highlights: ["test"],
count: 1,
})}
className="someClass"
onUpdate={jest.fn()}
/>,
clientAndSDKContextRenderOptions(client, sdkContext),
);
const text = await screen.findByText("Test");
@@ -231,17 +227,15 @@ describe("<RoomSearchView/>", () => {
const onUpdate = jest.fn();
const { rerender } = render(
<MatrixClientContext.Provider value={client}>
<RoomSearchView
inProgress={true}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve(searchResults)}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={onUpdate}
/>
</MatrixClientContext.Provider>,
<RoomSearchView
inProgress={true}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve(searchResults)}
className="someClass"
onUpdate={onUpdate}
/>,
clientAndSDKContextRenderOptions(client, sdkContext),
);
await screen.findByRole("progressbar");
@@ -249,17 +243,14 @@ describe("<RoomSearchView/>", () => {
expect(onUpdate).toHaveBeenCalledWith(false, expect.objectContaining({}), null);
rerender(
<MatrixClientContext.Provider value={client}>
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve(searchResults)}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
</MatrixClientContext.Provider>,
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve(searchResults)}
className="someClass"
onUpdate={jest.fn()}
/>,
);
expect(screen.queryByRole("progressbar")).toBeFalsy();
@@ -275,7 +266,6 @@ describe("<RoomSearchView/>", () => {
term="search term"
scope={SearchScope.All}
promise={deferred.promise}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
@@ -299,7 +289,6 @@ describe("<RoomSearchView/>", () => {
term="search term"
scope={SearchScope.All}
promise={deferred.promise}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
@@ -324,7 +313,6 @@ describe("<RoomSearchView/>", () => {
term="search term"
scope={SearchScope.All}
promise={deferred.promise}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={onUpdate}
/>
@@ -424,17 +412,15 @@ describe("<RoomSearchView/>", () => {
};
render(
<MatrixClientContext.Provider value={client}>
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve(searchResults)}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
</MatrixClientContext.Provider>,
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve(searchResults)}
className="someClass"
onUpdate={jest.fn()}
/>,
clientAndSDKContextRenderOptions(client, sdkContext),
);
const beforeNode = await screen.findByText("Before");
@@ -459,98 +445,96 @@ describe("<RoomSearchView/>", () => {
);
render(
<MatrixClientContext.Provider value={client}>
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve<ISearchResults>({
results: [
SearchResult.fromJson(
{
rank: 1,
result: {
room_id: room.roomId,
event_id: "$2",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Room 1", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
<RoomSearchView
inProgress={false}
term="search term"
scope={SearchScope.All}
promise={Promise.resolve<ISearchResults>({
results: [
SearchResult.fromJson(
{
rank: 1,
result: {
room_id: room.roomId,
event_id: "$2",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Room 1", msgtype: "m.text" },
type: EventType.RoomMessage,
},
eventMapper,
),
SearchResult.fromJson(
{
rank: 2,
result: {
room_id: room2.roomId,
event_id: "$22",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Room 2", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
eventMapper,
),
SearchResult.fromJson(
{
rank: 2,
result: {
room_id: room2.roomId,
event_id: "$23",
sender: client.getSafeUserId(),
origin_server_ts: 2,
content: { body: "Room 2 message 2", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
},
eventMapper,
),
SearchResult.fromJson(
{
rank: 2,
result: {
room_id: room2.roomId,
event_id: "$22",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Room 2", msgtype: "m.text" },
type: EventType.RoomMessage,
},
eventMapper,
),
SearchResult.fromJson(
{
rank: 3,
result: {
room_id: room3.roomId,
event_id: "$32",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Room 3", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
eventMapper,
),
],
highlights: [],
count: 1,
})}
resizeNotifier={resizeNotifier}
className="someClass"
onUpdate={jest.fn()}
/>
</MatrixClientContext.Provider>,
},
eventMapper,
),
SearchResult.fromJson(
{
rank: 2,
result: {
room_id: room2.roomId,
event_id: "$23",
sender: client.getSafeUserId(),
origin_server_ts: 2,
content: { body: "Room 2 message 2", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
},
eventMapper,
),
SearchResult.fromJson(
{
rank: 3,
result: {
room_id: room3.roomId,
event_id: "$32",
sender: client.getSafeUserId(),
origin_server_ts: 1,
content: { body: "Room 3", msgtype: "m.text" },
type: EventType.RoomMessage,
},
context: {
profile_info: {},
events_before: [],
events_after: [],
},
},
eventMapper,
),
],
highlights: [],
count: 1,
})}
className="someClass"
onUpdate={jest.fn()}
/>,
clientAndSDKContextRenderOptions(client, sdkContext),
);
const event1 = await screen.findByText("Room 1");

View File

@@ -55,7 +55,6 @@ import { Action } from "../../../../src/dispatcher/actions";
import defaultDispatcher from "../../../../src/dispatcher/dispatcher";
import { type ViewRoomPayload } from "../../../../src/dispatcher/payloads/ViewRoomPayload";
import { RoomView } from "../../../../src/components/structures/RoomView";
import ResizeNotifier from "../../../../src/utils/ResizeNotifier";
import SettingsStore from "../../../../src/settings/SettingsStore";
import { SettingLevel } from "../../../../src/settings/SettingLevel";
import DMRoomMap from "../../../../src/utils/DMRoomMap";
@@ -157,7 +156,6 @@ describe("RoomView", () => {
// threepidInvite should be optional on RoomView props
// it is treated as optional in RoomView
threepidInvite={undefined as any}
resizeNotifier={new ResizeNotifier()}
forceTimeline={false}
ref={ref}
/>
@@ -196,7 +194,6 @@ describe("RoomView", () => {
// threepidInvite should be optional on RoomView props
// it is treated as optional in RoomView
threepidInvite={undefined}
resizeNotifier={new ResizeNotifier()}
forceTimeline={false}
onRegistered={jest.fn()}
/>

View File

@@ -33,15 +33,14 @@ import { type Mocked, mocked } from "jest-mock";
import { forEachRight } from "lodash";
import TimelinePanel from "../../../../src/components/structures/TimelinePanel";
import MatrixClientContext from "../../../../src/contexts/MatrixClientContext";
import { MatrixClientPeg } from "../../../../src/MatrixClientPeg";
import {
clientAndSDKContextRenderOptions,
filterConsole,
flushPromises,
mkMembership,
mkRoom,
stubClient,
withClientContextRenderOptions,
} from "../../../test-utils";
import { mkThread } from "../../../test-utils/threads";
import { createMessageEventContent } from "../../../test-utils/events";
@@ -51,6 +50,7 @@ import defaultDispatcher from "../../../../src/dispatcher/dispatcher";
import { Action } from "../../../../src/dispatcher/actions";
import { SettingLevel } from "../../../../src/settings/SettingLevel";
import MatrixClientBackedController from "../../../../src/settings/controllers/MatrixClientBackedController";
import { SdkContextClass } from "../../../../src/contexts/SDKContext";
// ScrollPanel calls this, but jsdom doesn't mock it for us
HTMLDivElement.prototype.scrollBy = () => {};
@@ -159,6 +159,7 @@ const setupPagination = (
describe("TimelinePanel", () => {
let client: Mocked<MatrixClient>;
let sdkContext: SdkContextClass;
let userId: string;
filterConsole("checkForPreJoinUISI: showing all messages, skipping check");
@@ -166,6 +167,7 @@ describe("TimelinePanel", () => {
beforeEach(() => {
client = mocked(stubClient());
userId = client.getSafeUserId();
sdkContext = new SdkContextClass();
});
describe("read receipts and markers", () => {
@@ -200,7 +202,7 @@ describe("TimelinePanel", () => {
timelinePanel = ref;
}}
/>,
withClientContextRenderOptions(MatrixClientPeg.safeGet()),
clientAndSDKContextRenderOptions(client, sdkContext),
);
await flushPromises();
await waitFor(() => expect(timelinePanel).toBeTruthy());
@@ -396,7 +398,7 @@ describe("TimelinePanel", () => {
await withScrollPanelMountSpy(async (mountSpy) => {
const { container } = render(
<TimelinePanel {...getProps(room, events)} timelineSet={timelineSet} />,
withClientContextRenderOptions(MatrixClientPeg.safeGet()),
clientAndSDKContextRenderOptions(client, sdkContext),
);
await waitFor(() => expectEvents(container, [events[1]]));
@@ -416,7 +418,7 @@ describe("TimelinePanel", () => {
await withScrollPanelMountSpy(async (mountSpy) => {
const { container } = render(
<TimelinePanel {...getProps(room, events)} />,
withClientContextRenderOptions(MatrixClientPeg.safeGet()),
clientAndSDKContextRenderOptions(client, sdkContext),
);
await waitFor(() => expectEvents(container, [events[0], events[1]]));
@@ -493,7 +495,7 @@ describe("TimelinePanel", () => {
const paginateSpy = jest.spyOn(TimelineWindow.prototype, "paginate").mockClear();
render(<TimelinePanel {...props} />);
render(<TimelinePanel {...props} />, clientAndSDKContextRenderOptions(client, sdkContext));
const event = new MatrixEvent({ type: RoomEvent.Timeline, origin_server_ts: 0 });
const data = { timeline: props.timelineSet.getLiveTimeline(), liveEvent: true };
@@ -590,9 +592,8 @@ describe("TimelinePanel", () => {
const replyToEvent = jest.spyOn(thread, "replyToEvent", "get");
const dom = render(
<MatrixClientContext.Provider value={client}>
<TimelinePanel timelineSet={allThreads} manageReadReceipts sendReadReceiptOnLoad />
</MatrixClientContext.Provider>,
<TimelinePanel timelineSet={allThreads} manageReadReceipts sendReadReceiptOnLoad />,
clientAndSDKContextRenderOptions(client, sdkContext),
);
await dom.findByText("RootEvent");
await dom.findByText("ReplyEvent1");
@@ -645,9 +646,8 @@ describe("TimelinePanel", () => {
};
const dom = render(
<MatrixClientContext.Provider value={client}>
<TimelinePanel timelineSet={allThreads} manageReadReceipts sendReadReceiptOnLoad />
</MatrixClientContext.Provider>,
<TimelinePanel timelineSet={allThreads} manageReadReceipts sendReadReceiptOnLoad />,
clientAndSDKContextRenderOptions(client, sdkContext),
);
await dom.findByText("RootEvent");
await dom.findByText("ReplyEvent1");
@@ -718,9 +718,8 @@ describe("TimelinePanel", () => {
}
const { container } = render(
<MatrixClientContext.Provider value={client}>
<TimelinePanel timelineSet={timelineSet} manageReadReceipts={true} sendReadReceiptOnLoad={true} />
</MatrixClientContext.Provider>,
<TimelinePanel timelineSet={timelineSet} manageReadReceipts={true} sendReadReceiptOnLoad={true} />,
clientAndSDKContextRenderOptions(client, sdkContext),
);
await waitFor(() => expect(screen.queryByRole("progressbar")).toBeNull());
@@ -740,7 +739,7 @@ describe("TimelinePanel", () => {
await withScrollPanelMountSpy(async () => {
const { container } = render(
<TimelinePanel {...getProps(room, events)} timelineSet={timelineSet} />,
withClientContextRenderOptions(MatrixClientPeg.safeGet()),
clientAndSDKContextRenderOptions(client, sdkContext),
);
await waitFor(() => expectEvents(container, [events[1]]));

View File

@@ -13,10 +13,12 @@ import { EventType, MatrixEvent } from "matrix-js-sdk/src/matrix";
import type { MatrixClient } from "matrix-js-sdk/src/matrix";
import { flushPromises, mkMessage, stubClient } from "../../../../test-utils";
import MessageEditHistoryDialog from "../../../../../src/components/views/dialogs/MessageEditHistoryDialog";
import { SDKContext, SdkContextClass } from "../../../../../src/contexts/SDKContext";
describe("<MessageEditHistory />", () => {
const roomId = "!aroom:example.com";
let client: jest.Mocked<MatrixClient>;
let sdkContext: SdkContextClass;
let event: MatrixEvent;
beforeEach(() => {
@@ -27,10 +29,13 @@ describe("<MessageEditHistory />", () => {
room: "!room:example.com",
msg: "My Great Message",
});
sdkContext = new SdkContextClass();
});
async function renderComponent(): Promise<RenderResult> {
const result = render(<MessageEditHistoryDialog mxEvent={event} onFinished={jest.fn()} />);
const result = render(<MessageEditHistoryDialog mxEvent={event} onFinished={jest.fn()} />, {
wrapper: ({ children }) => <SDKContext.Provider value={sdkContext}>{children}</SDKContext.Provider>,
});
await waitForElementToBeRemoved(() => result.queryByRole("progressbar"));
await flushPromises();
return result;

View File

@@ -21,7 +21,7 @@ import {
import RightPanel from "../../../../../src/components/structures/RightPanel";
import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg";
import ResizeNotifier from "../../../../../src/utils/ResizeNotifier";
import { stubClient } from "../../../../test-utils";
import { clientAndSDKContextRenderOptions, stubClient } from "../../../../test-utils";
import { Action } from "../../../../../src/dispatcher/actions";
import dis from "../../../../../src/dispatcher/dispatcher";
import DMRoomMap from "../../../../../src/utils/DMRoomMap";
@@ -39,6 +39,7 @@ import { ElementWidget } from "../../../../../src/stores/widgets/StopGapWidget";
import { WidgetMessagingStore } from "../../../../../src/stores/widgets/WidgetMessagingStore";
import { ModuleRunner } from "../../../../../src/modules/ModuleRunner";
import { RoomPermalinkCreator } from "../../../../../src/utils/permalinks/Permalinks";
import { SdkContextClass } from "../../../../../src/contexts/SDKContext";
jest.mock("../../../../../src/stores/OwnProfileStore", () => ({
OwnProfileStore: {
@@ -53,6 +54,7 @@ jest.mock("../../../../../src/stores/OwnProfileStore", () => ({
describe("AppTile", () => {
let cli: MatrixClient;
let sdkContext: SdkContextClass;
let r1: Room;
let r2: Room;
const resizeNotifier = new ResizeNotifier();
@@ -116,6 +118,7 @@ describe("AppTile", () => {
});
beforeEach(() => {
sdkContext = new SdkContextClass();
jest.spyOn(SettingsStore, "getValue").mockRestore();
});
@@ -299,9 +302,8 @@ describe("AppTile", () => {
// Run initial render with room 1, and also running lifecycle methods
const renderResult = render(
<MatrixClientContext.Provider value={cli}>
<AppsDrawer userId={cli.getSafeUserId()} room={r1} resizeNotifier={resizeNotifier} />
</MatrixClientContext.Provider>,
<AppsDrawer userId={cli.getSafeUserId()} room={r1} />,
clientAndSDKContextRenderOptions(cli, sdkContext),
);
expect(renderResult.getByText("Example 1")).toBeInTheDocument();

View File

@@ -13,23 +13,23 @@ import { render } from "jest-matrix-react";
import { stubClient } from "../../../../test-utils";
import AppsDrawer from "../../../../../src/components/views/rooms/AppsDrawer";
import SdkConfig from "../../../../../src/SdkConfig";
import ResizeNotifier from "../../../../../src/utils/ResizeNotifier";
import { WidgetLayoutStore } from "../../../../../src/stores/widgets/WidgetLayoutStore";
import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext";
import { SDKContext, SdkContextClass } from "../../../../../src/contexts/SDKContext";
const ROOM_ID = "!room:id";
describe("AppsDrawer", () => {
let client: MatrixClient;
let room: Room;
let dummyResizeNotifier: ResizeNotifier;
let sdkContext: SdkContextClass;
beforeEach(async () => {
client = stubClient();
room = new Room(ROOM_ID, client, client.getUserId()!, {
pendingEventOrdering: PendingEventOrdering.Detached,
});
dummyResizeNotifier = new ResizeNotifier();
sdkContext = new SdkContextClass();
});
afterEach(() => {
@@ -58,17 +58,13 @@ describe("AppsDrawer", () => {
return [];
});
const { container } = render(
<AppsDrawer
userId={client.getUserId()!}
room={room}
resizeNotifier={dummyResizeNotifier}
showApps={true}
/>,
{
wrapper: ({ ...rest }) => <MatrixClientContext.Provider value={client} {...rest} />,
},
);
const { container } = render(<AppsDrawer userId={client.getUserId()!} room={room} showApps={true} />, {
wrapper: ({ ...rest }) => (
<SDKContext.Provider value={sdkContext}>
<MatrixClientContext.Provider value={client} {...rest} />
</SDKContext.Provider>
),
});
const appsDrawerResizer = container.getElementsByClassName("mx_AppsDrawer_resizer")[0] as HTMLElement;
expect(appsDrawerResizer.style.height).toBe("500px");

View File

@@ -14,13 +14,13 @@ import userEvent from "@testing-library/user-event";
import * as pinnedEventHooks from "../../../../../src/hooks/usePinnedEvents";
import { PinnedMessageBanner } from "../../../../../src/components/views/rooms/PinnedMessageBanner";
import { RoomPermalinkCreator } from "../../../../../src/utils/permalinks/Permalinks";
import { makePollStartEvent, stubClient, withClientContextRenderOptions } from "../../../../test-utils";
import { makePollStartEvent, stubClient, clientAndSDKContextRenderOptions } from "../../../../test-utils";
import dis from "../../../../../src/dispatcher/dispatcher";
import RightPanelStore from "../../../../../src/stores/right-panel/RightPanelStore";
import { RightPanelPhases } from "../../../../../src/stores/right-panel/RightPanelStorePhases";
import { UPDATE_EVENT } from "../../../../../src/stores/AsyncStore";
import { Action } from "../../../../../src/dispatcher/actions";
import ResizeNotifier from "../../../../../src/utils/ResizeNotifier.ts";
import { SdkContextClass } from "../../../../../src/contexts/SDKContext.ts";
describe("<PinnedMessageBanner />", () => {
const userId = "@alice:server.org";
@@ -29,12 +29,12 @@ describe("<PinnedMessageBanner />", () => {
let mockClient: MatrixClient;
let room: Room;
let permalinkCreator: RoomPermalinkCreator;
let resizeNotifier: ResizeNotifier;
let sdkContext: SdkContextClass;
beforeEach(() => {
mockClient = stubClient();
room = new Room(roomId, mockClient, userId);
permalinkCreator = new RoomPermalinkCreator(room);
resizeNotifier = new ResizeNotifier();
sdkContext = new SdkContextClass();
jest.spyOn(dis, "dispatch").mockReturnValue(undefined);
});
@@ -80,8 +80,8 @@ describe("<PinnedMessageBanner />", () => {
*/
function renderBanner() {
return render(
<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} resizeNotifier={resizeNotifier} />,
withClientContextRenderOptions(mockClient),
<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} />,
clientAndSDKContextRenderOptions(mockClient, sdkContext),
);
}
@@ -153,9 +153,7 @@ describe("<PinnedMessageBanner />", () => {
event3.getId()!,
]);
jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2, event3]);
rerender(
<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} resizeNotifier={resizeNotifier} />,
);
rerender(<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} />);
await expect(screen.findByText("Third pinned message")).resolves.toBeVisible();
expect(asFragment()).toMatchSnapshot();
});
@@ -226,7 +224,7 @@ describe("<PinnedMessageBanner />", () => {
describe("Notify the timeline to resize", () => {
beforeEach(() => {
jest.spyOn(resizeNotifier, "notifyTimelineHeightChanged");
jest.spyOn(sdkContext.resizeNotifier, "notifyTimelineHeightChanged");
jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([event1.getId()!, event2.getId()!]);
jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2]);
});
@@ -235,7 +233,7 @@ describe("<PinnedMessageBanner />", () => {
renderBanner();
await expect(screen.findByText("Second pinned message")).resolves.toBeVisible();
// The banner is displayed, so we need to resize the timeline
expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1);
expect(sdkContext.resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1);
await userEvent.click(
screen.getByRole("button", {
@@ -244,23 +242,21 @@ describe("<PinnedMessageBanner />", () => {
);
await expect(screen.findByText("First pinned message")).resolves.toBeVisible();
// The banner is already displayed, so we don't need to resize the timeline
expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1);
expect(sdkContext.resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1);
});
it("should notify the timeline to resize when we hide the banner", async () => {
const { rerender } = renderBanner();
await expect(screen.findByText("Second pinned message")).resolves.toBeVisible();
// The banner is displayed, so we need to resize the timeline
expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1);
expect(sdkContext.resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1);
// The banner has no event to display and is hidden
jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([]);
jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([]);
rerender(
<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} resizeNotifier={resizeNotifier} />,
);
rerender(<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} />);
// The timeline should be resized
expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(2);
expect(sdkContext.resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(2);
});
});

View File

@@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { render } from "jest-matrix-react";
import { fireEvent, render, waitFor } from "jest-matrix-react";
import { MatrixCall } from "matrix-js-sdk/src/webrtc/call";
import { CallEventHandlerEvent } from "matrix-js-sdk/src/webrtc/callEventHandler";
@@ -15,19 +15,22 @@ import LegacyCallViewForRoom from "../../../../../src/components/views/voip/Lega
import { mkStubRoom, stubClient } from "../../../../test-utils";
import DMRoomMap from "../../../../../src/utils/DMRoomMap";
import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg";
import ResizeNotifier from "../../../../../src/utils/ResizeNotifier";
import LegacyCallHandler from "../../../../../src/LegacyCallHandler";
import { SDKContext, SdkContextClass } from "../../../../../src/contexts/SDKContext";
jest.mock("../../../../../src/components/views/voip/LegacyCallView", () => jest.fn(() => "LegacyCallView"));
describe("LegacyCallViewForRoom", () => {
const LegacyCallViewMock = LegacyCallView as unknown as jest.Mock;
let sdkContext: SdkContextClass;
beforeEach(() => {
stubClient();
sdkContext = new SdkContextClass();
LegacyCallViewMock.mockClear();
});
it("should remember sidebar state, defaulting to shown", async () => {
stubClient();
it("should remember sidebar state, defaulting to shown", async () => {
const callHandler = new LegacyCallHandler();
callHandler.start();
jest.spyOn(LegacyCallHandler, "instance", "get").mockImplementation(() => callHandler);
@@ -45,16 +48,14 @@ describe("LegacyCallViewForRoom", () => {
const cli = MatrixClientPeg.safeGet();
cli.emit(CallEventHandlerEvent.Incoming, call);
const { rerender } = render(
<LegacyCallViewForRoom roomId={call.roomId} resizeNotifier={new ResizeNotifier()} />,
);
const { rerender } = render(<LegacyCallViewForRoom roomId={call.roomId} />);
let props = LegacyCallViewMock.mock.lastCall![0];
expect(props.sidebarShown).toBeTruthy(); // Sidebar defaults to shown
props.setSidebarShown(false); // Hide the sidebar
rerender(<LegacyCallViewForRoom roomId={call.roomId} resizeNotifier={new ResizeNotifier()} />);
rerender(<LegacyCallViewForRoom roomId={call.roomId} />);
console.log(LegacyCallViewMock.mock);
@@ -64,9 +65,47 @@ describe("LegacyCallViewForRoom", () => {
rerender(<div> </div>); // Destroy the LegacyCallViewForRoom and LegacyCallView
LegacyCallViewMock.mockClear(); // Drop stored LegacyCallView props
rerender(<LegacyCallViewForRoom roomId={call.roomId} resizeNotifier={new ResizeNotifier()} />);
rerender(<LegacyCallViewForRoom roomId={call.roomId} />);
props = LegacyCallViewMock.mock.lastCall![0];
expect(props.sidebarShown).toBeFalsy(); // Value was remembered
});
it("should notify on resize start events", async () => {
const call = new MatrixCall({
client: MatrixClientPeg.safeGet(),
roomId: "test-room",
});
const callHandler = {
getCallForRoom: jest.fn().mockReturnValue(call),
isCallSidebarShown: jest.fn().mockReturnValue(true),
addListener: jest.fn(),
removeListener: jest.fn(),
};
jest.spyOn(LegacyCallHandler, "instance", "get").mockImplementation(
() => callHandler as unknown as LegacyCallHandler,
);
jest.spyOn(sdkContext.resizeNotifier, "startResizing");
jest.spyOn(sdkContext.resizeNotifier, "stopResizing");
jest.spyOn(sdkContext.resizeNotifier, "notifyTimelineHeightChanged");
const { container } = render(<LegacyCallViewForRoom roomId={call.roomId} />, {
wrapper: ({ children }) => <SDKContext.Provider value={sdkContext}>{children}</SDKContext.Provider>,
});
const resizer = container.querySelector(".mx_LegacyCallViewForRoom_ResizeHandle");
await waitFor(() => {
expect(resizer).toBeInTheDocument();
});
fireEvent.mouseDown(resizer!);
fireEvent.mouseMove(resizer!, { clientY: 100 });
fireEvent.mouseUp(resizer!);
expect(sdkContext.resizeNotifier.startResizing).toHaveBeenCalled();
expect(sdkContext.resizeNotifier.stopResizing).toHaveBeenCalled();
expect(sdkContext.resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalled();
});
});