thelounge/test/shared/findLinks.ts
Reto Brunner dd24cb1300 linkify: simplify noscheme detection logic
Overriding the built in is poor form, as this prevents adding
a new type handler with its own normalize handler.

We only ever want to override protocol-less URLs to http, so
we just do so explicitly in the "//" schema normalizer.

This also means that we don't need all that type conversion dance,
we simply set the schema to null when we patch it and filter on the
schema directly
2024-01-21 21:18:09 +01:00

459 lines
8.9 KiB
TypeScript

import {expect} from "chai";
import {findLinks, findLinksWithSchema} from "../../shared/linkify";
describe("findLinks", () => {
it("should find url", () => {
const input = "irc://irc.example.com/thelounge";
const expected = [
{
start: 0,
end: 31,
link: "irc://irc.example.com/thelounge",
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find urls with www", () => {
const input = "www.nooooooooooooooo.com";
const expected = [
{
start: 0,
end: 24,
link: "http://www.nooooooooooooooo.com",
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find urls in strings", () => {
const input = "look at https://thelounge.chat/ for more information";
const expected = [
{
link: "https://thelounge.chat/",
start: 8,
end: 31,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find urls in strings starting with www", () => {
const input = "use www.duckduckgo.com for privacy reasons";
const expected = [
{
link: "http://www.duckduckgo.com",
start: 4,
end: 22,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find urls with odd surroundings", () => {
const input = "<https://theos.kyriasis.com/~kyrias/stats/archlinux.html>";
const expected = [
{
link: "https://theos.kyriasis.com/~kyrias/stats/archlinux.html",
start: 1,
end: 56,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find urls with starting with http:// and odd surroundings", () => {
const input = ".:http://www.github.com:. .:www.github.com:.";
const expected = [
{
link: "http://www.github.com",
start: 2,
end: 23,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should not find urls", () => {
const input = "text www. text";
const expected = [];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should handle multiple www. correctly", () => {
const input = "www.www.test.com";
const expected = [
{
link: "http://www.www.test.com",
start: 0,
end: 16,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find domains without www. but valid tld", () => {
const input = "google.com google.lv google.museum";
const expected = [
{
link: "http://google.com",
start: 0,
end: 10,
},
{
link: "http://google.lv",
start: 11,
end: 20,
},
{
link: "http://google.museum",
start: 21,
end: 34,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find .onion domains", () => {
const input = "facebookcorewwwi.onion/test?url";
const expected = [
{
link: "http://facebookcorewwwi.onion/test?url",
start: 0,
end: 31,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should not consider invalid TLDs as domains", () => {
const input = "google.wtfgugl google.xx www.google.wtfgugl www.google.xx";
const expected = [];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should consider invalid TLDs as domains if protocol is specified", () => {
const input =
"http://google.wtfgugl http://google.xx http://www.google.wtfgugl http://www.google.xx";
const expected = [
{
link: "http://google.wtfgugl",
start: 0,
end: 21,
},
{
link: "http://google.xx",
start: 22,
end: 38,
},
{
link: "http://www.google.wtfgugl",
start: 39,
end: 64,
},
{
link: "http://www.google.xx",
start: 65,
end: 85,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should correctly stop at punctuation", () => {
// Issue #2351
const input =
"https://en.wikipedia.org/wiki/Dig! " +
"https://en.wikipedia.org/wiki/Dig? " +
"https://en.wikipedia.org/wiki/Dig. " +
"https://www.google.com* " +
"https://www.google.com/test* " +
"https://www.google.com@ " +
"https://www.google.com/test@ " +
"https://www.google.com! ";
const expected = [
{
link: "https://en.wikipedia.org/wiki/Dig",
start: 0,
end: 33,
},
{
link: "https://en.wikipedia.org/wiki/Dig",
start: 35,
end: 68,
},
{
link: "https://en.wikipedia.org/wiki/Dig",
start: 70,
end: 103,
},
{
link: "https://www.google.com",
start: 105,
end: 127,
},
{
link: "https://www.google.com/test*",
start: 129,
end: 157,
},
{
link: "https://www.google.com",
start: 158,
end: 180,
},
{
link: "https://www.google.com/test@",
start: 182,
end: 210,
},
{
link: "https://www.google.com",
start: 211,
end: 233,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should correctly stop at apostrophe", () => {
const input = "https://www.google.com's www.google.com's google.com's"; // Issue #1302
const expected = [
{
link: "https://www.google.com",
start: 0,
end: 22,
},
{
link: "http://www.google.com",
start: 25,
end: 39,
},
{
link: "http://google.com",
start: 42,
end: 52,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("does not find invalid urls", () => {
const input = "www.example.com ssh://-oProxyCommand=whois"; // Issue #1412
const expected = [
{
start: 0,
end: 15,
link: "http://www.example.com",
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
const input2 = "www.example.com http://root:'some%pass'@hostname/database"; // Issue #1618
const expected2 = [
{
start: 0,
end: 15,
link: "http://www.example.com",
},
{
start: 16,
end: 57,
link: "http://root:'some%pass'@hostname/database",
},
];
const actual2 = findLinks(input2);
expect(actual2).to.deep.equal(expected2);
});
it("keeps parsing after finding an invalid url", () => {
const input = "www.example.com http://a:%p@c http://thelounge.chat";
const expected = [
{
start: 0,
end: 15,
link: "http://www.example.com",
},
{
start: 16,
end: 29,
link: "http://a:%p@c",
},
{
start: 30,
end: 51,
link: "http://thelounge.chat",
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should add protocol to protocol-aware urls", () => {
const input = "//example.com";
const expected = [
{
link: "http://example.com",
start: 0,
end: 13,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should parse mailto links", () => {
const input = "mail@example.com mailto:mail@example.org";
const expected = [
{
link: "mailto:mail@example.com",
start: 0,
end: 16,
},
{
link: "mailto:mail@example.org",
start: 17,
end: 40,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should not return urls with no schema if flag is specified", () => {
const input = "https://example.global //example.com http://example.group example.py";
const expected = [
{
link: "https://example.global",
start: 0,
end: 22,
},
{
end: 57,
link: "http://example.group",
start: 37,
},
];
const actual = findLinksWithSchema(input);
expect(actual).to.deep.equal(expected);
});
it("should use http for protocol-less URLs", () => {
const input = "//example.com";
const expected = [
{
link: "http://example.com",
start: 0,
end: 13,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find web+ schema urls", () => {
const input = "web+ap://instance.example/@Example web+whatever://example.com?some=value";
const expected = [
{
link: "web+ap://instance.example/@Example",
start: 0,
end: 34,
},
{
link: "web+whatever://example.com?some=value",
start: 35,
end: 72,
},
];
const actual = findLinks(input);
expect(actual).to.deep.equal(expected);
});
it("should find web+ schema urls if scheme required flag is specified", () => {
const input =
"web+ap://instance.example/@Example web+Whatever://example.com?some=value example.org";
const expected = [
{
link: "web+ap://instance.example/@Example",
start: 0,
end: 34,
},
{
link: "web+Whatever://example.com?some=value",
start: 35,
end: 72,
},
];
const actual = findLinksWithSchema(input);
expect(actual).to.deep.equal(expected);
});
it("should disregard invalid web+ links", () => {
const input = "web+://whatever.example";
const actual = findLinksWithSchema(input);
expect(actual).to.be.empty;
});
});