From a31f5d500a573bdb1353239244048160c6c6c1f6 Mon Sep 17 00:00:00 2001 From: Aneurin Barker Snook Date: Sun, 26 Nov 2023 12:00:15 +0000 Subject: [PATCH] add url validator --- url.go | 17 +++++++++++++++++ url_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 url.go create mode 100644 url_test.go diff --git a/url.go b/url.go new file mode 100644 index 0000000..ff71b8c --- /dev/null +++ b/url.go @@ -0,0 +1,17 @@ +package validate + +import "net/url" + +// Validation error. +var ( + ErrInvalidURL Error = NewError("invalid URL") +) + +// URL validates a URL. +func URL(value string) error { + if _, err := url.ParseRequestURI(value); err != nil { + return ErrInvalidURL + } + + return nil +} diff --git a/url_test.go b/url_test.go new file mode 100644 index 0000000..d788fc3 --- /dev/null +++ b/url_test.go @@ -0,0 +1,31 @@ +package validate + +import ( + "errors" + "testing" +) + +func TestURL(t *testing.T) { + type TestCase struct { + Input string + Err error + } + + testCases := []TestCase{ + {Input: "http://example.com"}, + {Input: "http://subdomain.example.com"}, + {Input: "http://www.example.com/some-page.html"}, + {Input: "subdomain.com", Err: ErrInvalidURL}, + {Input: "not a url", Err: ErrInvalidURL}, + } + + for n, tc := range testCases { + t.Logf("(%d) Testing %q", n, tc.Input) + + err := URL(tc.Input) + + if !errors.Is(err, tc.Err) { + t.Errorf("Expected error %v, got %v", tc.Err, err) + } + } +}