* Port over linkifyJS to shared-components. * Drop rubbish * update lock * quickfix test * drop group id * Modernize tests * Remove stories that aren't in use. * Complete working version * Add copyright * tidy up * update lock * Update snaps * update snap * undo change * remove unused * More test updates * fix typo * fix margin on preview * move margin block * snapupdate * prettier * cleanup a test mistake * Fixup sonar issues * Don't expose linkifyjs to applications, just provide helper functions. * Add story for documentation. * remove $ * Use a const * typo * cleanup var name * remove console line * Changes checkpoint * Convert to context * Revert unrelated change. * more cleanup * Add a test to cover ignoring incoming data elements * Make tests happy * Update tests for LinkedText * Underlines! * fix lock * remove unused linkify packages * import move * Remove mod to remove underline * undo * fix snap * another snapshot fix * Tidy up based on review. * fix story * Pass in args
59 lines
2.9 KiB
TypeScript
59 lines
2.9 KiB
TypeScript
/*
|
|
Copyright 2026 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
import { test, expect } from "../../element-web-test";
|
|
|
|
test.describe("Message links", () => {
|
|
test.use({
|
|
displayName: "Alice",
|
|
room: async ({ user, app, bot }, use) => {
|
|
const roomId = await app.client.createRoom({ name: "Test room" });
|
|
await use({ roomId });
|
|
},
|
|
});
|
|
for (const link of ["https://example.org", "example.org", "ftp://example.org"]) {
|
|
test(`should linkify a regular link '${link}'`, async ({ page, user, app, room }) => {
|
|
await page.goto(`#/room/${room.roomId}`);
|
|
// Needs to be unformatted so we test linkifing
|
|
await app.client.sendMessage(room.roomId, `Check out ${link}`);
|
|
const linkElement = page.locator(".mx_EventTile_last").getByRole("link", { name: link });
|
|
await app.timeline.scrollToBottom();
|
|
await expect(linkElement).toBeVisible();
|
|
});
|
|
}
|
|
test("should linkify a User ID", async ({ page, user, app, room }) => {
|
|
await page.goto(`#/room/${room.roomId}`);
|
|
// Needs to be unformatted so we test linkifing
|
|
await app.client.sendMessage(room.roomId, `Check out @bob:example.org`);
|
|
const linkElement = page.locator(".mx_EventTile_last").getByRole("link", { name: "@bob:example.org" });
|
|
await expect(linkElement).toHaveAttribute("href", `https://matrix.to/#/@bob:example.org`);
|
|
});
|
|
test("should linkify a Room alias", async ({ page, user, app, room }) => {
|
|
await page.goto(`#/room/${room.roomId}`);
|
|
// Needs to be unformatted so we test linkifing
|
|
await app.client.sendMessage(room.roomId, "Check out #aroom:example.org");
|
|
const linkElement = page.locator(".mx_EventTile_last").getByRole("link", { name: "#aroom:example.org" });
|
|
await expect(linkElement).toHaveAttribute("href", "https://matrix.to/#/#aroom:example.org");
|
|
});
|
|
test("should linkify text inside a URL preview", async ({ page, user, app, room }) => {
|
|
await page.route(/.*\/_matrix\/(client\/v1\/media|media\/v3)\/preview_url.*/, (route, request) => {
|
|
const requestedPage = new URL(request.url()).searchParams.get("url");
|
|
expect(requestedPage).toEqual("https://example.org/");
|
|
return route.fulfill({
|
|
json: {
|
|
"og:title": "A simple site",
|
|
"og:description": "And with a brief description containing https://example.org/another-link",
|
|
},
|
|
});
|
|
});
|
|
await page.goto(`#/room/${room.roomId}`);
|
|
await app.client.sendMessage(room.roomId, "Check out https://example.org/");
|
|
await expect(
|
|
page.locator(".mx_EventTile_last").getByRole("link", { name: "https://example.org/another-link" }),
|
|
).toBeVisible();
|
|
});
|
|
});
|