53 lines
1.7 KiB
Go
53 lines
1.7 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|