diff --git a/test/hooks/useSlidingSyncRoomSearch-test.tsx b/test/hooks/useSlidingSyncRoomSearch-test.tsx
new file mode 100644
index 0000000000..d9d9fe0cfe
--- /dev/null
+++ b/test/hooks/useSlidingSyncRoomSearch-test.tsx
@@ -0,0 +1,105 @@
+/*
+Copyright 2023 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// eslint-disable-next-line deprecate/import
+import { mount } from "enzyme";
+import { sleep } from "matrix-js-sdk/src/utils";
+import React from "react";
+import { act } from "react-dom/test-utils";
+import { mocked } from "jest-mock";
+import { SlidingSync } from "matrix-js-sdk/src/sliding-sync";
+import { Room } from "matrix-js-sdk/src/matrix";
+
+import { useSlidingSyncRoomSearch } from "../../src/hooks/useSlidingSyncRoomSearch";
+import { MockEventEmitter, stubClient } from "../test-utils";
+import { SlidingSyncManager } from "../../src/SlidingSyncManager";
+
+// hooks must be inside a React component else you get:
+// "Invalid hook call. Hooks can only be called inside of the body of a function component."
+function RoomSearchComponent({ onClick }) {
+ const roomSearch = useSlidingSyncRoomSearch();
+ return
onClick(roomSearch)} />;
+}
+
+describe("useSlidingSyncRoomSearch", () => {
+ it("should display rooms when searching", async () => {
+ const client = stubClient();
+ const roomA = new Room("!a:localhost", client, client.getUserId());
+ const roomB = new Room("!b:localhost", client, client.getUserId());
+ const slidingSync = mocked(
+ new MockEventEmitter({
+ getListData: jest.fn(),
+ }) as unknown as SlidingSync,
+ );
+ jest.spyOn(SlidingSyncManager.instance, "ensureListRegistered").mockResolvedValue({
+ ranges: [[0, 9]],
+ });
+ SlidingSyncManager.instance.slidingSync = slidingSync;
+ mocked(slidingSync.getListData).mockReturnValue({
+ joinedCount: 2,
+ roomIndexToRoomId: {
+ 0: roomA.roomId,
+ 1: roomB.roomId,
+ },
+ });
+ mocked(client.getRoom).mockImplementation((roomId) => {
+ switch (roomId) {
+ case roomA.roomId:
+ return roomA;
+ case roomB.roomId:
+ return roomB;
+ default:
+ return null;
+ }
+ });
+
+ // first check that everything is empty and then do the search
+ let executeHook = (roomSearch) => {
+ expect(roomSearch.loading).toBe(false);
+ expect(roomSearch.rooms).toEqual([]);
+ roomSearch.search({
+ limit: 10,
+ query: "foo",
+ });
+ };
+ const wrapper = mount(
+ {
+ executeHook(roomSearch);
+ }}
+ />,
+ );
+
+ // run the query
+ await act(async () => {
+ await sleep(1);
+ wrapper.simulate("click");
+ return act(() => sleep(1));
+ });
+ // now we expect there to be rooms
+ executeHook = (roomSearch) => {
+ expect(roomSearch.loading).toBe(false);
+ expect(roomSearch.rooms).toEqual([roomA, roomB]);
+ };
+
+ // run the query
+ await act(async () => {
+ await sleep(1);
+ wrapper.simulate("click");
+ return act(() => sleep(1));
+ });
+ });
+});