Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 32bd350

Browse files
authored
Tests for AdvancedRoomSettingsTab (#9994)
* Sort the methods in mkStubRoom * Tests for AdvancedRoomSettingsTab
1 parent b3586cf commit 32bd350

File tree

3 files changed

+213
-51
lines changed

3 files changed

+213
-51
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
Copyright 2023 The Matrix.org Foundation C.I.C.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import React from "react";
18+
import { fireEvent, render, RenderResult } from "@testing-library/react";
19+
import { MatrixClient } from "matrix-js-sdk/src/client";
20+
import { Room } from "matrix-js-sdk/src/models/room";
21+
import { mocked } from "jest-mock";
22+
import { EventType, MatrixEvent } from "matrix-js-sdk/src/matrix";
23+
24+
import AdvancedRoomSettingsTab from "../../../../../../src/components/views/settings/tabs/room/AdvancedRoomSettingsTab";
25+
import { mkEvent, mkStubRoom, stubClient } from "../../../../../test-utils";
26+
import dis from "../../../../../../src/dispatcher/dispatcher";
27+
import { Action } from "../../../../../../src/dispatcher/actions";
28+
import { MatrixClientPeg } from "../../../../../../src/MatrixClientPeg";
29+
30+
jest.mock("../../../../../../src/dispatcher/dispatcher");
31+
32+
describe("AdvancedRoomSettingsTab", () => {
33+
const roomId = "!room:example.com";
34+
let cli: MatrixClient;
35+
let room: Room;
36+
37+
const renderTab = (): RenderResult => {
38+
return render(<AdvancedRoomSettingsTab roomId={roomId} closeSettingsFn={jest.fn()} />);
39+
};
40+
41+
beforeEach(() => {
42+
stubClient();
43+
cli = MatrixClientPeg.get();
44+
room = mkStubRoom(roomId, "test room", cli);
45+
mocked(cli.getRoom).mockReturnValue(room);
46+
});
47+
48+
it("should render as expected", () => {
49+
const tab = renderTab();
50+
expect(tab.asFragment()).toMatchSnapshot();
51+
});
52+
53+
it("should display room ID", () => {
54+
const tab = renderTab();
55+
tab.getByText(roomId);
56+
});
57+
58+
it("should display room version", () => {
59+
mocked(room.getVersion).mockReturnValue("custom_room_version_1");
60+
61+
const tab = renderTab();
62+
tab.getByText("custom_room_version_1");
63+
});
64+
65+
function mockStateEvents(room: Room) {
66+
const createEvent = mkEvent({
67+
event: true,
68+
user: "@a:b.com",
69+
type: EventType.RoomCreate,
70+
content: { predecessor: { room_id: "old_room_id", event_id: "tombstone_event_id" } },
71+
room: room.roomId,
72+
});
73+
74+
type GetStateEvents2Args = (eventType: EventType | string, stateKey: string) => MatrixEvent | null;
75+
76+
const getStateEvents = jest.spyOn(
77+
room.currentState,
78+
"getStateEvents",
79+
) as unknown as jest.MockedFunction<GetStateEvents2Args>;
80+
81+
getStateEvents.mockImplementation((eventType: string | null, _key: string) => {
82+
switch (eventType) {
83+
case EventType.RoomCreate:
84+
return createEvent;
85+
default:
86+
return null;
87+
}
88+
});
89+
}
90+
91+
it("should link to predecessor room", async () => {
92+
mockStateEvents(room);
93+
const tab = renderTab();
94+
const link = await tab.findByText("View older messages in test room.");
95+
fireEvent.click(link);
96+
expect(dis.dispatch).toHaveBeenCalledWith({
97+
action: Action.ViewRoom,
98+
event_id: "tombstone_event_id",
99+
room_id: "old_room_id",
100+
metricsTrigger: "WebPredecessorSettings",
101+
metricsViaKeyboard: false,
102+
});
103+
});
104+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`AdvancedRoomSettingsTab should render as expected 1`] = `
4+
<DocumentFragment>
5+
<div
6+
class="mx_SettingsTab"
7+
>
8+
<div
9+
class="mx_SettingsTab_heading"
10+
>
11+
Advanced
12+
</div>
13+
<div
14+
class="mx_SettingsTab_section mx_SettingsTab_subsectionText"
15+
>
16+
<span
17+
class="mx_SettingsTab_subheading"
18+
>
19+
Room information
20+
</span>
21+
<div>
22+
<span>
23+
Internal room ID
24+
</span>
25+
<div
26+
class="mx_CopyableText mx_CopyableText_border"
27+
>
28+
!room:example.com
29+
<div
30+
aria-label="Copy"
31+
class="mx_AccessibleButton mx_CopyableText_copyButton"
32+
role="button"
33+
tabindex="0"
34+
/>
35+
</div>
36+
</div>
37+
</div>
38+
<div
39+
class="mx_SettingsTab_section mx_SettingsTab_subsectionText"
40+
>
41+
<span
42+
class="mx_SettingsTab_subheading"
43+
>
44+
Room version
45+
</span>
46+
<div>
47+
<span>
48+
Room version:
49+
</span>
50+
 1
51+
</div>
52+
</div>
53+
</div>
54+
</DocumentFragment>
55+
`;

test/test-utils/test-utils.ts

Lines changed: 54 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import { MediaHandler } from "matrix-js-sdk/src/webrtc/mediaHandler";
4040
import { Feature, ServerSupport } from "matrix-js-sdk/src/feature";
4141
import { CryptoBackend } from "matrix-js-sdk/src/common-crypto/CryptoBackend";
4242
import { IEventDecryptionResult } from "matrix-js-sdk/src/@types/crypto";
43+
import { MapperOpts } from "matrix-js-sdk/src/event-mapper";
4344

4445
import type { GroupCall } from "matrix-js-sdk/src/webrtc/groupCall";
4546
import { MatrixClientPeg as peg } from "../../src/MatrixClientPeg";
@@ -145,7 +146,7 @@ export function createTestClient(): MatrixClient {
145146
content: {},
146147
});
147148
}),
148-
mxcUrlToHttp: (mxc) => `http://this.is.a.url/${mxc.substring(6)}`,
149+
mxcUrlToHttp: (mxc: string) => `http://this.is.a.url/${mxc.substring(6)}`,
149150
setAccountData: jest.fn(),
150151
setRoomAccountData: jest.fn(),
151152
setRoomTopic: jest.fn(),
@@ -200,7 +201,7 @@ export function createTestClient(): MatrixClient {
200201
stopAllStreams: jest.fn(),
201202
} as unknown as MediaHandler),
202203
uploadContent: jest.fn(),
203-
getEventMapper: () => (opts) => new MatrixEvent(opts),
204+
getEventMapper: (_options?: MapperOpts) => (event: Partial<IEvent>) => new MatrixEvent(event),
204205
leaveRoomChain: jest.fn((roomId) => ({ [roomId]: null })),
205206
doesServerSupportLogoutDevices: jest.fn().mockReturnValue(true),
206207
requestPasswordEmailToken: jest.fn().mockRejectedValue({}),
@@ -476,34 +477,11 @@ export function mkMessage({
476477
}
477478

478479
export function mkStubRoom(roomId: string = null, name: string, client: MatrixClient): Room {
479-
const stubTimeline = { getEvents: () => [] } as unknown as EventTimeline;
480+
const stubTimeline = { getEvents: () => [] as MatrixEvent[] } as unknown as EventTimeline;
480481
return {
481-
roomId,
482-
getReceiptsForEvent: jest.fn().mockReturnValue([]),
483-
getMember: jest.fn().mockReturnValue({
484-
userId: "@member:domain.bla",
485-
name: "Member",
486-
rawDisplayName: "Member",
487-
roomId: roomId,
488-
getAvatarUrl: () => "mxc://avatar.url/image.png",
489-
getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
490-
}),
491-
getMembersWithMembership: jest.fn().mockReturnValue([]),
492-
getJoinedMembers: jest.fn().mockReturnValue([]),
493-
getJoinedMemberCount: jest.fn().mockReturnValue(1),
494-
getInvitedAndJoinedMemberCount: jest.fn().mockReturnValue(1),
495-
setUnreadNotificationCount: jest.fn(),
496-
getMembers: jest.fn().mockReturnValue([]),
497-
getPendingEvents: () => [],
498-
getLiveTimeline: jest.fn().mockReturnValue(stubTimeline),
499-
getUnfilteredTimelineSet: jest.fn(),
500-
findEventById: () => null,
501-
getAccountData: () => null,
502-
hasMembershipState: () => null,
503-
getVersion: () => "1",
504-
shouldUpgradeToVersion: () => null,
505-
getMyMembership: jest.fn().mockReturnValue("join"),
506-
maySendMessage: jest.fn().mockReturnValue(true),
482+
canInvite: jest.fn(),
483+
client,
484+
createThreadsTimelineSets: jest.fn().mockReturnValue(new Promise(() => {})),
507485
currentState: {
508486
getStateEvents: jest.fn((_type, key) => (key === undefined ? [] : null)),
509487
getMember: jest.fn(),
@@ -516,37 +494,62 @@ export function mkStubRoom(roomId: string = null, name: string, client: MatrixCl
516494
on: jest.fn(),
517495
off: jest.fn(),
518496
} as unknown as RoomState,
519-
tags: {},
520-
setBlacklistUnverifiedDevices: jest.fn(),
521-
on: jest.fn(),
522-
off: jest.fn(),
523-
removeListener: jest.fn(),
524-
getDMInviter: jest.fn(),
525-
name,
526-
normalizedName: normalize(name || ""),
497+
eventShouldLiveIn: jest.fn().mockReturnValue({}),
498+
fetchRoomThreads: jest.fn().mockReturnValue(Promise.resolve()),
499+
findEventById: (_: string) => undefined as MatrixEvent | undefined,
500+
findPredecessor: jest.fn().mockReturnValue({ roomId: "", eventId: null }),
501+
getAccountData: (_: EventType | string) => undefined as MatrixEvent | undefined,
502+
getAltAliases: jest.fn().mockReturnValue([]),
527503
getAvatarUrl: () => "mxc://avatar.url/room.png",
504+
getCanonicalAlias: jest.fn(),
505+
getDMInviter: jest.fn(),
506+
getEventReadUpTo: jest.fn(() => null),
507+
getInvitedAndJoinedMemberCount: jest.fn().mockReturnValue(1),
508+
getJoinRule: jest.fn().mockReturnValue("invite"),
509+
getJoinedMemberCount: jest.fn().mockReturnValue(1),
510+
getJoinedMembers: jest.fn().mockReturnValue([]),
511+
getLiveTimeline: jest.fn().mockReturnValue(stubTimeline),
512+
getMember: jest.fn().mockReturnValue({
513+
userId: "@member:domain.bla",
514+
name: "Member",
515+
rawDisplayName: "Member",
516+
roomId: roomId,
517+
getAvatarUrl: () => "mxc://avatar.url/image.png",
518+
getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
519+
}),
520+
getMembers: jest.fn().mockReturnValue([]),
521+
getMembersWithMembership: jest.fn().mockReturnValue([]),
528522
getMxcAvatarUrl: () => "mxc://avatar.url/room.png",
529-
isSpaceRoom: jest.fn().mockReturnValue(false),
523+
getMyMembership: jest.fn().mockReturnValue("join"),
524+
getPendingEvents: () => [] as MatrixEvent[],
525+
getReceiptsForEvent: jest.fn().mockReturnValue([]),
526+
getRecommendedVersion: jest.fn().mockReturnValue(Promise.resolve("")),
527+
getThreads: jest.fn().mockReturnValue([]),
530528
getType: jest.fn().mockReturnValue(undefined),
531-
isElementVideoRoom: jest.fn().mockReturnValue(false),
529+
getUnfilteredTimelineSet: jest.fn(),
532530
getUnreadNotificationCount: jest.fn(() => 0),
533-
getEventReadUpTo: jest.fn(() => null),
534-
getCanonicalAlias: jest.fn(),
535-
getAltAliases: jest.fn().mockReturnValue([]),
536-
timeline: [],
537-
getJoinRule: jest.fn().mockReturnValue("invite"),
531+
getVersion: jest.fn().mockReturnValue("1"),
532+
hasMembershipState: () => false,
533+
isElementVideoRoom: jest.fn().mockReturnValue(false),
534+
isSpaceRoom: jest.fn().mockReturnValue(false),
538535
loadMembersIfNeeded: jest.fn(),
539-
client,
536+
maySendMessage: jest.fn().mockReturnValue(true),
540537
myUserId: client?.getUserId(),
541-
canInvite: jest.fn(),
542-
getThreads: jest.fn().mockReturnValue([]),
543-
eventShouldLiveIn: jest.fn().mockReturnValue({}),
544-
createThreadsTimelineSets: jest.fn().mockReturnValue(new Promise(() => {})),
545-
fetchRoomThreads: jest.fn().mockReturnValue(new Promise(() => {})),
538+
name,
539+
normalizedName: normalize(name || ""),
540+
off: jest.fn(),
541+
on: jest.fn(),
542+
removeListener: jest.fn(),
543+
roomId,
544+
setBlacklistUnverifiedDevices: jest.fn(),
545+
setUnreadNotificationCount: jest.fn(),
546+
shouldUpgradeToVersion: (() => null) as () => string | null,
547+
tags: {},
548+
timeline: [],
546549
} as unknown as Room;
547550
}
548551

549-
export function mkServerConfig(hsUrl, isUrl) {
552+
export function mkServerConfig(hsUrl: string, isUrl: string) {
550553
return makeType(ValidatedServerConfig, {
551554
hsUrl,
552555
hsName: "TEST_ENVIRONMENT",

0 commit comments

Comments
 (0)