diff --git a/internal/repofiles_test.go b/internal/repofiles_test.go new file mode 100644 index 000000000..055fe0c24 --- /dev/null +++ b/internal/repofiles_test.go @@ -0,0 +1,155 @@ +package internal + +import ( + "context" + "os" + "path" + "path/filepath" + "strings" + "testing" + + "github.com/databricks/cli/libs/filer" + "github.com/databricks/cli/libs/sync/repofiles" + "github.com/databricks/databricks-sdk-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TODO: skip if not cloud env, these are integration tests +// TODO: split into a separate PR + +func TestRepoFilesPutFile(t *testing.T) { + w, err := databricks.NewWorkspaceClient() + require.NoError(t, err) + ctx := context.Background() + + // initialize client + wsfsTmpDir := TemporaryWorkspaceDir(t, w) + localTmpDir := t.TempDir() + r, err := repofiles.Create(wsfsTmpDir, localTmpDir, w, &repofiles.RepoFileOptions{ + OverwriteIfExists: true, + }) + require.NoError(t, err) + f, err := filer.NewWorkspaceFilesClient(w, wsfsTmpDir) + require.NoError(t, err) + + // create local file + err = os.WriteFile(filepath.Join(localTmpDir, "foo.txt"), []byte(`hello, world`), os.ModePerm) + require.NoError(t, err) + err = r.PutFile(ctx, "foo.txt") + require.NoError(t, err) + + require.NoError(t, f.Mkdir(ctx, "bar")) + + entries, err := f.ReadDir(ctx, "bar") + require.NoError(t, err) + require.Len(t, entries, 1) + + assertFileContains(t, ctx, f, "foo.txt", "hello, world") +} + +func TestRepoFilesFileOverwritesNotebook(t *testing.T) { + w, err := databricks.NewWorkspaceClient() + require.NoError(t, err) + ctx := context.Background() + + // initialize client + wsfsTmpDir := TemporaryWorkspaceDir(t, w) + localTmpDir := t.TempDir() + r, err := repofiles.Create(wsfsTmpDir, localTmpDir, w, &repofiles.RepoFileOptions{ + OverwriteIfExists: true, + }) + require.NoError(t, err) + f, err := filer.NewWorkspaceFilesClient(w, wsfsTmpDir) + require.NoError(t, err) + + // create local notebook + err = os.WriteFile(filepath.Join(localTmpDir, "foo.py"), []byte("#Databricks notebook source\nprint(1)"), os.ModePerm) + require.NoError(t, err) + + // upload notebook + err = r.PutFile(ctx, "foo.py") + require.NoError(t, err) + assertNotebookExists(t, ctx, w, path.Join(wsfsTmpDir, "foo")) + + // upload file, and assert that it overwrites the notebook + err = os.WriteFile(filepath.Join(localTmpDir, "foo"), []byte("I am going to overwrite the notebook"), os.ModePerm) + require.NoError(t, err) + err = r.PutFile(ctx, "foo") + require.NoError(t, err) + assertFileContains(t, ctx, f, "foo", "I am going to overwrite the notebook") +} + +func TestRepoFilesFileOverwritesEmptyDirectoryTree(t *testing.T) { + w, err := databricks.NewWorkspaceClient() + require.NoError(t, err) + ctx := context.Background() + + // initialize client + wsfsTmpDir := TemporaryWorkspaceDir(t, w) + localTmpDir := t.TempDir() + r, err := repofiles.Create(wsfsTmpDir, localTmpDir, w, &repofiles.RepoFileOptions{ + OverwriteIfExists: true, + }) + require.NoError(t, err) + f, err := filer.NewWorkspaceFilesClient(w, wsfsTmpDir) + require.NoError(t, err) + + // create local file + err = os.WriteFile(filepath.Join(localTmpDir, "foo"), []byte(`hello, world`), os.ModePerm) + require.NoError(t, err) + + // construct a directory tree without files in the workspace + err = f.Mkdir(ctx, "foo/a/b/c") + require.NoError(t, err) + err = f.Mkdir(ctx, "foo/a/b/d/e") + require.NoError(t, err) + err = f.Mkdir(ctx, "foo/f/g/i") + require.NoError(t, err) + + // assert the directories exist + entries, err := f.ReadDir(ctx, "foo") + require.NoError(t, err) + assert.Len(t, entries, 2) + assert.True(t, entries[0].IsDir()) + assert.True(t, entries[1].IsDir()) + + // upload file, and assert that it overwrites the empty directories + err = r.PutFile(ctx, "foo") + require.NoError(t, err) + assertFileContains(t, ctx, f, "foo", "hello, world") + + // assert the directories do not exist anymore + _, err = f.ReadDir(ctx, "foo") + assert.ErrorIs(t, err, filer.ErrNotADirectory) +} + +func TestRepoFilesFileInDirOverwritesExistingNotebook(t *testing.T) { + w, err := databricks.NewWorkspaceClient() + require.NoError(t, err) + ctx := context.Background() + + // initialize client + wsfsTmpDir := TemporaryWorkspaceDir(t, w) + localTmpDir := t.TempDir() + r, err := repofiles.Create(wsfsTmpDir, localTmpDir, w, &repofiles.RepoFileOptions{ + OverwriteIfExists: true, + }) + require.NoError(t, err) + f, err := filer.NewWorkspaceFilesClient(w, wsfsTmpDir) + require.NoError(t, err) + + // create local notebook + err = f.Write(ctx, "foo.py", strings.NewReader("#Databricks notebook source\nprint(1)")) + require.NoError(t, err) + assertNotebookExists(t, ctx, w, path.Join(wsfsTmpDir, "foo")) + + // upload file + err = os.Mkdir(filepath.Join(localTmpDir, "foo"), os.ModePerm) + require.NoError(t, err) + err = os.WriteFile(filepath.Join(localTmpDir, "foo/bar.txt"), []byte("I am going to overwrite the notebook"), os.ModePerm) + require.NoError(t, err) + err = r.PutFile(ctx, "foo/bar.txt") + require.NoError(t, err) + assertFileContains(t, ctx, f, "foo/bar.txt", "I am going to overwrite the notebook") +}