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

Find DMs with pending third-paty invites #10256

Merged
merged 2 commits into from
Mar 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/utils/dm/findDMForUser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,15 @@ function extractSuitableRoom(rooms: Room[], userId: string): Room | undefined {
(m) => !functionalUsers.includes(m.userId) && m.membership && isJoinedOrNearlyJoined(m.membership),
);
const otherMember = joinedMembers.find((m) => m.userId === userId);
return otherMember && joinedMembers.length === 2;

if (otherMember && joinedMembers.length === 2) {
return true;
}

const thirdPartyInvites = r.currentState.getStateEvents("m.room.third_party_invite") || [];

// match room with pending third-party invite
return joinedMembers.length === 1 && thirdPartyInvites.length === 1;
}
return false;
})
Expand Down
13 changes: 13 additions & 0 deletions test/test-utils/test-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,19 @@ export const mkRoomMemberJoinEvent = (user: string, room: string): MatrixEvent =
});
};

export const mkThirdPartyInviteEvent = (user: string, displayName: string, room: string): MatrixEvent => {
return mkEvent({
event: true,
type: EventType.RoomThirdPartyInvite,
content: {
display_name: displayName,
},
skey: "test" + Math.random(),
user,
room,
});
};

export const mkPusher = (extra: Partial<IPusher> = {}): IPusher => ({
app_display_name: "app",
app_id: "123",
Expand Down
24 changes: 20 additions & 4 deletions test/utils/dm/findDMForUser-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { mocked } from "jest-mock";
import { MatrixClient, Room } from "matrix-js-sdk/src/matrix";

import DMRoomMap from "../../../src/utils/DMRoomMap";
import { createTestClient, makeMembershipEvent } from "../../test-utils";
import { createTestClient, makeMembershipEvent, mkThirdPartyInviteEvent } from "../../test-utils";
import { LocalRoom } from "../../../src/models/LocalRoom";
import { findDMForUser } from "../../../src/utils/dm/findDMForUser";
import { getFunctionalMembers } from "../../../src/utils/room/getFunctionalMembers";
Expand All @@ -32,13 +32,15 @@ describe("findDMForUser", () => {
const userId2 = "@user2:example.com";
const userId3 = "@user3:example.com";
const botId = "@bot:example.com";
const thirdPartyId = "party@example.com";
let room1: Room;
let room2: LocalRoom;
let room3: Room;
let room4: Room;
let room5: Room;
let room6: Room;
const room7Id = "!room7:example.com";
let room7: Room;
const unknownRoomId = "!unknown:example.com";
let dmRoomMap: DMRoomMap;
let mockClient: MatrixClient;

Expand Down Expand Up @@ -89,6 +91,14 @@ describe("findDMForUser", () => {
makeMembershipEvent(room6.roomId, userId3, "join"),
]);

// room with pending third-party invite
room7 = new Room("!room7:example.com", mockClient, userId1);
room7.getMyMembership = () => "join";
room7.currentState.setStateEvents([
makeMembershipEvent(room7.roomId, userId1, "join"),
mkThirdPartyInviteEvent(thirdPartyId, "third-party", room7.roomId),
]);

mocked(mockClient.getRoom).mockImplementation((roomId: string) => {
return (
{
Expand All @@ -98,6 +108,7 @@ describe("findDMForUser", () => {
[room4.roomId]: room4,
[room5.roomId]: room5,
[room6.roomId]: room6,
[room7.roomId]: room7,
}[roomId] || null
);
});
Expand All @@ -113,14 +124,15 @@ describe("findDMForUser", () => {
room4.roomId,
room5.roomId,
room6.roomId,
room7Id, // this room does not exist in client
room7.roomId,
unknownRoomId, // this room does not exist in client
]),
),
} as unknown as DMRoomMap;
jest.spyOn(DMRoomMap, "shared").mockReturnValue(dmRoomMap);
mocked(dmRoomMap.getDMRoomsForUserId).mockImplementation((userId: string) => {
if (userId === userId1) {
return [room1.roomId, room2.roomId, room3.roomId, room4.roomId, room5.roomId, room7Id];
return [room1.roomId, room2.roomId, room3.roomId, room4.roomId, room5.roomId, unknownRoomId];
}

return [];
Expand Down Expand Up @@ -158,4 +170,8 @@ describe("findDMForUser", () => {

expect(findDMForUser(mockClient, userId3)).toBe(room6);
});

it("should find a room with a pending third-party invite", () => {
expect(findDMForUser(mockClient, thirdPartyId)).toBe(room7);
});
});