Extract findLinks into its own file and add tests

Tests were taken from 5a249c30b1/test/findLinks.js.
The underlying code is different but the tests are the same.
This commit is contained in:
Jérémie Astori 2017-04-17 23:28:35 -04:00 committed by Pavel Djundik
parent eb1360c3af
commit 5b4c00d8ca
3 changed files with 160 additions and 49 deletions

View file

@ -0,0 +1,53 @@
"use strict";
const URI = require("urijs");
const commonSchemes = [
"http", "https",
"ftp", "sftp",
"smb", "file",
"irc", "ircs",
"svn", "git",
"steam", "mumble", "ts3server",
"svn+ssh", "ssh",
];
function findLinks(text) {
let result = [];
let lastPosition = 0;
URI.withinString(text, function(url, start, end) {
// v-- fix: url was modified and does not match input string -> cant be mapped
if (text.indexOf(url, lastPosition) < 0) {
return;
}
// ^-- /fix: url was modified and does not match input string -> cant be mapped
// v-- fix: use prefered scheme
const parsed = URI(url);
const parsedScheme = parsed.scheme().toLowerCase();
const matchedScheme = commonSchemes.find(scheme => parsedScheme.endsWith(scheme));
if (matchedScheme) {
const prefix = parsedScheme.length - matchedScheme.length;
start += prefix;
url = url.slice(prefix);
}
// ^-- /fix: use prefered scheme
// URL matched, but does not start with a protocol, add it
if (!parsedScheme.length) {
url = "http://" + url;
}
result.push({
start: start,
end: end,
link: url
});
});
return result;
}
module.exports = findLinks;

View file

@ -1,59 +1,11 @@
"use strict"; "use strict";
const Handlebars = require("handlebars/runtime"); const Handlebars = require("handlebars/runtime");
const URI = require("urijs");
const parseStyle = require("./ircmessageparser/parseStyle"); const parseStyle = require("./ircmessageparser/parseStyle");
const findChannels = require("./ircmessageparser/findChannels"); const findChannels = require("./ircmessageparser/findChannels");
const findLinks = require("./ircmessageparser/findLinks");
const merge = require("./ircmessageparser/merge"); const merge = require("./ircmessageparser/merge");
const commonSchemes = [
"http", "https",
"ftp", "sftp",
"smb", "file",
"irc", "ircs",
"svn", "git",
"steam", "mumble", "ts3server",
"svn+ssh", "ssh",
];
function findLinks(text) {
let result = [];
let lastPosition = 0;
URI.withinString(text, function(url, start, end) {
// v-- fix: url was modified and does not match input string -> cant be mapped
if (text.indexOf(url, lastPosition) < 0) {
return;
}
// ^-- /fix: url was modified and does not match input string -> cant be mapped
// v-- fix: use prefered scheme
const parsed = URI(url);
const parsedScheme = parsed.scheme().toLowerCase();
const matchedScheme = commonSchemes.find(scheme => parsedScheme.endsWith(scheme));
if (matchedScheme) {
const prefix = parsedScheme.length - matchedScheme.length;
start += prefix;
url = url.slice(prefix);
}
// ^-- /fix: use prefered scheme
// URL matched, but does not start with a protocol, add it
if (!parsedScheme.length) {
url = "http://" + url;
}
result.push({
start: start,
end: end,
link: url
});
});
return result;
}
function createFragment(fragment) { function createFragment(fragment) {
let className = ""; let className = "";
if (fragment.bold) { if (fragment.bold) {

View file

@ -0,0 +1,106 @@
"use strict";
const expect = require("chai").expect;
const findLinks = require("../../../../../../client/js/libs/handlebars/ircmessageparser/findLinks");
describe("findLinks", () => {
it("should find url", () => {
const input = "irc://freenode.net/thelounge";
const expected = [{
start: 0,
end: 28,
link: "irc://freenode.net/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.github.io/ for more information";
const expected = [{
link: "https://thelounge.github.io/",
start: 8,
end: 36
}];
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 www. and odd surroundings", () => {
const input = ".:www.github.com:.";
const expected = [{
link: "http://www.github.com",
start: 2,
end: 16
}];
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);
});
});