From 9ca0d93a01d8486f08f301bb67bcd163f26a78a6 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Sat, 8 May 2021 19:18:45 +0530 Subject: [PATCH] Add tests for linkify Signed-off-by: RMidhunSuresh --- src/domain/Linkifier.js | 116 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/src/domain/Linkifier.js b/src/domain/Linkifier.js index a429c8d3..0074e58c 100644 --- a/src/domain/Linkifier.js +++ b/src/domain/Linkifier.js @@ -55,3 +55,119 @@ export class Linkifier { return this._message; } } + +export function tests() { + + function linkify(text) { + const obj = new Linkifier(text); + return obj.linkify(); + } + + function test(assert, input, output) { + output = new MessageObjectFormat(output); + input = linkify(input); + assert.deepEqual(input, output); + } + + function testLink(assert, link, expectFail = false) { + const input = link; + const output = expectFail ? [{ type: "text", text: input }] : + [{ type: "link", url: input, text: input }]; + test(assert, input, output); + } + + return { + // Tests for text + "Text only": assert => { + const input = "This is a sentence"; + const output = [{ type: "text", text: input }]; + test(assert, input, output); + }, + + "Text with newline": assert => { + const input = "This is a sentence.\nThis is another sentence."; + const output = [ + { type: "text", text: "This is a sentence." }, + { type: "newline" }, + { type: "text", text: "This is another sentence." } + ]; + test(assert, input, output); + }, + + "Text with newline & trailing newline": assert => { + const input = "This is a sentence.\nThis is another sentence.\n"; + const output = [ + { type: "text", text: "This is a sentence." }, + { type: "newline" }, + { type: "text", text: "This is another sentence." }, + { type: "newline" } + ]; + test(assert, input, output); + }, + + // Tests for links + "Link with host": assert => { + testLink(assert, "https://matrix.org"); + }, + + "Link with host & path": assert => { + testLink(assert, "https://matrix.org/docs/develop"); + }, + + "Link with host & fragment": assert => { + testLink(assert, "https://matrix.org#test"); + }, + + "Link with host & query": assert => { + testLink(assert, "https://matrix.org/?foo=bar"); + }, + + "Complex link": assert => { + const link = "https://www.foobar.com/url?sa=t&rct=j&q=&esrc=s&source" + + "=web&cd=&cad=rja&uact=8&ved=2ahUKEwjyu7DJ-LHwAhUQyzgGHc" + + "OKA70QFjAAegQIBBAD&url=https%3A%2F%2Fmatrix.org%2Fdocs%" + + "2Fprojects%2Fclient%2Felement%2F&usg=AOvVaw0xpENrPHv_R-" + + "ERkyacR2Bd"; + testLink(assert, link); + }, + + "Localhost link": assert => { + testLink(assert, "http://localhost"); + testLink(assert, "http://localhost:3000"); + }, + + "IPV4 link": assert => { + testLink(assert, "https://192.0.0.1"); + testLink(assert, "https://250.123.67.23:5924"); + }, + + "IPV6 link": assert => { + testLink(assert, "http://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]"); + testLink(assert, "http://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:7000"); + }, + + "Missing scheme must not linkify": assert => { + testLink(assert, "matrix.org/foo/bar", true); + }, + + "Punctuation at end of link must not linkify": assert => { + const link = "https://foo.bar/?nenjil=lal810"; + const end = ".,? "; + for (const char of end) { + const out = [{ type: "link", url: link, text: link }, { type: "text", text: char }]; + test(assert, link + char, out); + } + }, + + "Unicode in hostname must not linkify": assert => { + const link = "https://foo.bar\uD83D\uDE03.com"; + const out = [{ type: "link", url: "https://foo.bar", text: "https://foo.bar" }, + { type: "text", text: "\uD83D\uDE03.com" }]; + test(assert, link, out); + }, + + "Link with unicode only after / must linkify": assert => { + testLink(assert, "https://foo.bar.com/\uD83D\uDE03"); + } + }; +}