Files
grafana/pkg/services/apiserver/appinstaller/installer_test.go
T
2025-07-22 06:45:01 -04:00

144 lines
3.8 KiB
Go

package appinstaller
import (
"context"
"testing"
appsdkapiserver "github.com/grafana/grafana-app-sdk/k8s/apiserver"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/authorization/authorizer"
)
func TestRegisterAuthorizers(t *testing.T) {
tests := []struct {
name string
appInstallers []appsdkapiserver.AppInstaller
expectedRegisters int
}{
{
name: "empty installers list",
appInstallers: []appsdkapiserver.AppInstaller{},
expectedRegisters: 0,
},
{
name: "installer without authorizer provider",
appInstallers: []appsdkapiserver.AppInstaller{
&mockAppInstaller{
groupVersions: []schema.GroupVersion{
{Group: "test.example.com", Version: "v1"},
},
},
},
expectedRegisters: 0,
},
{
name: "single installer with authorizer provider",
appInstallers: []appsdkapiserver.AppInstaller{
&mockAppInstallerWithAuth{
mockAppInstaller: &mockAppInstaller{
groupVersions: []schema.GroupVersion{
{Group: "test.example.com", Version: "v1"},
},
},
mockAuthorizer: &mockAuthorizer{},
},
},
expectedRegisters: 1,
},
{
name: "installer with multiple group versions",
appInstallers: []appsdkapiserver.AppInstaller{
&mockAppInstallerWithAuth{
mockAppInstaller: &mockAppInstaller{
groupVersions: []schema.GroupVersion{
{Group: "test.example.com", Version: "v1"},
{Group: "test.example.com", Version: "v2"},
{Group: "other.example.com", Version: "v1"},
},
},
mockAuthorizer: &mockAuthorizer{},
},
},
expectedRegisters: 3,
},
{
name: "multiple installers with mixed authorizer support",
appInstallers: []appsdkapiserver.AppInstaller{
&mockAppInstallerWithAuth{
mockAppInstaller: &mockAppInstaller{
groupVersions: []schema.GroupVersion{
{Group: "test.example.com", Version: "v1"},
},
},
mockAuthorizer: &mockAuthorizer{},
},
&mockAppInstaller{
groupVersions: []schema.GroupVersion{
{Group: "other.example.com", Version: "v1"},
},
},
&mockAppInstallerWithAuth{
mockAppInstaller: &mockAppInstaller{
groupVersions: []schema.GroupVersion{
{Group: "another.example.com", Version: "v1"},
{Group: "another.example.com", Version: "v2"},
},
},
mockAuthorizer: &mockAuthorizer{},
},
},
expectedRegisters: 3, // 1 from first installer + 2 from third installer
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
registrar := &mockAuthorizerRegistrar{}
RegisterAuthorizers(ctx, tt.appInstallers, registrar)
require.Equal(t, tt.expectedRegisters, len(registrar.registrations))
})
}
}
type mockAppInstaller struct {
appsdkapiserver.AppInstaller // Embed the interface
groupVersions []schema.GroupVersion
}
func (m *mockAppInstaller) GroupVersions() []schema.GroupVersion {
return m.groupVersions
}
type mockAppInstallerWithAuth struct {
*mockAppInstaller
mockAuthorizer authorizer.Authorizer
}
func (m *mockAppInstallerWithAuth) GetAuthorizer() authorizer.Authorizer {
return m.mockAuthorizer
}
type mockRegistration struct {
groupVersion schema.GroupVersion
authorizer authorizer.Authorizer
}
type mockAuthorizerRegistrar struct {
registrations []mockRegistration
}
func (m *mockAuthorizerRegistrar) Register(gv schema.GroupVersion, auth authorizer.Authorizer) {
m.registrations = append(m.registrations, mockRegistration{
groupVersion: gv,
authorizer: auth,
})
}
type mockAuthorizer struct{}
func (m *mockAuthorizer) Authorize(ctx context.Context, attr authorizer.Attributes) (authorizer.Decision, string, error) {
return authorizer.DecisionAllow, "test", nil
}