143 lines
5.1 KiB
Go
143 lines
5.1 KiB
Go
package traefik_umami_feeder
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
func TestTraefikUmamiFeeder(t *testing.T) {
|
|
cfg := CreateConfig()
|
|
cfg.UmamiHost = "http://localhost:3000"
|
|
cfg.UmamiUsername = "admin"
|
|
cfg.UmamiPassword = "umami"
|
|
cfg.UmamiTeamId = "8e39c6ad-e44a-4d3e-be98-015db2d62d40"
|
|
cfg.CreateNewWebsites = true
|
|
|
|
ctx := context.Background()
|
|
next := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {})
|
|
|
|
handler, err := New(ctx, next, cfg, "umami-feeder")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
recorder := httptest.NewRecorder()
|
|
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:80", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
handler.ServeHTTP(recorder, req)
|
|
}
|
|
|
|
func TestShouldTrackDefault(t *testing.T) {
|
|
feeder := UmamiFeeder{}
|
|
|
|
assertResource(t, feeder, true, "http://localhost")
|
|
assertResource(t, feeder, true, "http://localhost/about")
|
|
assertResource(t, feeder, true, "http://localhost/products.html")
|
|
assertResource(t, feeder, true, "http://localhost/blog.php")
|
|
assertResource(t, feeder, true, "http://localhost/feed.rss")
|
|
assertResource(t, feeder, false, "http://localhost/favicon.ico")
|
|
assertResource(t, feeder, false, "http://localhost/photo.jpg")
|
|
assertResource(t, feeder, false, "http://localhost/background.png")
|
|
}
|
|
|
|
func assertResource(t *testing.T, plugin UmamiFeeder, expected bool, url string) {
|
|
if expected != plugin.shouldTrackResource(url) {
|
|
t.Fatalf("expected %v for %s", expected, url)
|
|
}
|
|
}
|
|
|
|
func TestShouldTrackInvalidIp(t *testing.T) {
|
|
feeder := UmamiFeeder{}
|
|
err := feeder.verifyConfig(&Config{
|
|
IgnoreIPs: []string{"127.0.0.1-127.0.0.10"},
|
|
})
|
|
|
|
if err == nil {
|
|
t.Fatal("should have failed with invalid IP")
|
|
}
|
|
}
|
|
|
|
func TestShouldTrackIps(t *testing.T) {
|
|
feeder := UmamiFeeder{createNewWebsites: true}
|
|
err := feeder.verifyConfig(&Config{
|
|
IgnoreIPs: []string{"127.0.0.1", "10.0.0.1/24"},
|
|
})
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
assertIgnoreIp(t, feeder, true, "192.168.0.1")
|
|
assertIgnoreIp(t, feeder, false, "127.0.0.1")
|
|
assertIgnoreIp(t, feeder, false, "10.0.0.1")
|
|
assertIgnoreIp(t, feeder, false, "10.0.0.255")
|
|
assertIgnoreIp(t, feeder, true, "10.0.1.1")
|
|
assertIgnoreIp(t, feeder, true, "10.10.10.1")
|
|
assertIgnoreIp(t, feeder, true, "1.1.1.1")
|
|
assertIgnoreIp(t, feeder, true, "8.8.8.8")
|
|
}
|
|
|
|
func assertIgnoreIp(t *testing.T, plugin UmamiFeeder, expected bool, clientIp string) {
|
|
req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://localhost", nil)
|
|
req.Header.Set(plugin.headerIp, clientIp)
|
|
|
|
if expected != plugin.shouldTrack(req) {
|
|
t.Fatalf("expected %v for %s", expected, clientIp)
|
|
}
|
|
}
|
|
|
|
func TestShouldTrackUrls(t *testing.T) {
|
|
feeder := UmamiFeeder{createNewWebsites: true}
|
|
err := feeder.verifyConfig(&Config{
|
|
IgnoreURLs: []string{"https?://[^/]+/health$", "/about"},
|
|
})
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
assertIgnoreUrl(t, feeder, false, "http://localhost/health")
|
|
assertIgnoreUrl(t, feeder, true, "http://localhost/user/health")
|
|
assertIgnoreUrl(t, feeder, true, "http://localhost/healthcheck")
|
|
assertIgnoreUrl(t, feeder, true, "http://localhost/")
|
|
assertIgnoreUrl(t, feeder, false, "http://localhost/about")
|
|
assertIgnoreUrl(t, feeder, false, "http://localhost/aboutus")
|
|
assertIgnoreUrl(t, feeder, false, "http://localhost/category/about")
|
|
assertIgnoreUrl(t, feeder, true, "http://localhost/hello-world")
|
|
}
|
|
|
|
func assertIgnoreUrl(t *testing.T, plugin UmamiFeeder, expected bool, url string) {
|
|
req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil)
|
|
|
|
if expected != plugin.shouldTrack(req) {
|
|
t.Fatalf("expected %v for %s", expected, url)
|
|
}
|
|
}
|
|
|
|
func TestShouldTrackUserAgents(t *testing.T) {
|
|
feeder := UmamiFeeder{createNewWebsites: true, ignoreUserAgents: []string{"Googlebot", "Uptime-Kuma"}}
|
|
|
|
assertIgnoreUa(t, feeder, true, "Mozilla/5.0 (Windows; Windows NT 6.0; WOW64) Gecko/20100101 Firefox/60.7")
|
|
assertIgnoreUa(t, feeder, true, "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; Win64; x64 Trident/6.0)")
|
|
assertIgnoreUa(t, feeder, true, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36")
|
|
assertIgnoreUa(t, feeder, false, "Uptime-Kuma/1.18.5")
|
|
assertIgnoreUa(t, feeder, false, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/90.0.4430.212 Safari/537.36 Uptime-Kuma/1.23.1")
|
|
assertIgnoreUa(t, feeder, true, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36")
|
|
assertIgnoreUa(t, feeder, false, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")
|
|
assertIgnoreUa(t, feeder, false, "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")
|
|
}
|
|
|
|
func assertIgnoreUa(t *testing.T, plugin UmamiFeeder, expected bool, ua string) {
|
|
req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://localhost/", nil)
|
|
req.Header.Set("User-Agent", ua)
|
|
|
|
if expected != plugin.shouldTrack(req) {
|
|
t.Fatalf("expected %v for %s", expected, ua)
|
|
}
|
|
}
|