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"
|
||||
"testing"
|
||||
|
||||
"github.com/databricks/cli/bundle"
|
||||
"github.com/databricks/cli/cmd/root"
|
||||
"github.com/databricks/cli/internal"
|
||||
"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
|
||||
}
|
||||
|
||||
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 {
|
||||
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
||||
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
|
||||
}
|
||||
|
||||
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 {
|
||||
ctx = env.Set(ctx, "BUNDLE_ROOT", path)
|
||||
args := []string{"bundle", "deploy", "--force-lock"}
|
||||
|
|
Loading…
Reference in New Issue