Files
Roberto Jiménez Sánchez 364247e26b Provisioning: add most mocks to unit test provisioning jobs (#103446)
* Use interface for factories

* Add most mocks to unit test jobs

* Generate more mocks for main jobs package

* Interface for parser

* Use clients directly without parser

* Regenerate mock

* Eliminate resource clients from Parser

* Interface for folder tree
2025-04-04 15:42:20 +03:00

118 lines
3.0 KiB
Go

package resources
import (
"bytes"
"context"
"os"
"path"
"testing"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/runtime/schema"
provisioning "github.com/grafana/grafana/pkg/apis/provisioning/v0alpha1"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/repository"
)
func TestUtils(t *testing.T) {
t.Run("load playlist json", func(t *testing.T) {
obj, gvk, err := DecodeYAMLObject(bytes.NewReader([]byte(`{
"kind": "Playlist",
"apiVersion": "playlist.grafana.app/v0alpha1",
"metadata": {
"name": "hello"
},
"spec": {
"title": "Playlist from provisioning"
}
}`)))
require.NoError(t, err)
require.Equal(t, &schema.GroupVersionKind{
Group: "playlist.grafana.app",
Version: "v0alpha1",
Kind: "Playlist",
}, gvk)
require.NotNil(t, obj)
})
t.Run("YAML Parsing", func(t *testing.T) {
obj, gvk, err := DecodeYAMLObject(bytes.NewReader([]byte("kind: xyz\npi: 3.1415")))
require.NoError(t, err)
require.NotNil(t, gvk)
require.Equal(t, "xyz", obj.Object["kind"])
require.Equal(t, 3.1415, obj.Object["pi"])
// // Tabs in the value
// _, _, err = LoadYAMLOrJSON(bytes.NewReader([]byte("kind: xyz\n\tpi: 3.1415")))
// require.Equal(t, ErrYamlContainsTabs, err)
})
t.Run("load playlist yaml", func(t *testing.T) {
obj, gvk, err := DecodeYAMLObject(bytes.NewReader([]byte(`
apiVersion: playlist.grafana.app/v0alpha1
kind: Playlist
metadata:
name: hello
spec:
title: a title
`)))
require.NoError(t, err)
require.Equal(t, &schema.GroupVersionKind{
Group: "playlist.grafana.app",
Version: "v0alpha1",
Kind: "Playlist",
}, gvk)
require.NotNil(t, obj)
})
t.Run("load dashboard json", func(t *testing.T) {
// Support dashboard conversion
obj, gvk, classic, err := ReadClassicResource(context.Background(), &repository.FileInfo{
Data: []byte(`{
"schemaVersion": 7,
"panels": [],
"tags": []
}`),
})
require.NoError(t, err)
require.Equal(t, provisioning.ClassicDashboard, classic)
require.Equal(t, &schema.GroupVersionKind{
Group: "dashboard.grafana.app",
Version: "v0alpha1",
Kind: "Dashboard",
}, gvk)
require.NotNil(t, obj)
})
t.Run("lint dashboard", func(t *testing.T) {
var err error
info := &repository.FileInfo{
Path: "devenv/dev-dashboards/panel-timeline/timeline-demo.json",
}
info.Data, err = os.ReadFile(path.Join("../../../../..", info.Path))
require.NoError(t, err)
parser := &parser{
repo: provisioning.ResourceRepositoryInfo{
Name: "test",
},
}
// Support dashboard conversion
parsed, err := parser.Parse(context.Background(), info)
require.EqualError(t, err, "no clients configured")
err = parsed.DryRun(context.Background())
require.EqualError(t, err, "no client configured")
require.Equal(t, provisioning.ClassicDashboard, parsed.Classic)
require.Equal(t, schema.GroupVersionKind{
Group: "dashboard.grafana.app",
Version: "v0alpha1",
Kind: "Dashboard",
}, parsed.GVK)
})
}