75 lines
2.8 KiB
Go
75 lines
2.8 KiB
Go
package clients
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/authlib/types"
|
|
provisioning "github.com/grafana/grafana/apps/provisioning/pkg/apis/provisioning/v0alpha1"
|
|
"github.com/grafana/grafana/pkg/services/authn"
|
|
)
|
|
|
|
func TestProvisioning_Test(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
|
|
for _, tt := range []struct {
|
|
Name, URL string
|
|
Valid bool
|
|
}{
|
|
{"Root path is invalid", "https://grafana.localhost/", false},
|
|
{"Non-provisioning path", "https://grafana.localhost/hello/world", false},
|
|
{"Provisioning path that isn't webhook", "https://grafana.localhost/apis/provisioning.grafana.app/v0alpha1/namespaces/x/repositories/y/unittest", false},
|
|
{"Webhook path", "https://grafana.localhost/apis/provisioning.grafana.app/v0alpha1/namespaces/x/repositories/y/webhook", true},
|
|
{"Webhook path with subpath", "https://grafana.localhost/apis/provisioning.grafana.app/v0alpha1/namespaces/x/repositories/y/webhook/unittest", false}, // this'll have to change if we ever want subpaths
|
|
{"Render image url", "https://grafana.localhost/apis/provisioning.grafana.app/v0alpha1/namespaces/x/repositories/y/render/image-uid", true},
|
|
} {
|
|
t.Run(tt.Name, func(t *testing.T) {
|
|
t.Parallel()
|
|
svc := ProvideProvisioning()
|
|
|
|
url, err := url.Parse(tt.URL)
|
|
require.NoError(t, err, "couldn't parse input URL")
|
|
req := &authn.Request{HTTPRequest: &http.Request{
|
|
URL: url,
|
|
}}
|
|
|
|
assert.Equal(t, tt.Valid, svc.Test(ctx, req))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestProvisioning_Authenticate(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
|
|
url, err := url.Parse("https://grafana.localhost/apis/provisioning.grafana.app/v0alpha1/namespaces/x/repositories/y/webhook")
|
|
require.NoError(t, err, "couldn't parse URL known to be good?")
|
|
req := &authn.Request{HTTPRequest: &http.Request{
|
|
URL: url,
|
|
}}
|
|
|
|
svc := ProvideProvisioning()
|
|
identity, err := svc.Authenticate(ctx, req)
|
|
require.NoError(t, err, "Authenticate shouldn't err")
|
|
|
|
assert.Equal(t, types.TypeAnonymous, identity.GetIdentityType(), "IdentityType")
|
|
assert.Equal(t, "auth.client.apiserver.provisioning", identity.UID, "UID")
|
|
assert.Equal(t, "auth.client.apiserver.provisioning", identity.Login, "Login")
|
|
assert.Equal(t, "auth.client.apiserver.provisioning", identity.AuthenticatedBy, "AuthenticatedBy")
|
|
assert.Equal(t, false, identity.GetIsGrafanaAdmin(), "IsAdmin")
|
|
}
|
|
|
|
func TestProvisioning_Assumptions(t *testing.T) {
|
|
t.Run("APIVERSION constant has no leading or trailing slashes", func(t *testing.T) {
|
|
assert.False(t, strings.HasPrefix(provisioning.APIVERSION, "/"), "found leading / in APIVERSION: %s", provisioning.APIVERSION)
|
|
assert.False(t, strings.HasSuffix(provisioning.APIVERSION, "/"), "found trailing / in APIVERSION: %s", provisioning.APIVERSION)
|
|
})
|
|
}
|