diff --git a/test/automation/src/sql/managePackagesDialog.ts b/test/automation/src/sql/managePackagesDialog.ts index da54107aba..0986876677 100644 --- a/test/automation/src/sql/managePackagesDialog.ts +++ b/test/automation/src/sql/managePackagesDialog.ts @@ -19,7 +19,7 @@ export class ManagePackagesDialog extends Dialog { await this.waitForNewDialog(); } - async addNewPackage(packageName: string): Promise { + async addNewPackage(packageName: string, packageVersion: string = ''): Promise { const addNewTab = `${ManagePackagesDialog.dialogPage} div[class="tab-header"][aria-controls="dialogPane.Manage Packages.1"]`; await this.code.waitAndClick(addNewTab); @@ -37,6 +37,13 @@ export class ManagePackagesDialog extends Dialog { const searchButton = `${ManagePackagesDialog.dialogPage} a[class="monaco-button monaco-text-button"][aria-label="Search"][aria-disabled="false"]`; await this.code.waitAndClick(searchButton); + if (packageVersion) { + const versionSelectBox = `${ManagePackagesDialog.dialogPage} select[class="monaco-select-box monaco-select-box-dropdown-padding"][aria-label="Package Version"]`; + const versionOption = `${versionSelectBox} option[value="${packageVersion}]`; + this.code.waitForElement(versionOption); + this.code.waitForSetValue(versionSelectBox, packageVersion); + } + const installButton = `${ManagePackagesDialog.dialogPage} a[class="monaco-button monaco-text-button"][aria-label="Install"][aria-disabled="false"]`; await this.code.waitAndClick(installButton); @@ -49,5 +56,6 @@ export class ManagePackagesDialog extends Dialog { const closeButton = '.modal .modal-footer a[class="monaco-button monaco-text-button"][aria-label="Close"][aria-disabled="false"]'; await this.code.waitAndClick(closeButton); + await this.waitForDialogGone(); } } diff --git a/test/automation/src/sql/taskPanel.ts b/test/automation/src/sql/taskPanel.ts new file mode 100644 index 0000000000..8659377d26 --- /dev/null +++ b/test/automation/src/sql/taskPanel.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Code } from '../code'; +import { QuickAccess } from '../quickaccess'; + +export class TaskPanel { + + private static readonly taskPanelSelector = 'div.pane-body.task-history'; + + constructor(private code: Code, private quickAccess: QuickAccess) { + } + + async showTaskPanel(): Promise { + await this.quickAccess.runCommand('workbench.panel.tasks.view.focus'); + } + + /** + * Wait for the given task message in the task panel. + * @param task The task completed message. + * @param waitTime The amount of time to wait for the task to complete. By default, this is 1 minute. + */ + async waitForTaskComplete(task: string, waitTime: number = 600): Promise { + await this.code.waitForElement(`${TaskPanel.taskPanelSelector} div.label[title="${task}"]`, undefined, waitTime); + } + +} diff --git a/test/automation/src/workbench.ts b/test/automation/src/workbench.ts index 3fc7e6e215..6365c0b56d 100644 --- a/test/automation/src/workbench.ts +++ b/test/automation/src/workbench.ts @@ -33,6 +33,7 @@ import { ManagePackagesDialog } from './sql/managePackagesDialog'; import { CreateBookDialog } from './sql/createBookDialog'; import { NotificationToast } from './sql/notificationToast'; import { AddRemoteBookDialog } from './sql/addRemoteBookDialog'; +import { TaskPanel } from './sql/taskPanel'; // {{END}} export interface Commands { @@ -70,6 +71,7 @@ export class Workbench { readonly managePackagesDialog: ManagePackagesDialog; readonly notificationToast: NotificationToast; readonly addRemoteBookDialog: AddRemoteBookDialog; + readonly taskPanel: TaskPanel; // {{END}} constructor(code: Code, userDataPath: string) { @@ -99,6 +101,7 @@ export class Workbench { this.configurePythonDialog = new ConfigurePythonDialog(code); this.managePackagesDialog = new ManagePackagesDialog(code); this.addRemoteBookDialog = new AddRemoteBookDialog(code); + this.taskPanel = new TaskPanel(code, this.quickaccess); // {{END}} this.notebook = new Notebook(this.quickaccess, code); this.localization = new Localization(code); diff --git a/test/smoke/src/sql/areas/notebook/notebook.test.ts b/test/smoke/src/sql/areas/notebook/notebook.test.ts index cef0b43559..442228e3b7 100644 --- a/test/smoke/src/sql/areas/notebook/notebook.test.ts +++ b/test/smoke/src/sql/areas/notebook/notebook.test.ts @@ -81,8 +81,7 @@ export function setup(opts: minimist.ParsedArgs) { await app.workbench.sqlNotebook.waitForActiveCellResults(); }); - // Temporarily skipping this test while investigating failure in builds - it.skip('can add a new package from the Manage Packages wizard', async function () { + it('can add a new package from the Manage Packages wizard', async function () { const app = this.app as Application; await app.workbench.sqlNotebook.newUntitledNotebook(); await app.workbench.sqlNotebook.notebookToolbar.waitForKernel('SQL'); @@ -96,7 +95,9 @@ export function setup(opts: minimist.ParsedArgs) { await app.workbench.sqlNotebook.notebookToolbar.managePackages(); await app.workbench.managePackagesDialog.waitForManagePackagesDialog(); - await app.workbench.managePackagesDialog.addNewPackage('pyarrow'); + await app.workbench.managePackagesDialog.addNewPackage('pyarrow', '7.0.0'); + await app.workbench.taskPanel.showTaskPanel(); + await app.workbench.taskPanel.waitForTaskComplete('Installing pyarrow 7.0.0 succeeded'); // There should be no error output when running the cell after pyarrow has been installed await app.workbench.sqlNotebook.runActiveCell();