2022-05-19 09:03:29 +01:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2022-05-19 09:03:29 +01:00
Copyright 2022 The Matrix.org Foundation C.I.C.
2025-01-06 11:18:54 +00:00
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2022-05-19 09:03:29 +01:00
*/
2024-10-21 14:50:06 +01:00
import { waitFor , renderHook , act } from "jest-matrix-react" ;
2025-02-05 13:25:06 +00:00
import { type IRoomDirectoryOptions , type MatrixClient } from "matrix-js-sdk/src/matrix" ;
2022-05-19 09:03:29 +01:00
2024-10-15 14:57:26 +01:00
import { usePublicRoomDirectory } from "../../../src/hooks/usePublicRoomDirectory" ;
import { MatrixClientPeg } from "../../../src/MatrixClientPeg" ;
import { stubClient } from "../../test-utils/test-utils" ;
2022-05-19 09:03:29 +01:00
2023-02-14 15:02:52 +00:00
function render() {
return renderHook (() => usePublicRoomDirectory ());
2022-05-19 09:03:29 +01:00
}
describe ( "usePublicRoomDirectory" , () => {
2023-02-13 11:39:16 +00:00
let cli : MatrixClient ;
2022-05-19 09:03:29 +01:00
beforeEach (() => {
stubClient ();
2023-06-05 18:12:23 +01:00
cli = MatrixClientPeg . safeGet ();
2022-05-19 09:03:29 +01:00
2024-05-28 08:41:20 +01:00
cli . getDomain = () => "matrix.org" ;
2022-05-19 09:03:29 +01:00
cli . getThirdpartyProtocols = () => Promise . resolve ({});
2023-02-14 15:02:52 +00:00
cli . publicRooms = ({ filter } : IRoomDirectoryOptions ) => {
2025-02-22 00:17:13 +00:00
const chunk = [
{
room_id : "hello world!" ,
name : filter?.generic_search_term ?? "" , // If the query is "" no filter is applied(an is undefined here), in keeping with the pattern let's call the room ""
world_readable : true ,
guest_can_join : true ,
num_joined_members : 1 ,
},
];
2023-02-14 15:02:52 +00:00
return Promise . resolve ({
chunk ,
2022-05-19 09:03:29 +01:00
total_room_count_estimate : 1 ,
});
2023-02-14 15:02:52 +00:00
};
2022-05-19 09:03:29 +01:00
});
it ( "should display public rooms when searching" , async () => {
const query = "ROOM NAME" ;
2023-02-14 15:02:52 +00:00
const { result } = render ();
2022-05-19 09:03:29 +01:00
2023-02-14 15:02:52 +00:00
expect ( result . current . ready ). toBe ( false );
expect ( result . current . loading ). toBe ( false );
2022-05-19 09:03:29 +01:00
2023-02-14 15:02:52 +00:00
act (() => {
result . current . search ({
limit : 1 ,
query ,
});
2022-05-19 09:03:29 +01:00
});
2023-02-14 15:02:52 +00:00
await waitFor (() => {
expect ( result . current . ready ). toBe ( true );
});
expect ( result . current . publicRooms [ 0 ]. name ). toBe ( query );
2022-05-19 09:03:29 +01:00
});
it ( "should work with empty queries" , async () => {
2025-02-22 00:17:13 +00:00
const query = "" ;
2023-02-14 15:02:52 +00:00
const { result } = render ();
2022-05-19 09:03:29 +01:00
2023-02-14 15:02:52 +00:00
act (() => {
result . current . search ({
limit : 1 ,
query ,
});
2022-05-19 09:03:29 +01:00
});
2023-02-14 15:02:52 +00:00
await waitFor (() => {
expect ( result . current . ready ). toBe ( true );
2026-05-05 11:10:41 +01:00
expect ( result . current . publicRooms [ 0 ] ? . name ). toEqual ( query );
2023-02-14 15:02:52 +00:00
});
2022-05-19 09:03:29 +01:00
});
it ( "should recover from a server exception" , async () => {
cli . publicRooms = () => {
throw new Error ( "Oops" );
};
const query = "ROOM NAME" ;
2023-02-14 15:02:52 +00:00
const { result } = render ();
act (() => {
result . current . search ({
limit : 1 ,
query ,
});
2022-05-19 09:03:29 +01:00
});
2023-02-14 15:02:52 +00:00
await waitFor (() => {
expect ( result . current . ready ). toBe ( true );
});
expect ( result . current . publicRooms ). toEqual ([]);
2022-05-19 09:03:29 +01:00
});
});