From 4e8fb65a2ea6d3938dc35425f5c0279ce5bb7a81 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 3 Dec 2020 08:49:51 -0500 Subject: [PATCH] fix URL validator, add some tests (#1627) Signed-off-by: Sebastian Malton --- .../input/__tests__/input_validators.test.ts | 95 +++++++++++-------- .../components/input/input_validators.ts | 8 +- 2 files changed, 65 insertions(+), 38 deletions(-) diff --git a/src/renderer/components/input/__tests__/input_validators.test.ts b/src/renderer/components/input/__tests__/input_validators.test.ts index 7bf08ffbdb..babc041d1d 100644 --- a/src/renderer/components/input/__tests__/input_validators.test.ts +++ b/src/renderer/components/input/__tests__/input_validators.test.ts @@ -1,48 +1,69 @@ -import { isEmail, systemName } from "../input_validators"; +import { isEmail, isUrl, systemName } from "../input_validators"; + +type TextValidationCase = [string, boolean]; describe("input validation tests", () => { describe("isEmail tests", () => { - it("should be valid", () => { - expect(isEmail.validate("abc@news.com")).toBe(true); - expect(isEmail.validate("abc@news.co.uk")).toBe(true); - expect(isEmail.validate("abc1.3@news.co.uk")).toBe(true); - expect(isEmail.validate("abc1.3@news.name")).toBe(true); - }); + const tests: TextValidationCase[] = [ + ["abc@news.com", true], + ["abc@news.co.uk", true], + ["abc1.3@news.co.uk", true], + ["abc1.3@news.name", true], + ["@news.com", false], + ["abcnews.co.uk", false], + ["abc1.3@news", false], + ["abc1.3@news.name.a.b.c.d.d", false], + ]; - it("should be invalid", () => { - expect(isEmail.validate("@news.com")).toBe(false); - expect(isEmail.validate("abcnews.co.uk")).toBe(false); - expect(isEmail.validate("abc1.3@news")).toBe(false); - expect(isEmail.validate("abc1.3@news.name.a.b.c.d.d")).toBe(false); + it.each(tests)("validate %s", (input, output) => { + expect(isEmail.validate(input)).toBe(output); + }); + }); + + describe("isUrl tests", () => { + const cases: TextValidationCase[] = [ + ["https://github-production-registry-package-file-4f11e5.s3.amazonaws.com/307985088/68bbbf00-309f-11eb-8457-a15e4efe9e77?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20201127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201127T123754Z&X-Amz-Expires=300&X-Amz-Signature=9b8167f00685a20d980224d397892195abc187cdb2934cefb79edcd7ec600f78&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=0&response-content-disposition=filename%3Dstarboard-lens-extension-0.0.1-alpha.1-npm.tgz&response-content-type=application%2Foctet-stream", true], + ["google.ca", false], + ["", false], + [".", false], + ["google.askdgjkhsadjkhdas.dsakljsd", false], + ["https://google.com", true], + ["https://example.org", true], + ["https://www.example.org", true], + ]; + + it.each(cases)("validate %s", (input, output) => { + expect(isUrl.validate(input)).toBe(output); }); }); describe("systemName tests", () => { - it("should be valid", () => { - expect(systemName.validate("a")).toBe(true); - expect(systemName.validate("ab")).toBe(true); - expect(systemName.validate("abc")).toBe(true); - expect(systemName.validate("1")).toBe(true); - expect(systemName.validate("12")).toBe(true); - expect(systemName.validate("123")).toBe(true); - expect(systemName.validate("1a2")).toBe(true); - expect(systemName.validate("1-2")).toBe(true); - expect(systemName.validate("1---------------2")).toBe(true); - expect(systemName.validate("1---------------2.a")).toBe(true); - expect(systemName.validate("1---------------2.a.1")).toBe(true); - expect(systemName.validate("1---------------2.9-a.1")).toBe(true); - }); + const tests: TextValidationCase[] = [ + ["a", true], + ["ab", true], + ["abc", true], + ["1", true], + ["12", true], + ["123", true], + ["1a2", true], + ["1-2", true], + ["1---------------2", true], + ["1---------------2.a", true], + ["1---------------2.a.1", true], + ["1---------------2.9-a.1", true], + ["", false], + ["-", false], + [".", false], + ["as.", false], + [".asd", false], + ["a.-", false], + ["a.1-", false], + ["o.2-2.", false], + ["o.2-2....", false], + ]; - it("should be invalid", () => { - expect(systemName.validate("")).toBe(false); - expect(systemName.validate("-")).toBe(false); - expect(systemName.validate(".")).toBe(false); - expect(systemName.validate("as.")).toBe(false); - expect(systemName.validate(".asd")).toBe(false); - expect(systemName.validate("a.-")).toBe(false); - expect(systemName.validate("a.1-")).toBe(false); - expect(systemName.validate("o.2-2.")).toBe(false); - expect(systemName.validate("o.2-2....")).toBe(false); + it.each(tests)("validate %s", (input, output) => { + expect(systemName.validate(input)).toBe(output); }); }); -}); \ No newline at end of file +}); diff --git a/src/renderer/components/input/input_validators.ts b/src/renderer/components/input/input_validators.ts index 53ec426bbb..2727402ce5 100644 --- a/src/renderer/components/input/input_validators.ts +++ b/src/renderer/components/input/input_validators.ts @@ -40,7 +40,13 @@ export const isNumber: InputValidator = { export const isUrl: InputValidator = { condition: ({ type }) => type === "url", message: () => _i18n._(t`Wrong url format`), - validate: value => !!value.match(/^http(s)?:\/\/\w+(\.\w+)*(:[0-9]+)?\/?(\/[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]*)*$/), + validate: value => { + try { + return Boolean(new URL(value)); + } catch (err) { + return false; + } + }, }; export const isPath: InputValidator = {