package apps import ( "bytes" "context" "os" "path/filepath" "testing" "time" "github.com/databricks/cli/bundle" "github.com/databricks/cli/bundle/config" "github.com/databricks/cli/bundle/config/mutator" "github.com/databricks/cli/bundle/config/resources" "github.com/databricks/cli/bundle/internal/bundletest" mockfiler "github.com/databricks/cli/internal/mocks/libs/filer" "github.com/databricks/cli/libs/dyn" "github.com/databricks/cli/libs/filer" "github.com/databricks/cli/libs/vfs" "github.com/databricks/databricks-sdk-go/experimental/mocks" "github.com/databricks/databricks-sdk-go/service/apps" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) func TestAppDeploy(t *testing.T) { root := t.TempDir() err := os.MkdirAll(filepath.Join(root, "app1"), 0700) require.NoError(t, err) err = os.MkdirAll(filepath.Join(root, "app2"), 0700) require.NoError(t, err) b := &bundle.Bundle{ BundleRootPath: root, SyncRoot: vfs.MustNew(root), Config: config.Root{ Workspace: config.Workspace{ RootPath: "/Workspace/Users/foo@bar.com/", }, Resources: config.Resources{ Apps: map[string]*resources.App{ "app1": { App: &apps.App{ Name: "app1", }, SourceCodePath: "./app1", Config: map[string]interface{}{ "command": []string{"echo", "hello"}, "env": []map[string]string{ {"name": "MY_APP", "value": "my value"}, }, }, }, "app2": { App: &apps.App{ Name: "app2", }, SourceCodePath: "./app2", }, }, }, }, } mwc := mocks.NewMockWorkspaceClient(t) b.SetWorkpaceClient(mwc.WorkspaceClient) wait := &apps.WaitGetDeploymentAppSucceeded[apps.AppDeployment]{ Poll: func(_ time.Duration, _ func(*apps.AppDeployment)) (*apps.AppDeployment, error) { return nil, nil }, } appApi := mwc.GetMockAppsAPI() appApi.EXPECT().Deploy(mock.Anything, apps.CreateAppDeploymentRequest{ AppName: "app1", AppDeployment: &apps.AppDeployment{ Mode: apps.AppDeploymentModeSnapshot, SourceCodePath: "/Workspace/Users/foo@bar.com/files/app1", }, }).Return(wait, nil) appApi.EXPECT().Deploy(mock.Anything, apps.CreateAppDeploymentRequest{ AppName: "app2", AppDeployment: &apps.AppDeployment{ Mode: apps.AppDeploymentModeSnapshot, SourceCodePath: "/Workspace/Users/foo@bar.com/files/app2", }, }).Return(wait, nil) mockFiler := mockfiler.NewMockFiler(t) mockFiler.EXPECT().Write(mock.Anything, "app1/app.yml", bytes.NewBufferString(`command: - echo - hello env: - name: MY_APP value: my value `), filer.OverwriteIfExists).Return(nil) bundletest.SetLocation(b, "resources.apps.app1", []dyn.Location{{File: "./databricks.yml"}}) bundletest.SetLocation(b, "resources.apps.app2", []dyn.Location{{File: "./databricks.yml"}}) ctx := context.Background() diags := bundle.Apply(ctx, b, bundle.Seq( mutator.DefineDefaultWorkspacePaths(), mutator.TranslatePaths(), appsDeploy{ func(b *bundle.Bundle) (filer.Filer, error) { return mockFiler, nil }, })) require.Empty(t, diags) }