mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-26 12:21:23 +00:00
Added Auth
This commit is contained in:
@@ -1,18 +1,90 @@
|
||||
import { Frame } from "puppeteer";
|
||||
import { ElementHandle, Frame } from "puppeteer";
|
||||
import { TestExplorerParams } from "../../src/TestExplorerParams";
|
||||
|
||||
export const NOTEBOOK_OPERATION_DELAY = 5000;
|
||||
export const RENDER_DELAY = 1000;
|
||||
|
||||
let testExplorerFrame: Frame;
|
||||
export async function getTestExplorerFrame(): Promise<Frame> {
|
||||
export const getTestExplorerFrame = async (): Promise<Frame> => {
|
||||
if (testExplorerFrame) {
|
||||
return testExplorerFrame;
|
||||
}
|
||||
|
||||
const prodUrl = "https://localhost:1234/testExplorer.html";
|
||||
const notebooksTestRunnerApplicationId = process.env.NOTEBOOKS_TEST_RUNNER_TENANT_ID;
|
||||
const notebooksTestRunnerClientId = process.env.NOTEBOOKS_TEST_RUNNER_CLIENT_ID;
|
||||
const notebooksTestRunnerClientSecret = process.env.NOTEBOOKS_TEST_RUNNER_CLIENT_SECRET;
|
||||
const notebooksAccountName = process.env.NOTEBOOKS_ACCOUNT_NAME;
|
||||
const notebooksAccountKey = process.env.NOTEBOOKS_ACCOUNT_KEY;
|
||||
const notebooksAccountSubscriptonId = process.env.NOTEBOOKS_ACCOUNT_SUBSCRIPTION_ID;
|
||||
const notebooksAccountResourceGroup = process.env.NOTEBOOKS_ACCOUNT_RESOURCE_GROUP;
|
||||
|
||||
const prodUrl = `https://localhost:1234/testExplorer.html?
|
||||
${TestExplorerParams.notebooksTestRunnerApplicationId}=${encodeURI(notebooksTestRunnerApplicationId)}&
|
||||
${TestExplorerParams.notebooksTestRunnerClientId}=${encodeURI(notebooksTestRunnerClientId)}&
|
||||
${TestExplorerParams.notebooksTestRunnerClientSecret}=${encodeURI(notebooksTestRunnerClientSecret)}&
|
||||
${TestExplorerParams.notebooksAccountName}=${encodeURI(notebooksAccountName)}&
|
||||
${TestExplorerParams.notebooksAccountKey}=${encodeURI(notebooksAccountKey)}&
|
||||
${TestExplorerParams.notebooksAccountSubscriptonId}=${encodeURI(notebooksAccountSubscriptonId)}&
|
||||
${TestExplorerParams.notebooksAccountResourceGroup}=${encodeURI(notebooksAccountResourceGroup)}`;
|
||||
|
||||
await page.goto(prodUrl);
|
||||
const buttonHandle = await page.waitForSelector("button");
|
||||
buttonHandle.click();
|
||||
|
||||
const handle = await page.waitForSelector("iframe");
|
||||
testExplorerFrame = await handle.contentFrame();
|
||||
await testExplorerFrame.waitForSelector(".galleryHeader");
|
||||
return testExplorerFrame;
|
||||
}
|
||||
};
|
||||
|
||||
export const uploadNotebook = async (frame: Frame, uploadNotebookPath: string): Promise<void> => {
|
||||
const notebookResourceTree = await frame.waitForSelector(".notebookResourceTree");
|
||||
|
||||
const treeNodeHeadersBeforeUpload = await notebookResourceTree.$$(".treeNodeHeader");
|
||||
|
||||
const ellipses = await treeNodeHeadersBeforeUpload[2].$("button");
|
||||
await ellipses.click();
|
||||
|
||||
await frame.waitFor(RENDER_DELAY);
|
||||
|
||||
const menuItems = await frame.$$(".ms-ContextualMenu-item");
|
||||
await menuItems[4].click();
|
||||
|
||||
const uploadFileButton = await frame.waitForSelector("#importFileButton");
|
||||
uploadFileButton.click();
|
||||
|
||||
const fileChooser = await page.waitForFileChooser();
|
||||
fileChooser.accept([uploadNotebookPath]);
|
||||
|
||||
const submitButton = await frame.waitForSelector("#uploadFileButton");
|
||||
await submitButton.click();
|
||||
|
||||
await frame.waitFor(NOTEBOOK_OPERATION_DELAY);
|
||||
};
|
||||
|
||||
export const getNotebookNode = async (frame: Frame, uploadNotebookName: string): Promise<ElementHandle<Element>> => {
|
||||
const notebookResourceTree = await frame.waitForSelector(".notebookResourceTree");
|
||||
let currentNotebookNode: ElementHandle<Element>;
|
||||
|
||||
const treeNodeHeaders = await notebookResourceTree.$$(".treeNodeHeader");
|
||||
for (let i = 1; i < treeNodeHeaders.length; i++) {
|
||||
currentNotebookNode = treeNodeHeaders[i];
|
||||
const nodeLabel = await currentNotebookNode.$eval(".nodeLabel", element => element.textContent);
|
||||
if (nodeLabel === uploadNotebookName) {
|
||||
return currentNotebookNode;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const deleteNotebook = async (frame: Frame, notebookNodeToDelete: ElementHandle<Element>): Promise<void> => {
|
||||
const ellipses = await notebookNodeToDelete.$(".treeMenuEllipsis");
|
||||
await ellipses.click();
|
||||
|
||||
await frame.waitFor(RENDER_DELAY);
|
||||
|
||||
const menuItems = await frame.$$(".ms-ContextualMenu-item");
|
||||
await menuItems[1].click();
|
||||
|
||||
const deleteAcceptButton = await frame.waitForSelector(".ms-Dialog-action");
|
||||
await deleteAcceptButton.click();
|
||||
await frame.waitFor(NOTEBOOK_OPERATION_DELAY);
|
||||
};
|
||||
|
||||
27
test/notebooks/uploadOpenAndDeleteNotebook.spec.ts
Normal file
27
test/notebooks/uploadOpenAndDeleteNotebook.spec.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import "expect-puppeteer";
|
||||
import { deleteNotebook, getNotebookNode, getTestExplorerFrame, uploadNotebook } from "./notebookTestUtils";
|
||||
import * as path from "path";
|
||||
|
||||
jest.setTimeout(300000);
|
||||
|
||||
describe("Notebook UI tests", () => {
|
||||
it("Upload, Open and Delete Notebook", async () => {
|
||||
const frame = await getTestExplorerFrame();
|
||||
const uploadNotebookName = "GettingStarted.ipynb";
|
||||
const uploadNotebookPath = path.join(__dirname, "testNotebooks", uploadNotebookName);
|
||||
|
||||
await uploadNotebook(frame, uploadNotebookPath);
|
||||
const uploadedNotebookNode = await getNotebookNode(frame, uploadNotebookName);
|
||||
|
||||
await uploadedNotebookNode.click();
|
||||
await frame.waitForSelector(".tabNavText");
|
||||
const tabTitle = await frame.$eval(".tabNavText", element => element.textContent);
|
||||
expect(tabTitle).toEqual(uploadNotebookName);
|
||||
const closeIcon = await frame.waitForSelector(".close-Icon");
|
||||
await closeIcon.click();
|
||||
|
||||
await deleteNotebook(frame, uploadedNotebookNode);
|
||||
const deletedNotebookNode = await getNotebookNode(frame, uploadNotebookName);
|
||||
expect(deletedNotebookNode).toBeUndefined();
|
||||
});
|
||||
});
|
||||
@@ -1,82 +0,0 @@
|
||||
import "expect-puppeteer";
|
||||
import { ElementHandle } from "puppeteer";
|
||||
import { getTestExplorerFrame } from "./notebookTestUtils";
|
||||
import * as path from "path"
|
||||
|
||||
jest.setTimeout(300000);
|
||||
const NOTEBOOK_OPERATION_DELAY = 2500;
|
||||
const RENDER_DELAY = 1000;
|
||||
|
||||
describe("sample", () => {
|
||||
it("portal login", async () => {
|
||||
const frame = await getTestExplorerFrame();
|
||||
|
||||
const notebookResourceTree = await frame.waitForSelector(".notebookResourceTree");
|
||||
const uploadNotebookPath = "C:/Users/srnara/Downloads/GettingStarted.ipynb";
|
||||
const uploadNotebookName = path.basename(uploadNotebookPath);
|
||||
|
||||
const treeNodeHeadersBeforeUpload = await notebookResourceTree.$$(".treeNodeHeader");
|
||||
|
||||
let ellipses = await treeNodeHeadersBeforeUpload[2].$("button");
|
||||
await ellipses.click();
|
||||
|
||||
await frame.waitFor(RENDER_DELAY);
|
||||
|
||||
let menuItems = await frame.$$(".ms-ContextualMenu-item");
|
||||
await menuItems[4].click();
|
||||
|
||||
const uploadFileButton = await frame.waitForSelector("#importFileButton");
|
||||
uploadFileButton.click();
|
||||
|
||||
const fileChooser = await page.waitForFileChooser();
|
||||
fileChooser.accept([uploadNotebookPath]);
|
||||
|
||||
const submitButton = await frame.waitForSelector("#uploadFileButton");
|
||||
await submitButton.click();
|
||||
|
||||
await frame.waitFor(NOTEBOOK_OPERATION_DELAY);
|
||||
|
||||
let uploadedNotebookNode: ElementHandle<Element>;
|
||||
const treeNodeHeadersAfterUpload = await notebookResourceTree.$$(".treeNodeHeader");
|
||||
for (var i = 1; i < treeNodeHeadersAfterUpload.length; i++) {
|
||||
uploadedNotebookNode = treeNodeHeadersAfterUpload[i];
|
||||
const nodeLabel = await uploadedNotebookNode.$eval(".nodeLabel", element => element.textContent);
|
||||
if (nodeLabel === uploadNotebookName) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
await uploadedNotebookNode.click();
|
||||
await frame.waitForSelector(".tabNavText");
|
||||
const tabTitle = await frame.$eval(".tabNavText", element => element.textContent);
|
||||
expect(tabTitle).toEqual(uploadNotebookName);
|
||||
|
||||
const closeIcon = await frame.waitForSelector(".close-Icon");
|
||||
await closeIcon.click();
|
||||
|
||||
ellipses = await uploadedNotebookNode.$(".treeMenuEllipsis");
|
||||
await ellipses.click();
|
||||
|
||||
await frame.waitFor(RENDER_DELAY);
|
||||
|
||||
menuItems = await frame.$$(".ms-ContextualMenu-item");
|
||||
await menuItems[1].click();
|
||||
|
||||
const deleteAcceptButton = await frame.waitForSelector(".ms-Dialog-action");
|
||||
await deleteAcceptButton.click();
|
||||
await frame.waitFor(NOTEBOOK_OPERATION_DELAY);
|
||||
|
||||
let index: number;
|
||||
let deletedNotebookNode: ElementHandle<Element>;
|
||||
const treeNodeHeadersAfterDelete = await notebookResourceTree.$$(".treeNodeHeader");
|
||||
for (index = 1; index < treeNodeHeadersAfterDelete.length; index++) {
|
||||
deletedNotebookNode = treeNodeHeadersAfterDelete[index];
|
||||
const nodeLabel = await deletedNotebookNode.$eval(".nodeLabel", element => element.textContent);
|
||||
if (nodeLabel === uploadNotebookName) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
expect(index).toEqual(treeNodeHeadersAfterDelete.length);
|
||||
});
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import crypto from "crypto";
|
||||
import { Frame } from "puppeteer";
|
||||
|
||||
let testExplorerFrame: Frame;
|
||||
|
||||
export async function login(connectionString: string): Promise<Frame> {
|
||||
const prodUrl = "https://localhost:1234/hostedExplorer.html";
|
||||
page.goto(prodUrl);
|
||||
|
||||
Reference in New Issue
Block a user