Files
karma/internal/uri/urls_test.go
2025-09-04 13:59:00 +01:00

170 lines
4.0 KiB
Go

package uri_test
import (
"testing"
"github.com/prymitive/karma/internal/uri"
)
type joinURLTest struct {
base string
sub string
url string
isValid bool
}
var joinURLTests = []joinURLTest{
{
base: "http://localhost",
sub: "/sub",
url: "http://localhost/sub",
isValid: true,
},
{
base: "http://localhost",
sub: "/sub/",
url: "http://localhost/sub",
isValid: true,
},
{
base: "http://am.example.com",
sub: "/api/v2/alerts",
url: "http://am.example.com/api/v2/alerts",
isValid: true,
},
{
base: "%gh&%ij",
sub: "/a + b",
url: "",
isValid: false,
},
}
func TestJoinURL(t *testing.T) {
for _, testCase := range joinURLTests {
url, err := uri.JoinURL(testCase.base, testCase.sub)
if err != nil && testCase.isValid {
t.Errorf("joinURL(%v, %v) failed: %s", testCase.base, testCase.sub, err.Error())
}
if err == nil && !testCase.isValid {
t.Errorf("expected error for '%s' and '%s' but got '%s'", testCase.base, testCase.sub, url)
}
if url != testCase.url {
t.Errorf("Invalid joined url from '%s' + '%s', expected '%s', got '%s'", testCase.base, testCase.sub, testCase.url, url)
}
}
}
type sanitizeURITest struct {
raw string
sanitized string
}
var sanitizeURITests = []sanitizeURITest{
{
raw: "http://alertmanager.example.com",
sanitized: "http://alertmanager.example.com",
},
{
raw: "http://alertmanager.example.com/foo",
sanitized: "http://alertmanager.example.com/foo",
},
{
raw: "http://user:pass@alertmanager.example.com",
sanitized: "http://user:xxx@alertmanager.example.com",
},
{
raw: "http://user:pass@alertmanager.example.com/foo",
sanitized: "http://user:xxx@alertmanager.example.com/foo",
},
{
raw: "https://alertmanager.example.com",
sanitized: "https://alertmanager.example.com",
},
{
raw: "https://alertmanager.example.com/foo",
sanitized: "https://alertmanager.example.com/foo",
},
{
raw: "https://user:pass@alertmanager.example.com",
sanitized: "https://user:xxx@alertmanager.example.com",
},
{
raw: "https://user:pass@alertmanager.example.com/foo",
sanitized: "https://user:xxx@alertmanager.example.com/foo",
},
{
raw: "%gh&%ij",
sanitized: "%gh&%ij",
},
}
func TestSanitizedURI(t *testing.T) {
for _, test := range sanitizeURITests {
s := uri.SanitizeURI(test.raw)
if s != test.sanitized {
t.Errorf("Sanitized URI mismatch, expected '%s' => '%s', got '%s'",
test.raw, test.sanitized, s)
}
}
}
func TestHeadersForBasicAuth(t *testing.T) {
type headersTest struct {
uri string
value string
isSet bool
}
testCases := []headersTest{
{
uri: "http://localhost.com",
isSet: false,
},
{
uri: "http://user@localhost.com",
isSet: false,
},
{
uri: "http://user:pass@localhost.com",
isSet: true,
value: "Basic dXNlcjpwYXNz",
},
{
uri: "%gh&%ij",
isSet: false,
},
}
for _, test := range testCases {
headers := uri.HeadersForBasicAuth(test.uri)
value, isSet := headers["Authorization"]
if isSet != test.isSet {
t.Errorf("[%s] expected Authorization header: %v, was set: %v", test.uri, test.isSet, isSet)
}
if value != test.value {
t.Errorf("[%s] expected Authorization value: %s, value: %s", test.uri, test.value, value)
}
}
}
func TestURIWithoutUserinfo(t *testing.T) {
type userinfoTest struct {
uri string
parsed string
}
testCases := []userinfoTest{
{uri: "http://localhost", parsed: "http://localhost"},
{uri: "http://localhost?foo=bar", parsed: "http://localhost?foo=bar"},
{uri: "http://user@localhost", parsed: "http://localhost"},
{uri: "http://user:pass@localhost", parsed: "http://localhost"},
{uri: "http://user:pass@localhost?foo=bar#1", parsed: "http://localhost?foo=bar#1"},
{uri: "%gh&%ij", parsed: "%gh&%ij"},
}
for _, test := range testCases {
parsed := uri.WithoutUserinfo(test.uri)
if parsed != test.parsed {
t.Errorf("'%s' got parsed as '%s', expected: '%s'", test.uri, parsed, test.parsed)
}
}
}