02227855e8
* wire sync hooks for folder create/update * cleanup * add hook tests * fix nil context * better context
133 lines
3.4 KiB
Go
133 lines
3.4 KiB
Go
package folders
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/grafana/grafana/apps/iam/pkg/reconcilers"
|
|
"github.com/grafana/grafana/pkg/services/folder"
|
|
"github.com/stretchr/testify/mock"
|
|
"github.com/stretchr/testify/require"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
func TestFolderSyncHooks_Create(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
expectedCallsToZanzana int
|
|
folder runtime.Object
|
|
updateSuccessful bool
|
|
}{
|
|
{
|
|
name: "folder at root does nothing",
|
|
expectedCallsToZanzana: 0,
|
|
folder: getFolderObj("foo", ""),
|
|
updateSuccessful: true,
|
|
},
|
|
{
|
|
name: "unsuccessful create does nothing",
|
|
expectedCallsToZanzana: 0,
|
|
folder: getFolderObj("foo", "bar"),
|
|
updateSuccessful: false,
|
|
},
|
|
{
|
|
name: "successful create writes to zanzana",
|
|
expectedCallsToZanzana: 1,
|
|
folder: getFolderObj("foo", "bar"),
|
|
updateSuccessful: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
storeMock := newMockStore()
|
|
b := &FolderAPIBuilder{
|
|
permissionStore: storeMock,
|
|
}
|
|
|
|
f, err := b.beginCreate(context.Background(), tt.folder, nil)
|
|
if err != nil {
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
f(nil, tt.updateSuccessful)
|
|
|
|
storeMock.AssertNumberOfCalls(t, "SetFolderParent", tt.expectedCallsToZanzana)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFolderSyncHooks_Update(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
expectedCallsToZanzana int
|
|
newFolder runtime.Object
|
|
oldFolder runtime.Object
|
|
updateSuccessful bool
|
|
}{
|
|
{
|
|
name: "no folder change does nothing",
|
|
expectedCallsToZanzana: 0,
|
|
oldFolder: getFolderObj("foo", "bar"),
|
|
newFolder: getFolderObj("foo", "bar"),
|
|
updateSuccessful: true,
|
|
},
|
|
{
|
|
name: "unsuccessful update does nothing",
|
|
expectedCallsToZanzana: 0,
|
|
oldFolder: getFolderObj("foo", "bar"),
|
|
newFolder: getFolderObj("foo", "hop"),
|
|
updateSuccessful: false,
|
|
},
|
|
{
|
|
name: "successful update writes to zanzana",
|
|
expectedCallsToZanzana: 1,
|
|
oldFolder: getFolderObj("foo", "bar"),
|
|
newFolder: getFolderObj("foo", "hop"),
|
|
updateSuccessful: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
storeMock := newMockStore()
|
|
b := &FolderAPIBuilder{
|
|
permissionStore: storeMock,
|
|
}
|
|
|
|
f, err := b.beginUpdate(context.Background(), tt.newFolder, tt.oldFolder, nil)
|
|
if err != nil {
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
f(nil, tt.updateSuccessful)
|
|
|
|
storeMock.AssertNumberOfCalls(t, "SetFolderParent", tt.expectedCallsToZanzana)
|
|
})
|
|
}
|
|
}
|
|
|
|
func getFolderObj(uid, parentUid string) runtime.Object {
|
|
f, _ := LegacyCreateCommandToUnstructured(&folder.CreateFolderCommand{
|
|
UID: uid,
|
|
ParentUID: parentUid,
|
|
})
|
|
return f
|
|
}
|
|
|
|
func newMockStore() *mockZanzanaPermissionStore {
|
|
store := mockZanzanaPermissionStore{}
|
|
store.On("SetFolderParent", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
|
|
return &store
|
|
}
|
|
|
|
type mockZanzanaPermissionStore struct {
|
|
mock.Mock
|
|
reconcilers.PermissionStore
|
|
}
|
|
|
|
func (m *mockZanzanaPermissionStore) SetFolderParent(_ context.Context, _, _, _ string) error {
|
|
m.Called()
|
|
return nil
|
|
}
|