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

Fix checkForPreJoinUISI for thread roots #9803

Merged
merged 8 commits into from
Dec 21, 2022
30 changes: 16 additions & 14 deletions test/components/structures/TimelinePanel-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

import { render, RenderResult } from "@testing-library/react";
import { render, RenderResult, waitFor, screen } from "@testing-library/react";
// eslint-disable-next-line deprecate/import
import { mount, ReactWrapper } from "enzyme";
import { MessageEvent } from "matrix-events-sdk";
Expand Down Expand Up @@ -61,9 +61,9 @@ const newReceipt = (eventId: string, userId: string, readTs: number, fullyReadTs
};

const getProps = (room: Room, events: MatrixEvent[]): TimelinePanel["props"] => {
const timelineSet = room.getUnfilteredTimelineSet?.() ?? ({ room: room as Room } as EventTimelineSet);
const timelineSet = { room: room as Room } as EventTimelineSet;
const timeline = new EventTimeline(timelineSet);
events.forEach((event) => timeline.addEvent(event, true));
events.forEach((event) => timeline.addEvent(event, { toStartOfTimeline: true }));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A side-issue which should be addressed elsewhere, but this will reduce the order of events in the resultant timeline, which feels pretty counter-intuitive.

timelineSet.getLiveTimeline = () => timeline;
timelineSet.getTimelineForEvent = () => timeline;
timelineSet.getPendingEvents = () => events;
Expand Down Expand Up @@ -433,7 +433,7 @@ describe("TimelinePanel", () => {
// @ts-ignore
thread.fetchEditsWhereNeeded = () => Promise.resolve();
await thread.addEvent(reply1, true);
await allThreads.getLiveTimeline().addEvent(thread.rootEvent!, true);
await allThreads.getLiveTimeline().addEvent(thread.rootEvent!, { toStartOfTimeline: true });
const replyToEvent = jest.spyOn(thread, "replyToEvent", "get");

const dom = render(
Expand Down Expand Up @@ -479,7 +479,7 @@ describe("TimelinePanel", () => {
// @ts-ignore
realThread.fetchEditsWhereNeeded = () => Promise.resolve();
await realThread.addEvent(reply1, true);
await allThreads.getLiveTimeline().addEvent(realThread.rootEvent!, true);
await allThreads.getLiveTimeline().addEvent(realThread.rootEvent!, { toStartOfTimeline: true });
const replyToEvent = jest.spyOn(realThread, "replyToEvent", "get");

// @ts-ignore
Expand Down Expand Up @@ -517,7 +517,7 @@ describe("TimelinePanel", () => {
});
});

it("renders when the last message is an undecryptable thread root", () => {
it("renders when the last message is an undecryptable thread root", async () => {
jest.spyOn(SettingsStore, "getValue").mockImplementation((name) => name === "feature_threadstable");

const client = MatrixClientPeg.get();
Expand All @@ -527,12 +527,11 @@ describe("TimelinePanel", () => {
const authorId = client.getUserId()!;
const room = new Room("roomId", client, authorId, {
lazyLoadMembers: false,
pendingEventOrdering: PendingEventOrdering.Detached,
});

const events = mockEvents(room);
const props = {
...getProps(room, events),
};
const timelineSet = room.getUnfilteredTimelineSet();

const { rootEvent } = mkThread({
room,
Expand All @@ -543,14 +542,16 @@ describe("TimelinePanel", () => {

events.push(rootEvent);

events.forEach((event) => timelineSet.getLiveTimeline().addEvent(event, { toStartOfTimeline: true }));

const roomMembership = mkMembership({
mship: "join",
prevMship: "join",
user: authorId,
room: room.roomId,
event: true,
skey: "123",
});
roomMembership.event.state_key = "123";

events.push(roomMembership);

Expand All @@ -560,8 +561,8 @@ describe("TimelinePanel", () => {
const roomState = new RoomState(room.roomId);
jest.spyOn(roomState, "getMember").mockReturnValue(member);

jest.spyOn(props.timelineSet.getLiveTimeline(), "getState").mockReturnValue(roomState);
props.timelineSet.addLiveEvent(roomMembership, {});
jest.spyOn(timelineSet.getLiveTimeline(), "getState").mockReturnValue(roomState);
timelineSet.addEventToTimeline(roomMembership, timelineSet.getLiveTimeline(), { toStartOfTimeline: false });

for (const event of events) {
jest.spyOn(event, "isDecryptionFailure").mockReturnValue(true);
Expand All @@ -570,10 +571,11 @@ describe("TimelinePanel", () => {

const { container } = render(
<MatrixClientContext.Provider value={client}>
<TimelinePanel {...props} />
<TimelinePanel timelineSet={timelineSet} manageReadReceipts={true} sendReadReceiptOnLoad={true} />
</MatrixClientContext.Provider>,
);

expect(container.querySelectorAll(".mx_EventTile")).toHaveLength(5);
await waitFor(() => expect(screen.queryByRole("progressbar")).toBeNull());
await waitFor(() => expect(container.querySelector(".mx_RoomView_MessageList")).not.toBeEmptyDOMElement());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this feels a bit brittle: checking that there are EventTiles felt much more robust.

});
});