Add validation package #19

Merged
xbazzi merged 5 commits from issue-7 into master 2025-02-13 22:10:24 -07:00
4 changed files with 122 additions and 0 deletions
Showing only changes of commit d9be5a78c8 - Show all commits

View File

@ -0,0 +1,21 @@
name: Run Go Tests
on:
pull_request:
branches: [master]
jobs:
test:
name: Run Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.22'
- name: Run Tests
run: make test

3
Makefile Normal file
View File

@ -0,0 +1,3 @@
test:
@echo "Running tests for main and all packages"
go test ./...

View File

@ -0,0 +1,46 @@
package validation
import (
"errors"
neturl "net/url"
"strings"
)
// Errors
var (
ErrNotAUrl = errors.New("not a URL")
ErrIncorrectProtocol = errors.New("incorrect url protocol")
ErrServiceUnsupported = errors.New("not a URL")
)
// Music hosts that we support
var musicHosts = []string{
"youtube.com",
Review

www.youtube.com

`www.youtube.com`
}
func IsUrl(url string) (bool, *neturl.URL) {
parsed, err := neturl.ParseRequestURI(url)
return (err == nil), parsed
}
func IsMusicUrl(url string) (bool, error) {
isUrl, parsed := IsUrl(url)
if !isUrl {
return false, ErrNotAUrl
}
// If we have a scheme and it's not http/https we fail
if parsed.Scheme != "" && !strings.Contains(parsed.Scheme, "http") {
return false, ErrIncorrectProtocol
}
for _, host := range musicHosts {
if host == parsed.Host {
return true, nil
}
}
return false, ErrServiceUnsupported
}

View File

@ -0,0 +1,52 @@
package validation
import "testing"
func TestIsUrl(t *testing.T) {
is, _ := IsUrl("definitely not a url")
if is {
t.Error("Non-url text detected as URL")
}
is, _ = IsUrl("https://example.com")
if !is {
t.Error("URL not detected as URL")
}
}
func TestIsMusicUrlErrors(t *testing.T) {
// Not a URL
is, err := IsMusicUrl("not a url")
if is {
t.Error("Non-URL was detected as url")
}
if err != ErrNotAUrl {
t.Error("Incorrect error returned for Non-url link")
}
// Incorrect protocol
is, err = IsMusicUrl("ssh://youtube.com")
if is {
t.Error("Incorrect protocol was not caught")
}
if err != ErrIncorrectProtocol {
t.Error("Incorrect error returned for incorrect protocol")
}
// Unsupported service
is, err = IsMusicUrl("https://www.deezer.com/")
if is {
t.Error("Unsupported service was not caught")
}
if err != ErrServiceUnsupported {
t.Error("Unsupported service did not return the correct error")
}
}