package v1 import ( "net/url" "strings" "testing" "git.unkin.net/unkin/artifactapi/internal/provider" ) type plainProvider struct{ provider.Provider } type forwardingProvider struct{ plainProvider } func (forwardingProvider) ForwardedQuery(path string) []string { if strings.HasSuffix(path, ".tar.gz") { return nil } return []string{"limit", "offset"} } func TestForwardQuery(t *testing.T) { long := strings.Repeat("9", maxForwardedValueLen+1) tests := []struct { name string prov provider.Provider path string query string want string }{ {"non-forwarder keeps path", plainProvider{}, "a/versions/", "limit=10&offset=5", "a/versions/"}, {"no query", forwardingProvider{}, "a/versions/", "", "a/versions/"}, {"allowlisted params sorted", forwardingProvider{}, "a/versions/", "offset=5&limit=10", "a/versions/?limit=10&offset=5"}, {"unknown params dropped", forwardingProvider{}, "a/versions/", "x=1&limit=10&cb=zz", "a/versions/?limit=10"}, {"only unknown params", forwardingProvider{}, "a/versions/", "x=1", "a/versions/"}, {"first value wins", forwardingProvider{}, "a/versions/", "limit=10&limit=20", "a/versions/?limit=10"}, {"values re-encoded", forwardingProvider{}, "a/versions/", "limit=1%202", "a/versions/?limit=1+2"}, {"overlong value dropped", forwardingProvider{}, "a/versions/", "limit=" + long + "&offset=5", "a/versions/?offset=5"}, {"path without allowlist", forwardingProvider{}, "a/b-1.0.0.tar.gz", "limit=10", "a/b-1.0.0.tar.gz"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { q, err := url.ParseQuery(tt.query) if err != nil { t.Fatal(err) } if got := forwardQuery(tt.prov, tt.path, q); got != tt.want { t.Errorf("forwardQuery = %q, want %q", got, tt.want) } }) } }