diff --git a/.eslintrc.json b/.eslintrc.json index c72111111..58f4d2bbd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -26,7 +26,7 @@ }, "overrides": [ { - "files": "**/*.test.ts", + "files": ["**/*.test.ts", "**/test/**"], "rules": { "no-console": "off" } diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7cc3c1cd0..0fa342ed8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -76,9 +76,9 @@ jobs: run: yarn run test:cov working-directory: packages/databricks-vscode - # - name: Integration Tests - # run: yarn run test:integ - # working-directory: packages/databricks-vscode + - name: Integration Tests + run: yarn run test:integ + working-directory: packages/databricks-vscode - name: Integration Tests SDK wrappers run: yarn run test:integ:sdk diff --git a/packages/databricks-vscode/package.json b/packages/databricks-vscode/package.json index 2dcd26114..ce00e777a 100644 --- a/packages/databricks-vscode/package.json +++ b/packages/databricks-vscode/package.json @@ -6,7 +6,7 @@ "license": "LicenseRef-LICENSE", "version": "2.0.0", "engines": { - "vscode": "^1.83.0" + "vscode": "^1.86.0" }, "categories": [ "Data Science", @@ -844,8 +844,8 @@ "ts-node": "^10.9.2", "typescript": "^5.3.3", "vsce": "^2.15.0", - "wdio-video-reporter": "^4.0.5", - "wdio-vscode-service": "^5.2.2", + "wdio-video-reporter": "^5.1.4", + "wdio-vscode-service": "^6.0.2", "yargs": "^17.7.2" }, "nyc": { diff --git a/packages/databricks-vscode/src/bundle/BundleFileSet.test.ts b/packages/databricks-vscode/src/bundle/BundleFileSet.test.ts index 889579d04..a6c9119df 100644 --- a/packages/databricks-vscode/src/bundle/BundleFileSet.test.ts +++ b/packages/databricks-vscode/src/bundle/BundleFileSet.test.ts @@ -1,5 +1,5 @@ import {Uri} from "vscode"; -import {BundleFileSet, getAbsolutePath} from "./BundleFileSet"; +import {BundleFileSet, getAbsoluteGlobPath} from "./BundleFileSet"; import {expect} from "chai"; import path from "path"; import * as tmp from "tmp-promise"; @@ -18,16 +18,18 @@ describe(__filename, async function () { await tmpdir.cleanup(); }); - it("should return the correct absolute path", () => { + it("should return the correct absolute glob path", () => { const tmpdirUri = Uri.file(tmpdir.path); - - expect(getAbsolutePath("test.txt", tmpdirUri).fsPath).to.equal( - path.join(tmpdirUri.fsPath, "test.txt") + let expectedGlob = path.join(tmpdirUri.fsPath, "test.txt"); + if (process.platform === "win32") { + expectedGlob = expectedGlob.replace(/\\/g, "/"); + } + expect(getAbsoluteGlobPath("test.txt", tmpdirUri)).to.equal( + expectedGlob + ); + expect(getAbsoluteGlobPath(Uri.file("test.txt"), tmpdirUri)).to.equal( + expectedGlob ); - - expect( - getAbsolutePath(Uri.file("test.txt"), tmpdirUri).fsPath - ).to.equal(path.join(tmpdirUri.fsPath, "test.txt")); }); it("should find the correct root bundle yaml", async () => { diff --git a/packages/databricks-vscode/src/bundle/BundleFileSet.ts b/packages/databricks-vscode/src/bundle/BundleFileSet.ts index d63ed9740..450892ca3 100644 --- a/packages/databricks-vscode/src/bundle/BundleFileSet.ts +++ b/packages/databricks-vscode/src/bundle/BundleFileSet.ts @@ -22,7 +22,7 @@ export async function writeBundleYaml(file: Uri, data: BundleSchema) { export async function getSubProjects(root: Uri) { const subProjectRoots = await glob.glob( - toGlobPath(getAbsolutePath(subProjectFilePattern, root).fsPath), + getAbsoluteGlobPath(subProjectFilePattern, root), {nocase: process.platform === "win32"} ); const normalizedRoot = path.normalize(root.fsPath); @@ -40,11 +40,10 @@ export async function getSubProjects(root: Uri) { }); } -export function getAbsolutePath(path: string | Uri, root: Uri) { - if (typeof path === "string") { - return Uri.joinPath(root, path); - } - return Uri.joinPath(root, path.fsPath); +export function getAbsoluteGlobPath(path: string | Uri, root: Uri): string { + path = typeof path === "string" ? path : path.fsPath; + const uri = Uri.joinPath(root, path); + return toGlobPath(uri.fsPath); } function toGlobPath(path: string) { @@ -68,9 +67,7 @@ export class BundleFileSet { async getRootFile() { const rootFile = await glob.glob( - toGlobPath( - getAbsolutePath(rootFilePattern, this.workspaceRoot).fsPath - ), + getAbsoluteGlobPath(rootFilePattern, this.workspaceRoot), {nocase: process.platform === "win32"} ); if (rootFile.length !== 1) { @@ -83,11 +80,9 @@ export class BundleFileSet { root?: Uri ): Promise<{relative: Uri; absolute: Uri}[]> { const subProjectRoots = await glob.glob( - toGlobPath( - getAbsolutePath( - subProjectFilePattern, - root || this.workspaceRoot - ).fsPath + getAbsoluteGlobPath( + subProjectFilePattern, + root || this.workspaceRoot ), {nocase: process.platform === "win32"} ); @@ -167,9 +162,7 @@ export class BundleFileSet { isRootBundleFile(e: Uri) { return minimatch( e.fsPath, - toGlobPath( - getAbsolutePath(rootFilePattern, this.workspaceRoot).fsPath - ) + getAbsoluteGlobPath(rootFilePattern, this.workspaceRoot) ); } @@ -178,10 +171,10 @@ export class BundleFileSet { if (includedFilesGlob === undefined) { return false; } - includedFilesGlob = getAbsolutePath( + includedFilesGlob = getAbsoluteGlobPath( includedFilesGlob, this.workspaceRoot - ).fsPath; + ); return minimatch(e.fsPath, toGlobPath(includedFilesGlob)); } diff --git a/packages/databricks-vscode/src/bundle/BundleWatcher.ts b/packages/databricks-vscode/src/bundle/BundleWatcher.ts index 66d3f0bf6..18acb31a4 100644 --- a/packages/databricks-vscode/src/bundle/BundleWatcher.ts +++ b/packages/databricks-vscode/src/bundle/BundleWatcher.ts @@ -1,5 +1,5 @@ import {Disposable, EventEmitter, Uri, workspace} from "vscode"; -import {BundleFileSet, getAbsolutePath} from "./BundleFileSet"; +import {BundleFileSet, getAbsoluteGlobPath} from "./BundleFileSet"; import {WithMutex} from "../locking"; import path from "path"; @@ -23,8 +23,7 @@ export class BundleWatcher implements Disposable { constructor(bundleFileSet: BundleFileSet, workspaceUri: Uri) { this.bundleFileSet = new WithMutex(bundleFileSet); const yamlWatcher = workspace.createFileSystemWatcher( - getAbsolutePath(path.join("**", "*.{yaml,yml}"), workspaceUri) - .fsPath + getAbsoluteGlobPath(path.join("**", "*.{yaml,yml}"), workspaceUri) ); this.disposables.push( diff --git a/packages/databricks-vscode/src/configuration/ConnectionCommands.ts b/packages/databricks-vscode/src/configuration/ConnectionCommands.ts index 628e39f16..82153522f 100644 --- a/packages/databricks-vscode/src/configuration/ConnectionCommands.ts +++ b/packages/databricks-vscode/src/configuration/ConnectionCommands.ts @@ -12,6 +12,9 @@ import {ConnectionManager} from "./ConnectionManager"; import {UrlUtils} from "../utils"; import {WorkspaceFsCommands} from "../workspace-fs"; import {ConfigModel} from "./models/ConfigModel"; +import {saveNewProfile} from "./LoginWizard"; +import {PersonalAccessTokenAuthProvider} from "./auth/AuthProvider"; +import {normalizeHost} from "../utils/urlUtils"; function formatQuickPickClusterSize(sizeInMB: number): string { if (sizeInMB > 1024) { @@ -73,6 +76,19 @@ export class ConnectionCommands implements Disposable { ); } + // This command is not exposed to users. + // We use it to test new profile flow in e2e tests. + async saveNewProfileCommand(name: string) { + const host = this.connectionManager.workspaceClient?.config.host; + const token = this.connectionManager.workspaceClient?.config.token; + if (!host || !token) { + throw new Error("Must login first"); + } + const hostUrl = normalizeHost(host); + const provider = new PersonalAccessTokenAuthProvider(hostUrl, token); + await saveNewProfile(name, provider); + } + /** * Attach to cluster from settings. If attach fails or no cluster is configured * then show dialog to select (or create) a cluster. The selected cluster is saved diff --git a/packages/databricks-vscode/src/configuration/LoginWizard.ts b/packages/databricks-vscode/src/configuration/LoginWizard.ts index c9b93714f..ea55cc320 100644 --- a/packages/databricks-vscode/src/configuration/LoginWizard.ts +++ b/packages/databricks-vscode/src/configuration/LoginWizard.ts @@ -387,7 +387,7 @@ export async function saveNewProfile( // Create a backup for .databrickscfg const backup = path.join( path.dirname(configFilePath), - `.databrickscfg.${new Date().toISOString()}.bak` + `.databrickscfg.${Date.now()}.bak` ); await copyFile(configFilePath, backup); window.showInformationMessage( diff --git a/packages/databricks-vscode/src/configuration/auth/AuthProvider.ts b/packages/databricks-vscode/src/configuration/auth/AuthProvider.ts index c9b19ae1f..db00aea46 100644 --- a/packages/databricks-vscode/src/configuration/auth/AuthProvider.ts +++ b/packages/databricks-vscode/src/configuration/auth/AuthProvider.ts @@ -204,9 +204,7 @@ export class ProfileAuthProvider extends AuthProvider { public static getSdkConfig(profile: string): Config { return new Config({ profile: profile, - configFile: - workspaceConfigs.databrickscfgLocation ?? - process.env.DATABRICKS_CONFIG_FILE, + configFile: workspaceConfigs.databrickscfgLocation, env: {}, }); } diff --git a/packages/databricks-vscode/src/extension.ts b/packages/databricks-vscode/src/extension.ts index 3d67693d1..40ab67352 100644 --- a/packages/databricks-vscode/src/extension.ts +++ b/packages/databricks-vscode/src/extension.ts @@ -486,6 +486,11 @@ export async function activate( "databricks.connection.detachCluster", connectionCommands.detachClusterCommand(), connectionCommands + ), + telemetry.registerCommand( + "databricks.connection.saveNewProfile", + connectionCommands.saveNewProfileCommand, + connectionCommands ) ); diff --git a/packages/databricks-vscode/src/test/e2e/auth.e2e.ts b/packages/databricks-vscode/src/test/e2e/auth.e2e.ts new file mode 100644 index 000000000..bf569943b --- /dev/null +++ b/packages/databricks-vscode/src/test/e2e/auth.e2e.ts @@ -0,0 +1,141 @@ +import path from "node:path"; +import assert from "node:assert"; +import * as fs from "fs/promises"; +import { + dismissNotifications, + waitForInput, + getViewSection, + waitForLogin, +} from "./utils.ts"; +import {CustomTreeSection} from "wdio-vscode-service"; + +const BUNDLE = ` +bundle: + name: hello_test + +targets: + dev_test: + mode: development + default: true + workspace: + host: _HOST_ +`; + +let projectDir: string; +let bundleConfig: string; +let cfgPath: string; +let cfgContent: Buffer; + +describe("Configure Databricks Extension", async function () { + this.timeout(3 * 60 * 1000); + + before(async function () { + assert(process.env.WORKSPACE_PATH, "WORKSPACE_PATH doesn't exist"); + assert( + process.env.DATABRICKS_CONFIG_FILE, + "DATABRICKS_CONFIG_FILE doesn't exist" + ); + cfgPath = process.env.DATABRICKS_CONFIG_FILE; + projectDir = process.env.WORKSPACE_PATH; + bundleConfig = path.join(projectDir, "databricks.yml"); + cfgContent = await fs.readFile(cfgPath); + }); + + after(async function () { + await fs.unlink(bundleConfig); + if (cfgContent) { + await fs.writeFile(cfgPath, cfgContent); + } + }); + + it("should open VSCode and dismiss notifications", async function () { + const workbench = await browser.getWorkbench(); + const title = await workbench.getTitleBar().getTitle(); + assert( + title.indexOf("[Extension Development Host]") >= 0, + "Unexpected VSCode title" + ); + await dismissNotifications(); + }); + + it("should wait for a welcome screen", async () => { + const section = await getViewSection("CONFIGURATION"); + const welcomeButtons = await browser.waitUntil(async () => { + const welcome = await section!.findWelcomeContent(); + const buttons = await welcome!.getButtons(); + if (buttons?.length >= 2) { + return buttons; + } + }); + assert(welcomeButtons, "Welcome buttons don't exist"); + const initTitle = await welcomeButtons[0].getTitle(); + const quickStartTitle = await welcomeButtons[1].getTitle(); + assert( + initTitle.toLowerCase().includes("initialize"), + "'initialize` button doesn't exist" + ); + assert( + quickStartTitle.toLowerCase().includes("quickstart"), + "'quickstart' button doesn't exist" + ); + }); + + it("should automatically login after detecting bundle configuration", async () => { + assert(process.env.DATABRICKS_HOST, "DATABRICKS_HOST doesn't exist"); + await fs.writeFile( + bundleConfig, + BUNDLE.replace("_HOST_", process.env.DATABRICKS_HOST) + ); + await waitForLogin("DEFAULT"); + }); + + it("should create new profile", async () => { + // We create a new profile programmatically to avoid leaking tokens through screenshots or video reporters. + // We still trigger similar code path to the UI flow. + await browser.executeWorkbench(async (vscode) => { + await vscode.commands.executeCommand( + "databricks.connection.saveNewProfile", + "NEW_PROFILE" + ); + }); + }); + + it("should change profiles", async () => { + const section = (await getViewSection( + "CONFIGURATION" + )) as CustomTreeSection; + assert(section, "CONFIGURATION section doesn't exist"); + const signInButton = await browser.waitUntil( + async () => { + const items = await section.getVisibleItems(); + for (const item of items) { + const label = await item.getLabel(); + if (label.toLowerCase().includes("auth type")) { + return item.getActionButton("Sign in"); + } + } + }, + {timeout: 10_000} + ); + assert(signInButton, "Sign In button doesn't exist"); + (await signInButton.elem).click(); + + const authMethodInput = await waitForInput(); + const newProfilePick = + await authMethodInput.findQuickPick("NEW_PROFILE"); + assert( + newProfilePick, + "NEW_PROFILE is absent in the quick pick selection" + ); + await newProfilePick.select(); + await waitForLogin("NEW_PROFILE"); + }); + + it("should pick up new profile after reloading", async () => { + const workbench = await driver.getWorkbench(); + const editorView = workbench.getEditorView(); + await editorView.closeAllEditors(); + await workbench.executeCommand("Developer: Reload Window"); + await waitForLogin("NEW_PROFILE"); + }); +}); diff --git a/packages/databricks-vscode/src/test/e2e/configure.e2e.ts b/packages/databricks-vscode/src/test/e2e/configure.e2e.ts deleted file mode 100644 index d3c57d4ca..000000000 --- a/packages/databricks-vscode/src/test/e2e/configure.e2e.ts +++ /dev/null @@ -1,198 +0,0 @@ -import assert from "node:assert"; -import path from "node:path"; -import * as fs from "fs/promises"; -import { - dismissNotifications, - getViewSection, - waitForTreeItems, -} from "./utils.ts"; -import { - CustomTreeSection, - InputBox, - sleep, - TreeItem, - Workbench, -} from "wdio-vscode-service"; -import {expect} from "chai"; - -describe("Configure Databricks Extension", async function () { - // this will be populated by the tests - let clusterId: string; - let projectDir: string; - let host: string; - let workbench: Workbench; - - this.timeout(3 * 60 * 1000); - - before(async function () { - assert( - process.env.TEST_DEFAULT_CLUSTER_ID, - "TEST_DEFAULT_CLUSTER_ID env var doesn't exist" - ); - assert( - process.env.WORKSPACE_PATH, - "WORKSPACE_PATH env var doesn't exist" - ); - assert( - process.env.DATABRICKS_HOST, - "DATABRICKS_HOST env var doesn't exist" - ); - clusterId = process.env.TEST_DEFAULT_CLUSTER_ID; - projectDir = process.env.WORKSPACE_PATH; - host = process.env.DATABRICKS_HOST; - workbench = await browser.getWorkbench(); - await dismissNotifications(); - }); - - it("should open VSCode", async function () { - const title = await workbench.getTitleBar().getTitle(); - assert(title.indexOf("[Extension Development Host]") >= 0); - }); - - it("should dismiss notifications", async function () { - //Collect all notifications - sleep(2000); - const notifications = await workbench.getNotifications(); - for (const n of notifications) { - await n.dismiss(); - } - }); - - it("should wait for quickstart", async () => { - const section = await getViewSection("CONFIGURATION"); - assert(section); - const welcome = await section.findWelcomeContent(); - assert(welcome); - await browser.waitUntil( - async () => { - return ( - ( - await ( - await workbench.getEditorView().getEditorGroup(0) - ).getOpenTabs() - ).findIndex(async (value) => { - return (await value.getTitle()).includes( - "DATABRICKS.quickstart.md" - ); - }) !== -1 - ); - }, - {timeout: 5000} - ); - - //Wait for quickstart text to be visible. - sleep(2000); - }); - - it("should open databricks panel and login", async function () { - const section = await getViewSection("CONFIGURATION"); - assert(section); - const welcome = await section.findWelcomeContent(); - assert(welcome); - const buttons = await welcome.getButtons(); - assert(buttons); - assert(buttons.length > 0); - - let input: InputBox | undefined; - await browser.waitUntil( - async () => { - await (await buttons[0].elem).click(); - - input = await new InputBox(workbench.locatorMap).wait(); - return input !== undefined; - }, - {timeout: 3000, interval: 500} - ); - - assert(input !== undefined); - while (await input.hasProgress()) { - await sleep(500); - } - - await input.confirm(); - await sleep(1000); - - input = await new InputBox(workbench.locatorMap).wait(); - while (await input.hasProgress()) { - await sleep(500); - } - - await input.selectQuickPick("DEFAULT"); - - assert(await waitForTreeItems(section, 10_000)); - }); - - it("should attach cluster", async function () { - const config = await getViewSection("CONFIGURATION"); - assert(config); - const configTree = config as CustomTreeSection; - - assert(await waitForTreeItems(configTree)); - - const configItems = await configTree.getVisibleItems(); - - let clusterConfigItem: TreeItem | undefined; - for (const i of configItems) { - const label = await i.getLabel(); - if (label.startsWith("Cluster")) { - clusterConfigItem = i; - break; - } - } - assert(clusterConfigItem); - - const buttons = await ( - clusterConfigItem as TreeItem - ).getActionButtons(); - - const configureButton = buttons.filter((b) => { - return b.getLabel() === "Configure cluster"; - })[0]; - assert(configureButton); - - await configureButton.elem.click(); - - const input = await new InputBox(workbench.locatorMap).wait(); - await sleep(200); - - await input.setText(clusterId); - await sleep(500); - await input.confirm(); - - // wait for tree to update - let clusterPropsItems; - do { - await sleep(200); - clusterPropsItems = await clusterConfigItem.getChildren(); - } while (clusterPropsItems.length <= 1); - - // get cluster ID - const clusterProps: Record = {}; - for (const i of clusterPropsItems) { - clusterProps[await i.getLabel()] = (await i.getDescription()) || ""; - } - - const testClusterId = clusterProps["Cluster ID"]; - assert.equal(testClusterId, clusterId); - }); - - it("should write the project config file", async function () { - const projectConfig = JSON.parse( - await fs.readFile( - path.join(projectDir, ".databricks", "project.json"), - "utf-8" - ) - ); - - const expectedHost = new URL( - host.startsWith("https") ? host : `https://${host}` - ).toString(); - - expect(projectConfig).to.include({ - host: expectedHost, - authType: "profile", - profile: "DEFAULT", - clusterId, - }); - }); -}); diff --git a/packages/databricks-vscode/src/test/e2e/init.e2e.ts b/packages/databricks-vscode/src/test/e2e/init.e2e.ts new file mode 100644 index 000000000..08696936a --- /dev/null +++ b/packages/databricks-vscode/src/test/e2e/init.e2e.ts @@ -0,0 +1,99 @@ +import assert from "node:assert"; +import { + dismissNotifications, + waitForInput, + getTabByTitle, + getViewSection, + waitForTreeItems, +} from "./utils.ts"; +import {sleep, Workbench} from "wdio-vscode-service"; +import {Key} from "webdriverio"; +import {tmpdir} from "node:os"; + +describe("Configure Databricks Extension", async function () { + let workbench: Workbench; + + this.timeout(3 * 60 * 1000); + + before(async function () { + assert( + process.env.TEST_DEFAULT_CLUSTER_ID, + "TEST_DEFAULT_CLUSTER_ID env var doesn't exist" + ); + assert( + process.env.WORKSPACE_PATH, + "WORKSPACE_PATH env var doesn't exist" + ); + assert( + process.env.DATABRICKS_HOST, + "DATABRICKS_HOST env var doesn't exist" + ); + workbench = await browser.getWorkbench(); + await dismissNotifications(); + }); + + it("should wait for initializaion", async () => { + const section = await getViewSection("CONFIGURATION"); + assert(section); + await waitForTreeItems(section); + }); + + it("should manually login for a new project initialization", async function () { + await browser.executeWorkbench((vscode) => { + vscode.commands.executeCommand("databricks.bundle.initNewProject"); + }); + + const hostSelectionInput = await waitForInput(); + await hostSelectionInput.confirm(); + + await sleep(1000); + + const profileSelectionInput = await waitForInput(); + await profileSelectionInput.selectQuickPick("DEFAULT"); + }); + + it("should initialize new project", async function () { + const parentDir = tmpdir(); + const parentFolderInput = await waitForInput(); + // Type in the parentDir value to the input + await browser.keys(parentDir); + await sleep(1000); + const picks = await parentFolderInput.getQuickPicks(); + const pick = picks.filter((p) => p.getIndex() === 0)[0]; + assert(pick, "Parent folder quick pick doesn't have any items"); + expect(await pick.getLabel()).toBe(parentDir); + await pick.select(); + + const editorView = workbench.getEditorView(); + const title = "Databricks Project Init"; + const initTab = await getTabByTitle(title); + assert(initTab, "Can't find a tab for project-init terminal wizard"); + await initTab.select(); + await browser.waitUntil( + async () => { + const activeTab = await editorView.getActiveTab(); + if ((await activeTab?.getTitle()) !== title) { + return true; + } + await browser.keys([Key.Enter]); + }, + {timeout: 20_000, interval: 2_000} + ); + + const openProjectFolderInput = await waitForInput(); + await openProjectFolderInput.selectQuickPick("my_project"); + + // Wait until vscode is re-opened with the new workspace root + await browser.waitUntil( + async () => { + const workspaceRoot = await browser.executeWorkbench( + (vscode) => { + return vscode.workspace.workspaceFolders[0].uri.fsPath; + } + ); + return workspaceRoot.includes("my_project"); + }, + {timeout: 20_000} + ); + }); +}); diff --git a/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_repo.e2e.ts b/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_repo.e2e.ts index f5da1099c..0de7be450 100644 --- a/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_repo.e2e.ts +++ b/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_repo.e2e.ts @@ -10,7 +10,7 @@ import { } from "./utils.ts"; import {sleep} from "wdio-vscode-service"; -describe("Run job on cluster with repo", async function () { +describe.skip("Run job on cluster with repo", async function () { let projectDir: string; this.timeout(2 * 60 * 1000); diff --git a/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_workspace.e2e.ts b/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_workspace.e2e.ts index 6c81f10df..365db1430 100644 --- a/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_workspace.e2e.ts +++ b/packages/databricks-vscode/src/test/e2e/run_job_on_cluster_with_workspace.e2e.ts @@ -11,7 +11,7 @@ import { } from "./utils.ts"; import {sleep} from "wdio-vscode-service"; -describe("Run job on cluster with workspace", async function () { +describe.skip("Run job on cluster with workspace", async function () { let projectDir: string; this.timeout(2 * 60 * 1000); diff --git a/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_repo.e2e.ts b/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_repo.e2e.ts index 45dd291a3..c92047c06 100644 --- a/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_repo.e2e.ts +++ b/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_repo.e2e.ts @@ -10,7 +10,7 @@ import { } from "./utils.ts"; import {sleep} from "wdio-vscode-service"; -describe("Run python on cluster with repo", async function () { +describe.skip("Run python on cluster with repo", async function () { let projectDir: string; this.timeout(3 * 60 * 1000); diff --git a/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_workspace.e2e.ts b/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_workspace.e2e.ts index 94c689dbd..a23ddd2b4 100644 --- a/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_workspace.e2e.ts +++ b/packages/databricks-vscode/src/test/e2e/run_on_cluster_with_workspace.e2e.ts @@ -10,7 +10,7 @@ import { } from "./utils.ts"; import {sleep} from "wdio-vscode-service"; -describe("Run python on cluster with workspace", async function () { +describe.skip("Run python on cluster with workspace", async function () { let projectDir: string; this.timeout(3 * 60 * 1000); diff --git a/packages/databricks-vscode/src/test/e2e/utils.ts b/packages/databricks-vscode/src/test/e2e/utils.ts index 0b1645005..6893e2ab1 100644 --- a/packages/databricks-vscode/src/test/e2e/utils.ts +++ b/packages/databricks-vscode/src/test/e2e/utils.ts @@ -5,6 +5,7 @@ import { TreeItem, ViewControl, ViewSection, + InputBox, } from "wdio-vscode-service"; // eslint-disable-next-line @typescript-eslint/naming-convention @@ -204,3 +205,59 @@ export async function startSyncIfStopped() { } ); } + +export async function getTabByTitle(title: string) { + const workbench = await browser.getWorkbench(); + return await browser.waitUntil( + async () => { + console.log("Searching for a tab with title:", title); + const tabs = await workbench.getEditorView().getOpenTabs(); + for (const tab of tabs) { + const tabTitle = await tab.getTitle(); + console.log("Found a tab:", tabTitle); + if (tabTitle.includes(title)) { + return tab; + } + } + }, + {timeout: 5000} + ); +} + +export async function waitForInput() { + const workbench = await browser.getWorkbench(); + let input: InputBox | undefined; + await browser.waitUntil( + async () => { + if (!input) { + input = await new InputBox(workbench.locatorMap).wait(); + } + if (input) { + return !(await input.hasProgress()); + } + return false; + }, + {timeout: 10000} + ); + return input!; +} + +export async function waitForLogin(profileName: string) { + await browser.waitUntil( + async () => { + const section = (await getViewSection( + "CONFIGURATION" + )) as CustomTreeSection; + assert(section, "CONFIGURATION section doesn't exist"); + const items = await section.getVisibleItems(); + for (const item of items) { + const label = await item.getLabel(); + if (label.toLowerCase().includes("auth type")) { + const desc = await item.getDescription(); + return desc?.includes(profileName); + } + } + }, + {timeout: 20_000} + ); +} diff --git a/packages/databricks-vscode/src/test/e2e/wdio.conf.ts b/packages/databricks-vscode/src/test/e2e/wdio.conf.ts index 62dad5722..e65e446ff 100644 --- a/packages/databricks-vscode/src/test/e2e/wdio.conf.ts +++ b/packages/databricks-vscode/src/test/e2e/wdio.conf.ts @@ -196,6 +196,9 @@ export const config: Options.Testrunner = { // commands. Instead, they hook themselves up into the test process. services: [["vscode", {cachePath: "/tmp/wdio-vscode-service"}]], + // cahePath above is for vscode binaries, this one is for the chromedriver + cacheDir: "/tmp/wdio-vscode-service", + // Framework you want to run your specs with. // The following are supported: Mocha, Jasmine, and Cucumber // see also: https://webdriver.io/docs/frameworks @@ -531,11 +534,6 @@ export const config: Options.Testrunner = { }; async function writeDatabricksConfig(config: Config) { - assert( - process.env["TEST_DEFAULT_CLUSTER_ID"], - "Environment variable TEST_DEFAULT_CLUSTER_ID must be set" - ); - const configFile = path.join(WORKSPACE_PATH, ".databrickscfg"); await fs.writeFile( configFile, @@ -543,7 +541,6 @@ async function writeDatabricksConfig(config: Config) { host = ${config.host!} token = ${config.token!}` ); - return configFile; } diff --git a/packages/databricks-vscode/src/utils/fileUtils.ts b/packages/databricks-vscode/src/utils/fileUtils.ts index 2aa7b0d94..53cf03eb7 100644 --- a/packages/databricks-vscode/src/utils/fileUtils.ts +++ b/packages/databricks-vscode/src/utils/fileUtils.ts @@ -54,7 +54,6 @@ export async function openDatabricksConfigFile() { const homeDir = getHomedir(); let filePath = workspaceConfigs.databrickscfgLocation ?? - process.env.DATABRICKS_CONFIG_FILE ?? path.join(homeDir, ".databrickscfg"); if (filePath.startsWith("~/")) { diff --git a/packages/databricks-vscode/src/vscode-objs/WorkspaceConfigs.ts b/packages/databricks-vscode/src/vscode-objs/WorkspaceConfigs.ts index 6dffaac0e..3d4d439b9 100644 --- a/packages/databricks-vscode/src/vscode-objs/WorkspaceConfigs.ts +++ b/packages/databricks-vscode/src/vscode-objs/WorkspaceConfigs.ts @@ -63,7 +63,7 @@ export const workspaceConfigs = { const config = workspace .getConfiguration("databricks") .get("overrideDatabricksConfigFile"); - return config === "" || config === undefined ? undefined : config; + return config || process.env.DATABRICKS_CONFIG_FILE || undefined; }, get userEnvFile() { diff --git a/yarn.lock b/yarn.lock index 9e00a75b8..62efd8d7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -584,13 +584,13 @@ __metadata: languageName: node linkType: hard -"@fastify/cors@npm:^8.3.0": - version: 8.3.0 - resolution: "@fastify/cors@npm:8.3.0" +"@fastify/cors@npm:^9.0.1": + version: 9.0.1 + resolution: "@fastify/cors@npm:9.0.1" dependencies: fastify-plugin: ^4.0.0 - mnemonist: 0.39.5 - checksum: f487b5a8823264c3db58e99df020e38ada524514d60f2c5c2e01b994519545e2fc9481006d98e485b40e536b9b89f72af9061d9377b8e93f6ce07b14d40164a2 + mnemonist: 0.39.6 + checksum: 3b5618b59ba63636b233b5ac54f061132da53364a98b52a61db57f9fd87678bbe22589411e11b454ad2bf6a5e69e7b9514a9d587c56e28c84aa4b50ea836e380 languageName: node linkType: hard @@ -601,7 +601,7 @@ __metadata: languageName: node linkType: hard -"@fastify/error@npm:^3.4.0": +"@fastify/error@npm:^3.3.0, @fastify/error@npm:^3.4.0": version: 3.4.1 resolution: "@fastify/error@npm:3.4.1" checksum: 2c2e98c33327884c0927a73e8c3b8f162acbf1e4d058bacb68bca0c3607f36d6fde8c376fde45b2097e724d450266f8bb29134305fa24aabd200f83f087c7321 @@ -630,18 +630,17 @@ __metadata: languageName: node linkType: hard -"@fastify/static@npm:^6.10.2": - version: 6.10.2 - resolution: "@fastify/static@npm:6.10.2" +"@fastify/static@npm:^7.0.1": + version: 7.0.1 + resolution: "@fastify/static@npm:7.0.1" dependencies: "@fastify/accept-negotiator": ^1.0.0 "@fastify/send": ^2.0.0 content-disposition: ^0.5.3 fastify-plugin: ^4.0.0 - glob: ^8.0.1 - p-limit: ^3.1.0 - readable-stream: ^4.0.0 - checksum: 724fe72346ff0fa280f6a281ebcf784a7ede9da3e49cc28c19c7f2a2886d25c735883f77ff99fc13425b4a1d3cb831f7b21a20a1996db221cfec2cfa25e9c3c8 + fastq: ^1.17.0 + glob: ^10.3.4 + checksum: d6038dd14c4d5814c24c79083cdd2fb10978c534c65f033fef4b8f3ffe17fe255234199c3b017d8d23951030a92baf55f996d7b8c01e84e40c2008239c5ca643 languageName: node linkType: hard @@ -659,7 +658,7 @@ __metadata: languageName: node linkType: hard -"@ffmpeg-installer/ffmpeg@npm:^1.0.20": +"@ffmpeg-installer/ffmpeg@npm:^1.1.0": version: 1.1.0 resolution: "@ffmpeg-installer/ffmpeg@npm:1.1.0" dependencies: @@ -889,7 +888,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -1493,7 +1492,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^18.0.0": +"@types/node@npm:*": version: 18.15.11 resolution: "@types/node@npm:18.15.11" checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 @@ -1618,21 +1617,21 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.3": - version: 8.5.4 - resolution: "@types/ws@npm:8.5.4" +"@types/ws@npm:^8.5.10": + version: 8.5.10 + resolution: "@types/ws@npm:8.5.10" dependencies: "@types/node": "*" - checksum: fefbad20d211929bb996285c4e6f699b12192548afedbe4930ab4384f8a94577c9cd421acaad163cacd36b88649509970a05a0b8f20615b30c501ed5269038d1 + checksum: 3ec416ea2be24042ebd677932a462cf16d2080393d8d7d0b1b3f5d6eaa4a7387aaf0eefb99193c0bfd29444857cf2e0c3ac89899e130550dc6c14ada8a46d25e languageName: node linkType: hard -"@types/ws@npm:^8.5.5": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" +"@types/ws@npm:^8.5.3": + version: 8.5.4 + resolution: "@types/ws@npm:8.5.4" dependencies: "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a + checksum: fefbad20d211929bb996285c4e6f699b12192548afedbe4930ab4384f8a94577c9cd421acaad163cacd36b88649509970a05a0b8f20615b30c501ed5269038d1 languageName: node linkType: hard @@ -1799,6 +1798,17 @@ __metadata: languageName: node linkType: hard +"@vitest/snapshot@npm:^1.2.2": + version: 1.3.0 + resolution: "@vitest/snapshot@npm:1.3.0" + dependencies: + magic-string: ^0.30.5 + pathe: ^1.1.1 + pretty-format: ^29.7.0 + checksum: cdf589c08be416929461dcafa89c2529a09968b0f5a7bbb47a0a7264c72a4f923f12ed4c1d6d64a20a81277bd26ba71f0a47a0804a145beaf479dd8c8de17232 + languageName: node + linkType: hard + "@vscode/debugadapter@npm:^1.64.0": version: 1.64.0 resolution: "@vscode/debugadapter@npm:1.64.0" @@ -1826,7 +1836,7 @@ __metadata: languageName: node linkType: hard -"@vscode/test-electron@npm:^2.3.4, @vscode/test-electron@npm:^2.3.8": +"@vscode/test-electron@npm:^2.3.8": version: 2.3.8 resolution: "@vscode/test-electron@npm:2.3.8" dependencies: @@ -1852,17 +1862,17 @@ __metadata: languageName: node linkType: hard -"@wdio/allure-reporter@npm:^8.7.0": - version: 8.8.0 - resolution: "@wdio/allure-reporter@npm:8.8.0" +"@wdio/allure-reporter@npm:^8.28.6": + version: 8.32.2 + resolution: "@wdio/allure-reporter@npm:8.32.2" dependencies: - "@types/node": ^18.0.0 - "@wdio/reporter": 8.8.0 - "@wdio/types": 8.8.0 - allure-js-commons: ^2.0.0 + "@types/node": ^20.1.0 + "@wdio/reporter": 8.32.2 + "@wdio/types": 8.32.2 + allure-js-commons: ^2.5.0 csv-stringify: ^6.0.4 - strip-ansi: ^6.0.0 - checksum: efe239141b0060bd507390892f2a7c4900fe812be1426a7acd451bde3638e08fc0d4ee5b910f88f1b089eccada23b078abc7bcf08fa96084eabe6db270e74bf6 + strip-ansi: ^7.1.0 + checksum: a0ef63804c934d33d21ff008448c85f0ce7a55c771f4906904b7db6865052975ace3ce162320d33d472789ca522f7a4001c70501058e85f99689f461810d63d2 languageName: node linkType: hard @@ -1914,6 +1924,21 @@ __metadata: languageName: node linkType: hard +"@wdio/config@npm:8.32.2": + version: 8.32.2 + resolution: "@wdio/config@npm:8.32.2" + dependencies: + "@wdio/logger": 8.28.0 + "@wdio/types": 8.32.2 + "@wdio/utils": 8.32.2 + decamelize: ^6.0.0 + deepmerge-ts: ^5.0.0 + glob: ^10.2.2 + import-meta-resolve: ^4.0.0 + checksum: 5cd2e05449e9382aad4214934c71c444d797e43090461f3272e5eed093ca0efdd0f18927710c4cbece9ad224204046a0070de8e176710fbbaa82e8238abb90a1 + languageName: node + linkType: hard + "@wdio/globals@npm:8.26.1, @wdio/globals@npm:^8.23.1": version: 8.26.1 resolution: "@wdio/globals@npm:8.26.1" @@ -1929,6 +1954,21 @@ __metadata: languageName: node linkType: hard +"@wdio/globals@npm:^8.28.8, @wdio/globals@npm:^8.29.3": + version: 8.32.2 + resolution: "@wdio/globals@npm:8.32.2" + dependencies: + expect-webdriverio: ^4.11.2 + webdriverio: 8.32.2 + dependenciesMeta: + expect-webdriverio: + optional: true + webdriverio: + optional: true + checksum: 87e96a776b26676dda0e44e6f6b5c4db09599af537505c5930688489a94a347e8baab58993238110a9a2e69ed9c9375c8eb2eaa20b1e817935657f34dd3c1e96 + languageName: node + linkType: hard + "@wdio/local-runner@npm:^8.26.1": version: 8.26.1 resolution: "@wdio/local-runner@npm:8.26.1" @@ -1957,27 +1997,15 @@ __metadata: languageName: node linkType: hard -"@wdio/logger@npm:8.6.6, @wdio/logger@npm:^8.1.0": - version: 8.6.6 - resolution: "@wdio/logger@npm:8.6.6" - dependencies: - chalk: ^5.1.2 - loglevel: ^1.6.0 - loglevel-plugin-prefix: ^0.8.4 - strip-ansi: ^6.0.0 - checksum: b17effd00f0b5f4450b83e4d65e0f29bc60bc19a53b9c44fc3569e14bd53bcf6c0dfc8da517ddf639da503c1e68491ec20f97fddbb78b34d8b20136f7a60a4fe - languageName: node - linkType: hard - -"@wdio/logger@npm:^8.11.0": - version: 8.11.0 - resolution: "@wdio/logger@npm:8.11.0" +"@wdio/logger@npm:8.28.0, @wdio/logger@npm:^8.28.0": + version: 8.28.0 + resolution: "@wdio/logger@npm:8.28.0" dependencies: chalk: ^5.1.2 loglevel: ^1.6.0 loglevel-plugin-prefix: ^0.8.4 strip-ansi: ^7.1.0 - checksum: b62d0db074240a993c72d95793606d4fa7890fcbebdff5e344bf5c7be90f8189e94432056c1fbb5e636a74b0f036a8a1d88af6c04e4c01e436e9dfab7048f638 + checksum: d7fe9d1d0b58fa73f1d34b2d1ab54993cfc535564a108e6488df30882bdf9c03602cf3010f2790c162352cea0771c1b44051d01d468dc1cd5c3e6b77afa4e76f languageName: node linkType: hard @@ -2002,6 +2030,13 @@ __metadata: languageName: node linkType: hard +"@wdio/protocols@npm:8.32.0": + version: 8.32.0 + resolution: "@wdio/protocols@npm:8.32.0" + checksum: 19481090b7de1428f0c1c048ee72ad6136cf136ee7ecbe1bebdedd4362998e184f1dcb26d5dd51880ffbe1f216c5d57a2d5338f81b343c1cd9a1bb15ce48f2da + languageName: node + linkType: hard + "@wdio/repl@npm:8.24.12": version: 8.24.12 resolution: "@wdio/repl@npm:8.24.12" @@ -2024,17 +2059,16 @@ __metadata: languageName: node linkType: hard -"@wdio/reporter@npm:8.8.0, @wdio/reporter@npm:^8.7.0": - version: 8.8.0 - resolution: "@wdio/reporter@npm:8.8.0" +"@wdio/reporter@npm:8.32.2, @wdio/reporter@npm:^8.28.6": + version: 8.32.2 + resolution: "@wdio/reporter@npm:8.32.2" dependencies: - "@types/node": ^18.0.0 - "@wdio/logger": 8.6.6 - "@wdio/types": 8.8.0 + "@types/node": ^20.1.0 + "@wdio/logger": 8.28.0 + "@wdio/types": 8.32.2 diff: ^5.0.0 object-inspect: ^1.12.0 - supports-color: 9.3.1 - checksum: 3ba458529ab9f70af63aa1af1f505939ef33c350dd69fbf980987c18f7e727528c3fefc25e43678e70d63780fb1371b36a20640a53b8f274f361db2e812b82c2 + checksum: 209922f4ede5672a164376e458e94873f2c919963a5a60db33f1db9b5985139848338726ac888bce091e01f613d5dfa1b8956087e55008cf784ca993e11d4720 languageName: node linkType: hard @@ -2079,12 +2113,12 @@ __metadata: languageName: node linkType: hard -"@wdio/types@npm:8.8.0": - version: 8.8.0 - resolution: "@wdio/types@npm:8.8.0" +"@wdio/types@npm:8.32.2": + version: 8.32.2 + resolution: "@wdio/types@npm:8.32.2" dependencies: - "@types/node": ^18.0.0 - checksum: 4a1cbe1c34376e04dfcaddd89d6950d2d2e3b2b1a97874c6223abc8e24e4d60a7e2227879e3ff1a80a2a3fe42793b910abd9cee5d2523c13c3871657659a8b1d + "@types/node": ^20.1.0 + checksum: d44c11a13a5c7a69a97f42963c2576dc4e7fe46a44b10df5b0d5b45f5ea1a472bca34ab4b0b3b80a227c43cea7aac075efb1fe75595059812315460b54c3d33a languageName: node linkType: hard @@ -2109,6 +2143,27 @@ __metadata: languageName: node linkType: hard +"@wdio/utils@npm:8.32.2": + version: 8.32.2 + resolution: "@wdio/utils@npm:8.32.2" + dependencies: + "@puppeteer/browsers": ^1.6.0 + "@wdio/logger": 8.28.0 + "@wdio/types": 8.32.2 + decamelize: ^6.0.0 + deepmerge-ts: ^5.1.0 + edgedriver: ^5.3.5 + geckodriver: ^4.3.1 + get-port: ^7.0.0 + import-meta-resolve: ^4.0.0 + locate-app: ^2.1.0 + safaridriver: ^0.1.0 + split2: ^4.2.0 + wait-port: ^1.0.4 + checksum: a8c918e419095b4f5bafb3aed3f735cc3d6cb99b594bc7d3b3c6dcab637a9a14088d85f6f20e6d76d4ce41748d600900fc4ecdacc23cfe833601592c1c5531b6 + languageName: node + linkType: hard + "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -2269,13 +2324,13 @@ __metadata: languageName: node linkType: hard -"allure-js-commons@npm:^2.0.0": - version: 2.1.0 - resolution: "allure-js-commons@npm:2.1.0" +"allure-js-commons@npm:^2.5.0": + version: 2.12.2 + resolution: "allure-js-commons@npm:2.12.2" dependencies: properties: ^1.2.1 - uuid: ^8.3.0 - checksum: 54b61a907445a134169d3e2e446eeb95928e7ce40b873d7352d1c5ff66141dcb369591a04c424562e6cf7662907b0e7635dcc86ff3dc6874c28898e235e860a4 + strip-ansi: ^5.2.0 + checksum: 3a87e779c442d9136441df5e7205ce98de9401f1ab39a19b49f4e31f53d706d1a74a9e73a11a0c94551977a1677c627e3c3e97dceed59bd2d7b228d54039fee8 languageName: node linkType: hard @@ -2295,6 +2350,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^4.1.0": + version: 4.1.1 + resolution: "ansi-regex@npm:4.1.1" + checksum: b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888 + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -2551,14 +2613,15 @@ __metadata: languageName: node linkType: hard -"avvio@npm:^8.2.1": - version: 8.2.1 - resolution: "avvio@npm:8.2.1" +"avvio@npm:^8.3.0": + version: 8.3.0 + resolution: "avvio@npm:8.3.0" dependencies: + "@fastify/error": ^3.3.0 archy: ^1.0.0 debug: ^4.0.0 - fastq: ^1.6.1 - checksum: 4c96922ea123d13b26cb78a071a8989fde62ee8580352b6d2f05b7976ed3d23efa663c12ee1be35501dfe65e12a769a2ea522bcdb7ca35a5ba4d86766467075a + fastq: ^1.17.1 + checksum: cba04eebda50ca0c60868dbaa4309b322662684bc1474f0b96c4458b82511edeb8ff8e3524a49a9e23e1e7f8d41d6d40bdc1fdaa41075280dd9b06f98dddc11d languageName: node linkType: hard @@ -3683,8 +3746,8 @@ __metadata: ts-node: ^10.9.2 typescript: ^5.3.3 vsce: ^2.15.0 - wdio-video-reporter: ^4.0.5 - wdio-vscode-service: ^5.2.2 + wdio-video-reporter: ^5.1.4 + wdio-vscode-service: ^6.0.2 winston: ^3.11.0 yaml: ^2.3.4 yargs: ^17.7.2 @@ -3703,18 +3766,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.3.1": - version: 4.3.1 - resolution: "debug@npm:4.3.1" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 2c3352e37d5c46b0d203317cd45ea0e26b2c99f2d9dfec8b128e6ceba90dfb65425f5331bf3020fe9929d7da8c16758e737f4f3bfc0fce6b8b3d503bae03298b - languageName: node - linkType: hard - "decamelize@npm:6.0.0, decamelize@npm:^6.0.0": version: 6.0.0 resolution: "decamelize@npm:6.0.0" @@ -3960,6 +4011,13 @@ __metadata: languageName: node linkType: hard +"devtools-protocol@npm:^0.0.1261483": + version: 0.0.1261483 + resolution: "devtools-protocol@npm:0.0.1261483" + checksum: 7b7497d1f17a21ea0b910fc8f0a9d65067a8bea5d31160ed730c7ea8e8ebad8ec2229fb26f42b38f09babd2eff9322f2fd9f8c06104c4c0c00808d23608928b5 + languageName: node + linkType: hard + "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -4703,6 +4761,28 @@ __metadata: languageName: node linkType: hard +"expect-webdriverio@npm:^4.11.2": + version: 4.11.8 + resolution: "expect-webdriverio@npm:4.11.8" + dependencies: + "@vitest/snapshot": ^1.2.2 + "@wdio/globals": ^8.29.3 + "@wdio/logger": ^8.28.0 + expect: ^29.7.0 + jest-matcher-utils: ^29.7.0 + lodash.isequal: ^4.5.0 + webdriverio: ^8.29.3 + dependenciesMeta: + "@wdio/globals": + optional: true + "@wdio/logger": + optional: true + webdriverio: + optional: true + checksum: c74450a036d19ef464f85e3bf8f8a8f27a83867d554e2c36ed53b698eaaa1da070137ca2d5bc7c2645cecdcb74267b7a4a7fea17ca625e8606277649871d6489 + languageName: node + linkType: hard + "expect-webdriverio@npm:^4.6.1": version: 4.7.2 resolution: "expect-webdriverio@npm:4.7.2" @@ -4921,18 +5001,18 @@ __metadata: languageName: node linkType: hard -"fastify@npm:^4.21.0": - version: 4.25.0 - resolution: "fastify@npm:4.25.0" +"fastify@npm:^4.26.1": + version: 4.26.1 + resolution: "fastify@npm:4.26.1" dependencies: "@fastify/ajv-compiler": ^3.5.0 "@fastify/error": ^3.4.0 "@fastify/fast-json-stringify-compiler": ^4.3.0 abstract-logging: ^2.0.1 - avvio: ^8.2.1 + avvio: ^8.3.0 fast-content-type-parse: ^1.1.0 fast-json-stringify: ^5.8.0 - find-my-way: ^7.7.0 + find-my-way: ^8.0.0 light-my-request: ^5.11.0 pino: ^8.17.0 process-warning: ^3.0.0 @@ -4941,11 +5021,20 @@ __metadata: secure-json-parse: ^2.7.0 semver: ^7.5.4 toad-cache: ^3.3.0 - checksum: 944b5762766b510f6303ca488cd9b47e320881741be3a1c3196a7912d6bc73c353f7a37cd37fb563b6ac0d82282b9bb41949502f3a44dd432782807fe33db5d8 + checksum: 2d8e5514db0dd3dc2067d473561904226cacbceb9b8b2858d8048eb8cad14626a619c9b915edb529750ed247c5be490a7f8cec6dbe8b07ec3b1d14d9f49a50ce + languageName: node + linkType: hard + +"fastq@npm:^1.17.0, fastq@npm:^1.17.1": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: ^1.0.4 + checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 languageName: node linkType: hard -"fastq@npm:^1.6.0, fastq@npm:^1.6.1": +"fastq@npm:^1.6.0": version: 1.15.0 resolution: "fastq@npm:1.15.0" dependencies: @@ -5081,14 +5170,14 @@ __metadata: languageName: node linkType: hard -"find-my-way@npm:^7.7.0": - version: 7.7.0 - resolution: "find-my-way@npm:7.7.0" +"find-my-way@npm:^8.0.0": + version: 8.1.0 + resolution: "find-my-way@npm:8.1.0" dependencies: fast-deep-equal: ^3.1.3 fast-querystring: ^1.0.0 safe-regex2: ^2.0.0 - checksum: 6cd3fbfd57aa359475658bbc2336b27c561c16a91a1fb6346d025e3d6ff7a127fdc4cf23ac4b6ed8054534ac45f63a5b9421d52834ae1d36c47ccfde2a73a3aa + checksum: 000620e1ea48ca8fd6c0cb0e47ca7ea61587037fb4e69017bb83de619c2c88149e4ac9279d854f35d04de89020f3a2b9fa978be5e39bcfbaee16c6547de01df1 languageName: node linkType: hard @@ -5231,17 +5320,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.1.0": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd - languageName: node - linkType: hard - "fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -5253,17 +5331,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^6.0.1": - version: 6.0.1 - resolution: "fs-extra@npm:6.0.1" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 133dbd765e05c1cdaaf723308e00ffbe746da5ad516ad890ae2da2a538982c1175371055c778fbe68d1fca1da9ed4003ba55c4a14e070372eabf6a7c48062759 - languageName: node - linkType: hard - "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -5408,6 +5475,24 @@ __metadata: languageName: node linkType: hard +"geckodriver@npm:^4.3.1": + version: 4.3.2 + resolution: "geckodriver@npm:4.3.2" + dependencies: + "@wdio/logger": ^8.28.0 + decamelize: ^6.0.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.2 + node-fetch: ^3.3.2 + tar-fs: ^3.0.4 + unzipper: ^0.10.14 + which: ^4.0.0 + bin: + geckodriver: bin/geckodriver.js + checksum: 36723da0d8a38cc456f45f44f9e63f177826d73f7b89e1d3cc260b18df454431c010f0a5ee76c9903d9ebb3495c7d871367ddeb212f42f916d4addbc6c1bb1b0 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -5619,7 +5704,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.3.10": +"glob@npm:^10.3.10, glob@npm:^10.3.4": version: 10.3.10 resolution: "glob@npm:10.3.10" dependencies: @@ -5634,7 +5719,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.6, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:^7.0.6, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -6246,13 +6331,6 @@ __metadata: languageName: node linkType: hard -"ip-regex@npm:^4.1.0": - version: 4.3.0 - resolution: "ip-regex@npm:4.3.0" - checksum: 7ff904b891221b1847f3fdf3dbb3e6a8660dc39bc283f79eb7ed88f5338e1a3d1104b779bc83759159be266249c59c2160e779ee39446d79d4ed0890dfd06f08 - languageName: node - linkType: hard - "ip@npm:^1.1.8": version: 1.1.8 resolution: "ip@npm:1.1.8" @@ -6602,13 +6680,6 @@ __metadata: languageName: node linkType: hard -"is-url@npm:^1.2.4": - version: 1.2.4 - resolution: "is-url@npm:1.2.4" - checksum: 100e74b3b1feab87a43ef7653736e88d997eb7bd32e71fd3ebc413e58c1cbe56269699c776aaea84244b0567f2a7d68dfaa512a062293ed2f9fdecb394148432 - languageName: node - linkType: hard - "is-weakmap@npm:^2.0.1": version: 2.0.1 resolution: "is-weakmap@npm:2.0.1" @@ -6642,17 +6713,6 @@ __metadata: languageName: node linkType: hard -"is2@npm:^2.0.6": - version: 2.0.9 - resolution: "is2@npm:2.0.9" - dependencies: - deep-is: ^0.1.3 - ip-regex: ^4.1.0 - is-url: ^1.2.4 - checksum: be778a3bd0770799bd6d9b79916d2467a150a111088858dc00f6ea5a52b0e12d3a0a5cfd350d990bdb562552388be406707ee91ac6d40b96371c3a97aca1e579 - languageName: node - linkType: hard - "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -7400,6 +7460,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.5": + version: 0.30.7 + resolution: "magic-string@npm:0.30.7" + dependencies: + "@jridgewell/sourcemap-codec": ^1.4.15 + checksum: bdf102e36a44d1728ec61b69d655caba3f66ca58898e292f6debe57dc30896bd37908bfe3464a7464a435831a9e44aa905cebd681e21c2f44bbe4dddf225619f + languageName: node + linkType: hard + "make-dir@npm:^1.0.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -7754,7 +7823,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5": +"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -7774,12 +7843,12 @@ __metadata: languageName: node linkType: hard -"mnemonist@npm:0.39.5": - version: 0.39.5 - resolution: "mnemonist@npm:0.39.5" +"mnemonist@npm:0.39.6": + version: 0.39.6 + resolution: "mnemonist@npm:0.39.6" dependencies: obliterator: ^2.0.1 - checksum: 6669d687a434226924b2c84ee6eb7ce7d0f83dfc5caad8bcc164c73c0c11fb6d43cbe32636e710f068046f4b40a56c3032532554e93e02640aafc6ca3dd222e6 + checksum: 10cb09aa33de92625d5004f541e6aaaab8ae4bb26c6917e8505189f2fc20b122c773a4c11639bb6b5bfdc6000645c2d210ecd47fb203176fe28c338443c466eb languageName: node linkType: hard @@ -8318,7 +8387,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -8562,6 +8631,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.1": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 + languageName: node + linkType: hard + "pathval@npm:^1.1.1": version: 1.1.1 resolution: "pathval@npm:1.1.1" @@ -9805,6 +9881,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^5.2.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: ^4.1.0 + checksum: bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46 + languageName: node + linkType: hard + "strip-ansi@npm:^7.0.1": version: 7.0.1 resolution: "strip-ansi@npm:7.0.1" @@ -9892,13 +9977,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:9.3.1": - version: 9.3.1 - resolution: "supports-color@npm:9.3.1" - checksum: 00c4d1082a7ba0ee21cba1d4e4a466642635412e40476777b530aa5110d035e99a420cd048e1fb6811f2254c0946095fbb87a1eccf1af1d1ca45ab0a4535db93 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -10000,16 +10078,6 @@ __metadata: languageName: node linkType: hard -"tcp-port-used@npm:^1.0.2": - version: 1.0.2 - resolution: "tcp-port-used@npm:1.0.2" - dependencies: - debug: 4.3.1 - is2: ^2.0.6 - checksum: ea1bd3f7789a79bb228382e7314167357cd2a2dc3e17521393739075b85e3df0009c53aab4aaa9d180a59791ab152fe87079adaf05242c411b1778a41e543863 - languageName: node - linkType: hard - "temp-dir@npm:^3.0.0": version: 3.0.0 resolution: "temp-dir@npm:3.0.0" @@ -10509,12 +10577,12 @@ __metadata: languageName: node linkType: hard -"undici@npm:^5.23.0": - version: 5.28.2 - resolution: "undici@npm:5.28.2" +"undici@npm:^5.28.3": + version: 5.28.3 + resolution: "undici@npm:5.28.3" dependencies: "@fastify/busboy": ^2.0.0 - checksum: f9e9335803f962fff07c3c11c6d50bbc76248bacf97035047155adb29c3622a65bd6bff23a22218189740133149d22e63b68131d8c40e78ac6cb4b6d686a6dfa + checksum: fa1e65aff896c5e2ee23637b632e306f9e3a2b32a3dc0b23ea71e5555ad350bcc25713aea894b3dccc0b7dc2c5e92a5a58435ebc2033b731a5524506f573dfd2 languageName: node linkType: hard @@ -10637,7 +10705,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.0, uuid@npm:^8.3.2": +"uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -10722,74 +10790,47 @@ __metadata: languageName: node linkType: hard -"wdio-chromedriver-service@npm:^8.1.1": - version: 8.1.1 - resolution: "wdio-chromedriver-service@npm:8.1.1" +"wdio-video-reporter@npm:^5.1.4": + version: 5.1.4 + resolution: "wdio-video-reporter@npm:5.1.4" dependencies: - "@wdio/logger": ^8.1.0 - fs-extra: ^11.1.0 - split2: ^4.1.0 - tcp-port-used: ^1.0.2 - peerDependencies: - "@wdio/types": ^7.0.0 || ^8.0.0-alpha.219 - chromedriver: "*" - webdriverio: ^7.0.0 || ^8.0.0-alpha.219 - peerDependenciesMeta: - "@wdio/types": - optional: true - chromedriver: - optional: true - webdriverio: - optional: false - checksum: e9e797bf1c3366e2dd5cf6b2c362c1fc1a22a8d97c23afff31a670f42dd99a33cb73228011cef7e799613e70ecd30529472a1e00f42dcc28f8a0e88c0ce299e0 - languageName: node - linkType: hard - -"wdio-video-reporter@npm:^4.0.5": - version: 4.0.5 - resolution: "wdio-video-reporter@npm:4.0.5" - dependencies: - "@ffmpeg-installer/ffmpeg": ^1.0.20 - "@wdio/allure-reporter": ^8.7.0 - "@wdio/reporter": ^8.7.0 - fs-extra: ^6.0.1 - glob: ^7.1.2 - mkdirp: ^0.5.5 - checksum: a7154cb228797ee66a16d7e3c805f253ce1b9b2fe2dd6aac919d7d028826d59e9a3d92ebd94934b8d74a369848ffdbd8604a0ea1ad82d9290aec3b4b5b4bac93 + "@ffmpeg-installer/ffmpeg": ^1.1.0 + "@wdio/allure-reporter": ^8.28.6 + "@wdio/globals": ^8.28.8 + "@wdio/logger": ^8.28.0 + "@wdio/reporter": ^8.28.6 + glob: ^10.3.10 + checksum: 9a0144504770e001959bebca7f6adc8dae5bd9f8339b2b582ba72eff57ac34c1dd1ddeec023b82b03bf92ac14137aafd4ffe6f9537453b9c86565d1bf6171f9d languageName: node linkType: hard -"wdio-vscode-service@npm:^5.2.2": - version: 5.2.2 - resolution: "wdio-vscode-service@npm:5.2.2" +"wdio-vscode-service@npm:^6.0.2": + version: 6.0.2 + resolution: "wdio-vscode-service@npm:6.0.2" dependencies: - "@fastify/cors": ^8.3.0 - "@fastify/static": ^6.10.2 - "@types/ws": ^8.5.5 - "@vscode/test-electron": ^2.3.4 - "@wdio/logger": ^8.11.0 + "@fastify/cors": ^9.0.1 + "@fastify/static": ^7.0.1 + "@types/ws": ^8.5.10 + "@vscode/test-electron": ^2.3.8 + "@wdio/logger": ^8.28.0 clipboardy: ^3.0.0 decamelize: 6.0.0 download: ^8.0.0 - fastify: ^4.21.0 + fastify: ^4.26.1 get-port: 7.0.0 hpagent: ^1.2.0 slash: ^5.1.0 tmp-promise: ^3.0.3 - undici: ^5.23.0 + undici: ^5.28.3 vscode-uri: ^3.0.8 - wdio-chromedriver-service: ^8.1.1 - ws: ^8.13.0 + ws: ^8.16.0 yargs-parser: ^21.1.1 peerDependencies: - chromedriver: "*" - webdriverio: ^8.0.0 + webdriverio: ^8.32.2 peerDependenciesMeta: - chromedriver: - optional: false webdriverio: optional: true - checksum: eb09d6458894dcd470b10bb1de8b404df750251a78d9b241d7f6f55a1648cef42353c2bd9d8d6b9bce0759290f146f60ae3111a392d936fa85c7ffd7d88ca4d9 + checksum: 16c571275c99253b00fbf4a4d6094de48753cc7d898cc24bf0a175c22076b05d021b80df26045ec34bd1cb98f427dffd308d6e2320f916ac90c9965ab485e0e7 languageName: node linkType: hard @@ -10819,6 +10860,25 @@ __metadata: languageName: node linkType: hard +"webdriver@npm:8.32.2": + version: 8.32.2 + resolution: "webdriver@npm:8.32.2" + dependencies: + "@types/node": ^20.1.0 + "@types/ws": ^8.5.3 + "@wdio/config": 8.32.2 + "@wdio/logger": 8.28.0 + "@wdio/protocols": 8.32.0 + "@wdio/types": 8.32.2 + "@wdio/utils": 8.32.2 + deepmerge-ts: ^5.1.0 + got: ^12.6.1 + ky: ^0.33.0 + ws: ^8.8.0 + checksum: bf0e35e842ce30ccdda95f18923f5404ca11999f30677be2e1ec97c34357ce884233c578e08c2ad6666398f291b5acadf0ceba0bd65a41288bb0a45b837a4e93 + languageName: node + linkType: hard + "webdriverio@npm:8.26.1, webdriverio@npm:^8.23.1": version: 8.26.1 resolution: "webdriverio@npm:8.26.1" @@ -10856,6 +10916,43 @@ __metadata: languageName: node linkType: hard +"webdriverio@npm:8.32.2, webdriverio@npm:^8.29.3": + version: 8.32.2 + resolution: "webdriverio@npm:8.32.2" + dependencies: + "@types/node": ^20.1.0 + "@wdio/config": 8.32.2 + "@wdio/logger": 8.28.0 + "@wdio/protocols": 8.32.0 + "@wdio/repl": 8.24.12 + "@wdio/types": 8.32.2 + "@wdio/utils": 8.32.2 + archiver: ^6.0.0 + aria-query: ^5.0.0 + css-shorthand-properties: ^1.1.1 + css-value: ^0.0.1 + devtools-protocol: ^0.0.1261483 + grapheme-splitter: ^1.0.2 + import-meta-resolve: ^4.0.0 + is-plain-obj: ^4.1.0 + lodash.clonedeep: ^4.5.0 + lodash.zip: ^4.2.0 + minimatch: ^9.0.0 + puppeteer-core: ^20.9.0 + query-selector-shadow-dom: ^1.0.0 + resq: ^1.9.1 + rgb2hex: 0.2.5 + serialize-error: ^11.0.1 + webdriver: 8.32.2 + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true + checksum: 4d74af97a140f38dc33bb762681004452032113010340f67f8c8cccdab571cddadc95ef53da2df9606914c027496c15297cec67746761b32335cc9aba1236ea2 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -11046,7 +11143,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.13.0, ws@npm:^8.13.0, ws@npm:^8.8.0": +"ws@npm:8.13.0, ws@npm:^8.8.0": version: 8.13.0 resolution: "ws@npm:8.13.0" peerDependencies: @@ -11061,6 +11158,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.16.0": + version: 8.16.0 + resolution: "ws@npm:8.16.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b + languageName: node + linkType: hard + "xml2js@npm:^0.4.23": version: 0.4.23 resolution: "xml2js@npm:0.4.23"