Include the url preview bundle field in the devtools timeline event editor (#34289)
* added urlpreview field in event editor * oxfmt * claude wrote test! * handled reviews * oxlint fix * formatting * removed useless stubclient
This commit is contained in:
@@ -199,6 +199,9 @@ export const TimelineEventEditor: React.FC<IEditorProps> = ({ mxEvent, onBack })
|
|||||||
rel_type: "m.replace",
|
rel_type: "m.replace",
|
||||||
event_id: getBaseEventId(mxEvent),
|
event_id: getBaseEventId(mxEvent),
|
||||||
},
|
},
|
||||||
|
...("com.beeper.linkpreviews" in originalContent
|
||||||
|
? { "com.beeper.linkpreviews": originalContent["com.beeper.linkpreviews"] }
|
||||||
|
: {}),
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultContent = stringify(newContent);
|
defaultContent = stringify(newContent);
|
||||||
|
|||||||
@@ -8,54 +8,95 @@ Please see LICENSE files in the repository root for full details.
|
|||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { render } from "jest-matrix-react";
|
import { render } from "jest-matrix-react";
|
||||||
import { Room, PendingEventOrdering } from "matrix-js-sdk/src/matrix";
|
import {
|
||||||
|
Room,
|
||||||
|
PendingEventOrdering,
|
||||||
|
EventType,
|
||||||
|
MsgType,
|
||||||
|
type MatrixClient,
|
||||||
|
type MatrixEvent,
|
||||||
|
} from "matrix-js-sdk/src/matrix";
|
||||||
|
|
||||||
import MatrixClientContext from "../../../../../../src/contexts/MatrixClientContext";
|
import MatrixClientContext from "../../../../../../src/contexts/MatrixClientContext";
|
||||||
import { MatrixClientPeg } from "../../../../../../src/MatrixClientPeg";
|
import { createTestClient, mkEvent } from "../../../../../test-utils";
|
||||||
import { stubClient } from "../../../../../test-utils";
|
|
||||||
import { DevtoolsContext } from "../../../../../../src/components/views/dialogs/devtools/BaseTool";
|
import { DevtoolsContext } from "../../../../../../src/components/views/dialogs/devtools/BaseTool";
|
||||||
import { TimelineEventEditor } from "../../../../../../src/components/views/dialogs/devtools/Event";
|
import { TimelineEventEditor } from "../../../../../../src/components/views/dialogs/devtools/Event";
|
||||||
|
|
||||||
describe("<EventEditor />", () => {
|
function renderTimelineEventEditor(
|
||||||
beforeEach(() => {
|
cli: MatrixClient,
|
||||||
stubClient();
|
{ mxEvent, threadRootId }: { mxEvent?: MatrixEvent; threadRootId?: string } = {},
|
||||||
});
|
): ReturnType<typeof render> {
|
||||||
|
function Wrapper({ children }: { children: React.ReactNode }): React.ReactNode {
|
||||||
it("should render", () => {
|
return (
|
||||||
const cli = MatrixClientPeg.safeGet();
|
|
||||||
const { asFragment } = render(
|
|
||||||
<MatrixClientContext.Provider value={cli}>
|
<MatrixClientContext.Provider value={cli}>
|
||||||
<DevtoolsContext.Provider
|
<DevtoolsContext.Provider
|
||||||
value={{
|
value={{
|
||||||
room: new Room("!roomId", cli, "@alice:example.com", {
|
room: new Room("!roomId", cli, "@alice:example.com", {
|
||||||
pendingEventOrdering: PendingEventOrdering.Detached,
|
pendingEventOrdering: PendingEventOrdering.Detached,
|
||||||
}),
|
}),
|
||||||
|
threadRootId,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<TimelineEventEditor onBack={() => {}} />
|
{children}
|
||||||
</DevtoolsContext.Provider>
|
</DevtoolsContext.Provider>
|
||||||
</MatrixClientContext.Provider>,
|
</MatrixClientContext.Provider>
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return render(<TimelineEventEditor mxEvent={mxEvent} onBack={() => {}} />, { wrapper: Wrapper });
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("<EventEditor />", () => {
|
||||||
|
it("should render", () => {
|
||||||
|
const cli = createTestClient();
|
||||||
|
const { asFragment } = renderTimelineEventEditor(cli);
|
||||||
expect(asFragment()).toMatchSnapshot();
|
expect(asFragment()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should preserve the com.beeper.linkpreviews field when editing an event", () => {
|
||||||
|
const cli = createTestClient();
|
||||||
|
const linkPreviews = [{ "og:title": "Example", "matrix:image:size": 1234, "og:url": "https://example.com" }];
|
||||||
|
const mxEvent = mkEvent({
|
||||||
|
event: true,
|
||||||
|
type: EventType.RoomMessage,
|
||||||
|
room: "!roomId",
|
||||||
|
user: "@alice:example.com",
|
||||||
|
content: {
|
||||||
|
"body": "https://example.com",
|
||||||
|
"msgtype": MsgType.Text,
|
||||||
|
"com.beeper.linkpreviews": linkPreviews,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { getByLabelText } = renderTimelineEventEditor(cli, { mxEvent });
|
||||||
|
const content = getByLabelText("Event Content") as HTMLTextAreaElement;
|
||||||
|
expect(JSON.parse(content.value)["com.beeper.linkpreviews"]).toEqual(linkPreviews);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should omit the com.beeper.linkpreviews field when the edited event has none", () => {
|
||||||
|
const cli = createTestClient();
|
||||||
|
const mxEvent = mkEvent({
|
||||||
|
event: true,
|
||||||
|
type: EventType.RoomMessage,
|
||||||
|
room: "!roomId",
|
||||||
|
user: "@alice:example.com",
|
||||||
|
content: {
|
||||||
|
body: "hello world",
|
||||||
|
msgtype: MsgType.Text,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { getByLabelText } = renderTimelineEventEditor(cli, { mxEvent });
|
||||||
|
const content = getByLabelText("Event Content") as HTMLTextAreaElement;
|
||||||
|
expect(JSON.parse(content.value)).not.toHaveProperty("com.beeper.linkpreviews");
|
||||||
|
});
|
||||||
|
|
||||||
describe("thread context", () => {
|
describe("thread context", () => {
|
||||||
it("should pre-populate a thread relationship", () => {
|
it("should pre-populate a thread relationship", () => {
|
||||||
const cli = MatrixClientPeg.safeGet();
|
const cli = createTestClient();
|
||||||
const { asFragment } = render(
|
const { asFragment } = renderTimelineEventEditor(cli, {
|
||||||
<MatrixClientContext.Provider value={cli}>
|
threadRootId: "$this_is_a_thread_id",
|
||||||
<DevtoolsContext.Provider
|
});
|
||||||
value={{
|
|
||||||
room: new Room("!roomId", cli, "@alice:example.com", {
|
|
||||||
pendingEventOrdering: PendingEventOrdering.Detached,
|
|
||||||
}),
|
|
||||||
threadRootId: "$this_is_a_thread_id",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TimelineEventEditor onBack={() => {}} />
|
|
||||||
</DevtoolsContext.Provider>
|
|
||||||
</MatrixClientContext.Provider>,
|
|
||||||
);
|
|
||||||
expect(asFragment()).toMatchSnapshot();
|
expect(asFragment()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user