From e8adbab368f52441bad0395c1ca1c8514931fd67 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sat, 28 Sep 2024 22:20:27 +0800 Subject: [PATCH] fix: lib functions related to URL/links --- lib/normalizeURL.ts | 4 +-- lib/url/validLink.ts | 8 ++--- test/validIP.test.ts | 80 ++++++++++++++++++++++++++++++++++++++++++ test/validLink.test.ts | 7 ++++ 4 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 test/validIP.test.ts diff --git a/lib/normalizeURL.ts b/lib/normalizeURL.ts index 8588ed6..67291f6 100644 --- a/lib/normalizeURL.ts +++ b/lib/normalizeURL.ts @@ -1,7 +1,7 @@ -export function normalizeURL(input: string): string { +export function normalizeURL(input: string, absolute: boolean = true): string { try { // try to create a URL object - const url = new URL(input, window.location.href); + const url = absolute ? new URL(input) : new URL(input, window.location.href); // if the URL is valid, return it return url.href; } catch (error) { diff --git a/lib/url/validLink.ts b/lib/url/validLink.ts index 6ffa85b..851d676 100644 --- a/lib/url/validLink.ts +++ b/lib/url/validLink.ts @@ -16,15 +16,15 @@ export default function validLink(link: string) { return false; } } + if (finalURL.host.endsWith(".")) return false; if ( validTLD(finalURL.host) || - isValidIPv6(finalURL.host.slice(1, finalURL.host.length - 1)) || - isValidIPv4(finalURL.host) + isValidIPv6(link.slice(1, finalURL.host.length - 1)) || + isValidIPv4(link) ) { return true; - } else { - return false; } + return false; } export function validTLD(domain: string): boolean { diff --git a/test/validIP.test.ts b/test/validIP.test.ts new file mode 100644 index 0000000..c9ad381 --- /dev/null +++ b/test/validIP.test.ts @@ -0,0 +1,80 @@ +import { describe, expect, test } from "bun:test"; +import { isValidIPv4, } from "../lib/url/validLink"; + +describe("Check if a string is a valid IPv4", () => { + test("Invalid IPv4 addresses - Missing part", () => { + expect(isValidIPv4("192.168.1")).toBe(false); + expect(isValidIPv4("1")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains non-digit characters", () => { + expect(isValidIPv4("192.168.1.a")).toBe(false); + expect(isValidIPv4("192.168.1.1a")).toBe(false); + expect(isValidIPv4("192.168.1.1.1")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains empty parts", () => { + expect(isValidIPv4("192.168.1.")).toBe(false); + expect(isValidIPv4("192..168.1")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains negative numbers", () => { + expect(isValidIPv4("192.168.-1.1")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains out-of-range numbers", () => { + expect(isValidIPv4("192.168.256.1")).toBe(false); + expect(isValidIPv4("192.168.1.256")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains multiple dots", () => { + expect(isValidIPv4("192.168..1.1")).toBe(false); + expect(isValidIPv4("192.168.1..1")).toBe(false); + }); + + test("Invalid IPv4 addresses - Empty string", () => { + expect(isValidIPv4("")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains special characters", () => { + expect(isValidIPv4("192.168.1.1!")).toBe(false); + expect(isValidIPv4("192.168.1.1 ")).toBe(false); + expect(isValidIPv4("192.168.1.1\t")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains non-ASCII characters", () => { + expect(isValidIPv4("192.168.1.1©")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains newline character", () => { + expect(isValidIPv4("192.168.1.1\n")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains multiple IP addresses", () => { + expect(isValidIPv4("192.168.1.1 192.168.1.2")).toBe(false); + }); + + test("Invalid IPv4 addresses - Contains IPv6 address", () => { + expect(isValidIPv4("2001:0db8:85a3:0000:0000:8a2e:0370:7334")).toBe(false); + }); + + test("Valid IPv4 addresses - Standard IP", () => { + expect(isValidIPv4("192.168.1.1")).toBe(true); + }); + + test("Valid IPv4 addresses - All zeros", () => { + expect(isValidIPv4("0.0.0.0")).toBe(true); + }); + + test("Valid IPv4 addresses - Maximum value", () => { + expect(isValidIPv4("255.255.255.255")).toBe(true); + }); + + test("Valid IPv4 addresses - Leading zero but valid", () => { + expect(isValidIPv4("192.000.001.001")).toBe(true); + }); + + test("Valid IPv4 addresses - Single digit parts", () => { + expect(isValidIPv4("1.2.3.4")).toBe(true); + }); +}); diff --git a/test/validLink.test.ts b/test/validLink.test.ts index 97e6a36..58e1aa1 100644 --- a/test/validLink.test.ts +++ b/test/validLink.test.ts @@ -26,6 +26,10 @@ describe("Check if a string is an accessible domain/URL/IP", () => { test("Invalid TLD with no protocol", () => { expect(validLink("www.example.notexist")).toBe(false); }); + test("Dot suffix", () => { + expect(validLink(".")).toBe(false); + expect(validLink("anything.")).toBe(false); + }); test("IPv4 without protocol", () => { expect(validLink("127.0.0.1")).toBe(true); }); @@ -38,6 +42,9 @@ describe("Check if a string is an accessible domain/URL/IP", () => { test("Not a valid host/URL.", () => { expect(validLink("weather")).toBe(false); }); + test("Not a valid IP", () => { + expect(validLink("1")).toBe(false); + }); }); // Reference: https://www.iana.org/domains/root/db