mirror of https://github.com/databricks/cli.git
Add integration test
This commit is contained in:
parent
a3e32c0adb
commit
72078bb09c
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"unique_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Unique ID for job name"
|
||||||
|
},
|
||||||
|
"warehouse_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The SQL warehouse ID to use for the dashboard"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"pages": [
|
||||||
|
{
|
||||||
|
"displayName": "New Page",
|
||||||
|
"layout": [
|
||||||
|
{
|
||||||
|
"position": {
|
||||||
|
"height": 2,
|
||||||
|
"width": 6,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"name": "82eb9107",
|
||||||
|
"textbox_spec": "# I'm a title"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"position": {
|
||||||
|
"height": 2,
|
||||||
|
"width": 6,
|
||||||
|
"x": 0,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"name": "ffa6de4f",
|
||||||
|
"textbox_spec": "Text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "fdd21a3c"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
bundle:
|
||||||
|
name: dashboards
|
||||||
|
|
||||||
|
workspace:
|
||||||
|
root_path: "~/.bundle/{{.unique_id}}"
|
||||||
|
|
||||||
|
resources:
|
||||||
|
dashboards:
|
||||||
|
file_reference:
|
||||||
|
display_name: test-dashboard-{{.unique_id}}
|
||||||
|
file_path: ./dashboard.lvdash.json
|
||||||
|
warehouse_id: {{.warehouse_id}}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package bundle
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/databricks/cli/internal/acc"
|
||||||
|
"github.com/databricks/databricks-sdk-go/service/dashboards"
|
||||||
|
"github.com/databricks/databricks-sdk-go/service/workspace"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAccDashboards(t *testing.T) {
|
||||||
|
ctx, wt := acc.WorkspaceTest(t)
|
||||||
|
|
||||||
|
warehouseID := acc.GetEnvOrSkipTest(t, "TEST_DEFAULT_WAREHOUSE_ID")
|
||||||
|
uniqueID := uuid.New().String()
|
||||||
|
root, err := initTestTemplate(t, ctx, "dashboards", map[string]any{
|
||||||
|
"unique_id": uniqueID,
|
||||||
|
"warehouse_id": warehouseID,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
t.Cleanup(func() {
|
||||||
|
err = destroyBundle(t, ctx, root)
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
|
err = deployBundle(t, ctx, root)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Load bundle configuration by running the validate command.
|
||||||
|
b := unmarshalConfig(t, mustValidateBundle(t, ctx, root))
|
||||||
|
|
||||||
|
// Assert that the dashboard exists at the expected path and is, indeed, a dashboard.
|
||||||
|
oi, err := wt.W.Workspace.GetStatusByPath(ctx, fmt.Sprintf("%s/test-dashboard-%s.lvdash.json", b.Config.Workspace.ResourcePath, uniqueID))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.EqualValues(t, workspace.ObjectTypeDashboard, oi.ObjectType)
|
||||||
|
|
||||||
|
// Load the dashboard by its ID and confirm its display name.
|
||||||
|
dashboard, err := wt.W.Lakeview.GetByDashboardId(ctx, oi.ResourceId)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, fmt.Sprintf("test-dashboard-%s", uniqueID), dashboard.DisplayName)
|
||||||
|
|
||||||
|
// Make an out of band modification to the dashboard and confirm that it is detected.
|
||||||
|
_, err = wt.W.Lakeview.Update(ctx, dashboards.UpdateDashboardRequest{
|
||||||
|
DashboardId: oi.ResourceId,
|
||||||
|
SerializedDashboard: dashboard.SerializedDashboard,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Try to redeploy the bundle and confirm that the out of band modification is detected.
|
||||||
|
stdout, _, err := deployBundleWithArgs(t, ctx, root)
|
||||||
|
require.Error(t, err)
|
||||||
|
assert.Contains(t, stdout, `Error: dashboard "file_reference" has been modified remotely`+"\n")
|
||||||
|
|
||||||
|
// Redeploy the bundle with the --force flag and confirm that the out of band modification is ignored.
|
||||||
|
_, stderr, err := deployBundleWithArgs(t, ctx, root, "--force")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Contains(t, stderr, `Deployment complete!`+"\n")
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/databricks/cli/bundle"
|
||||||
"github.com/databricks/cli/cmd/root"
|
"github.com/databricks/cli/cmd/root"
|
||||||
"github.com/databricks/cli/internal"
|
"github.com/databricks/cli/internal"
|
||||||
"github.com/databricks/cli/libs/cmdio"
|
"github.com/databricks/cli/libs/cmdio"
|
||||||
|
@ -66,6 +67,19 @@ func validateBundle(t *testing.T, ctx context.Context, path string) ([]byte, err
|
||||||
return stdout.Bytes(), err
|
return stdout.Bytes(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func mustValidateBundle(t *testing.T, ctx context.Context, path string) []byte {
|
||||||
|
data, err := validateBundle(t, ctx, path)
|
||||||
|
require.NoError(t, err)
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmarshalConfig(t *testing.T, data []byte) *bundle.Bundle {
|
||||||
|
bundle := &bundle.Bundle{}
|
||||||
|
err := json.Unmarshal(data, &bundle.Config)
|
||||||
|
require.NoError(t, err)
|
||||||
|
return bundle
|
||||||
|
}
|
||||||
|
|
||||||
func deployBundle(t *testing.T, ctx context.Context, path string) error {
|
func deployBundle(t *testing.T, ctx context.Context, path string) error {
|
||||||
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
||||||
c := internal.NewCobraTestRunnerWithContext(t, ctx, "bundle", "deploy", "--force-lock", "--auto-approve")
|
c := internal.NewCobraTestRunnerWithContext(t, ctx, "bundle", "deploy", "--force-lock", "--auto-approve")
|
||||||
|
@ -73,6 +87,14 @@ func deployBundle(t *testing.T, ctx context.Context, path string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func deployBundleWithArgs(t *testing.T, ctx context.Context, path string, args ...string) (string, string, error) {
|
||||||
|
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
||||||
|
args = append([]string{"bundle", "deploy"}, args...)
|
||||||
|
c := internal.NewCobraTestRunnerWithContext(t, ctx, args...)
|
||||||
|
stdout, stderr, err := c.Run()
|
||||||
|
return stdout.String(), stderr.String(), err
|
||||||
|
}
|
||||||
|
|
||||||
func deployBundleWithFlags(t *testing.T, ctx context.Context, path string, flags []string) error {
|
func deployBundleWithFlags(t *testing.T, ctx context.Context, path string, flags []string) error {
|
||||||
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
||||||
args := []string{"bundle", "deploy", "--force-lock"}
|
args := []string{"bundle", "deploy", "--force-lock"}
|
||||||
|
|
Loading…
Reference in New Issue