/*
 * Copyright 2026 Element Creations 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", "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 NOT linkify a bare domain", 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 example.org`);
        const linkElement = page.locator(".mx_EventTile_last").getByRole("link", { name: "example.org" });
        await expect(linkElement).not.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();
    });
});
