Files
2025-05-15 21:36:52 +02:00

133 lines
3.5 KiB
Go

package legacy
import (
"context"
"encoding/json"
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/grafana/grafana/pkg/apimachinery/utils"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/storage/unified/resource"
"github.com/grafana/grafana/pkg/storage/unified/resourcepb"
)
func TestGetProvisioningDataFromEvent(t *testing.T) {
tests := []struct {
name string
manager utils.ManagerProperties
source utils.SourceProperties
want *dashboards.DashboardProvisioning
}{
{
name: "valid provisioning data",
manager: utils.ManagerProperties{
Kind: utils.ManagerKindClassicFP, //nolint:staticcheck
Identity: "test-name",
},
source: utils.SourceProperties{
Path: "test-path",
Checksum: "test-checksum",
TimestampMillis: 1000,
},
want: &dashboards.DashboardProvisioning{
Name: "test-name",
ExternalID: "test-path",
CheckSum: "test-checksum",
Updated: 1,
},
},
{
name: "non-provisioned dashboard",
manager: utils.ManagerProperties{
Kind: "different-kind",
},
source: utils.SourceProperties{},
want: nil,
},
{
name: "missing runtime object",
manager: utils.ManagerProperties{},
source: utils.SourceProperties{},
want: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
res := &unstructured.Unstructured{
Object: map[string]any{},
}
meta, err := utils.MetaAccessor(res)
require.NoError(t, err)
meta.SetManagerProperties(tt.manager)
meta.SetSourceProperties(tt.source)
got, err := getProvisioningDataFromEvent(resource.WriteEvent{
Object: meta,
})
require.NoError(t, err)
require.Equal(t, tt.want, got)
})
}
}
// test that we use the save provisioning function if the file based provisioning is set
func TestWriteProvisioningEvent(t *testing.T) {
dashData := &dashboards.Dashboard{
Title: "Test Dashboard",
Version: 2,
}
dashBytes, err := json.Marshal(dashData)
require.NoError(t, err)
key := &resourcepb.ResourceKey{
Group: dashboard.DashboardResourceInfo.GroupResource().Group,
Resource: dashboard.DashboardResourceInfo.GroupResource().Resource,
Name: "test-dashboard",
Namespace: "stacks-1",
}
res := &unstructured.Unstructured{
Object: map[string]any{},
}
meta, err := utils.MetaAccessor(res)
require.NoError(t, err)
meta.SetManagerProperties(utils.ManagerProperties{
Kind: utils.ManagerKindClassicFP, //nolint:staticcheck
Identity: "test-name",
})
meta.SetSourceProperties(utils.SourceProperties{
Path: "test-path",
Checksum: "test-checksum",
TimestampMillis: 1000,
})
event := resource.WriteEvent{
Type: resourcepb.WatchEvent_ADDED,
Key: key,
Object: meta,
Value: dashBytes,
}
mockStore := dashboards.NewFakeDashboardStore(t)
mockStore.On("SaveProvisionedDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashData, nil)
access := &dashboardSqlAccess{
dashStore: mockStore,
log: log.New("test"),
}
ctx := identity.WithRequester(context.Background(), &user.SignedInUser{})
rv, err := access.WriteEvent(ctx, event)
require.NoError(t, err)
require.Equal(t, int64(2), rv)
mockStore.AssertExpectations(t)
}