Skip to content
This repository has been archived by the owner on Jan 12, 2024. It is now read-only.

Adding automated tests #1546

Open
wants to merge 4 commits into
base: feature/vsc2aq
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 26 additions & 37 deletions src/VSCodeExtension/.vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,29 @@
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
},
{
"name": "Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"outFiles": [
"${workspaceFolder}/out/**/*.js"
],
"preLaunchTask": "npm: watch"
},
{
"name": "Extension Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test"
],
"outFiles": [
"${workspaceFolder}/out/test/**/*.js"
],
"preLaunchTask": "npm: watch"
}
]
}
"version": "0.2.0",
"configurations": [
{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceFolder}"],
"outFiles": ["${workspaceFolder}/out/**/*.js"],
"preLaunchTask": "npm: watch"
},
{
"name": "Run Extension Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index",
"/Users/owner/Desktop/sampleQuantumProj"
],
"outFiles": ["${workspaceFolder}/out/test/**/*.js"],
"preLaunchTask": "npm: watch"
}
]
}
5 changes: 5 additions & 0 deletions src/VSCodeExtension/package.json.v.template
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@
"@azure/ms-rest-azure-env": "^2.0.0",
"@azure/ms-rest-nodeauth": "^3.1.1",
"@types/fs-extra": "^8.0.0",
"@types/glob": "^7.2.0",
"@vscode/extension-telemetry": "0.6.2",
"decompress-zip": "^0.2.2",
"dotnet": "^1.1.4",
Expand All @@ -221,15 +222,19 @@
"yosay": "^2.0.1"
},
"devDependencies": {
"@types/chai": "^4.3.3",
"@types/mocha": "^9.1.1",
"@types/node": "^9.6.57",
"@types/request": "^2.48.3",
"@types/semver": "^6.0.0",
"@types/sinon": "^10.0.13",
"@types/tmp": "0.0.33",
"@types/vscode": "^1.52.0",
"@types/which": "1.3.1",
"@types/yeoman-environment": "2.3.3",
"@types/yeoman-generator": "3.1.4",
"@types/yosay": "0.0.29",
"@vscode/test-electron": "^2.1.5",
"mocha": "^8.2.1",
"tslint": "^5.8.0",
"typescript": "^4.1.3"
Expand Down
32 changes: 23 additions & 9 deletions src/VSCodeExtension/src/configFileHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {getWorkspaceFromUser} from "./quickPickWorkspace";
import {workspaceInfo, configFileInfo} from "./utils/types";
import {setupAuthorizedWorkspaceStatusButton} from "./workspaceStatusButtonHelpers";
import * as https from "https";

import * as glob from 'glob';

// If config not present, queries user for workspace information
// If config present, verifies config. If verification fails,
Expand All @@ -28,7 +28,7 @@ export async function setWorkspace(context:vscode.ExtensionContext, credential:a
export async function handleUnauthorizedConfig(context:vscode.ExtensionContext, credential:any, workspaceStatusBarItem:vscode.StatusBarItem){
const userInput = await vscode.window.showErrorMessage("You do not have access to this workspace, or it doesn't exist.", {}, ...["Change Workspace"]);
if (userInput === "Change Workspace"){
const workspaceInfo = await getWorkspaceFromUser(context, credential, workspaceStatusBarItem, 3, true);
const workspaceInfo = await getWorkspaceFromUser(context, credential, workspaceStatusBarItem, 3);
if(workspaceInfo){
return true;
}
Expand Down Expand Up @@ -111,7 +111,6 @@ export async function verifyConfig(context: vscode.ExtensionContext, credential:

// returns an object with the workspaceInfo, if succ
export async function getConfig(context:vscode.ExtensionContext, credential:any, workspaceStatusBarItem:vscode.StatusBarItem, validateFlag=true):Promise<configFileInfo> {

const configFileInfo:configFileInfo = {
workspaceInfo:undefined,
exitRequest:false
Expand All @@ -127,26 +126,41 @@ export async function getConfig(context:vscode.ExtensionContext, credential:any,
return configFileInfo;
}

// using glob to search for config file. This is necessary to be test
// compatiable with mocha
let workspaceInfo:workspaceInfo;
const configFile = await vscode.workspace.findFiles(
"**/azurequantumconfig.json"
);
let rootFolder= "";
let pullConfigFiles:any[] =[];
if(vscode?.workspace?.workspaceFolders){
rootFolder = vscode?.workspace?.workspaceFolders[0]?.uri.fsPath;
}
await new Promise<void>(async (resolve)=>{
await glob('**/azurequantumconfig.json', { cwd: rootFolder }, (err, files) => {
if (err) {
console.log(err);
resolve();
}
pullConfigFiles = files;
resolve();
});
});


// no config file present, but this is not function stopping as
// the user will be queried for a workspace
if(configFile.length ===0){
if(pullConfigFiles.length ===0){
return configFileInfo;
}

// If multiple config files are present, stop the function as more
// than one config in a user's workspace is not permitted at this time.
if(configFile.length>1){
if(pullConfigFiles.length>1){
configFileInfo.exitRequest = true;
vscode.window.showWarningMessage("Only one azurequantumconfig.json file is allowed in a workspace.");
return configFileInfo;
}
const workspaceInfoChunk: any = await vscode.workspace.fs.readFile(
configFile[0]
vscode.Uri.file(rootFolder+"/"+pullConfigFiles[0])
);

// try to pull subscription, resource groupm, workspace, and location
Expand Down
18 changes: 10 additions & 8 deletions src/VSCodeExtension/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import {getWorkspaceFromUser} from "./quickPickWorkspace";
import {getConfig, setWorkspace} from "./configFileHelpers";
import { AbortController} from "@azure/abort-controller";
import * as https from "https";
import {MSA_ACCOUNT_TENANT, workspaceStatusEnum} from "./utils/constants"
import {checkForNesting} from "./checkForNesting"
import {MSA_ACCOUNT_TENANT, workspaceStatusEnum} from "./utils/constants";
import {checkForNesting} from "./checkForNesting";
import {setupDefaultWorkspaceStatusButton, setupUnknownWorkspaceStatusButton} from "./workspaceStatusButtonHelpers";
const findPort = require('find-open-port');

Expand Down Expand Up @@ -434,13 +434,16 @@ export async function activate(context: vscode.ExtensionContext) {
const oldStatus = context.workspaceState.get("workspaceStatus");
// Get current workspace if available to avoid clearing
// local jobs submission panel if a user selects same workspace
// they are currently in
let {workspaceInfo:oldWorkspace} = await getConfig(context, credential, workspaceStatusBarItem, false);
const newWorkspaceInfo = await getWorkspaceFromUser(context, credential, workspaceStatusBarItem, 3, true);
// they are currently in. Pass false for validation flag as
// the user is in process of changing workspace and therefore
// does not need to be shown the error message that they are
// in an unauthorized workspace.
let {workspaceInfo:oldWorkspaceInfo} = await getConfig(context, credential, workspaceStatusBarItem, false);
const newWorkspaceInfo = await getWorkspaceFromUser(context, credential, workspaceStatusBarItem, 3, oldWorkspaceInfo);
sendTelemetryEvent(EventNames.changeWorkspace, {},{});
// Only clear local jobs is user changes workspaces and has
// a currently authorized workspace status
if((newWorkspaceInfo?.workspace!==oldWorkspace?.workspace)&& oldStatus === workspaceStatusEnum.AUTHORIZED){
if((newWorkspaceInfo?.workspace!==oldWorkspaceInfo?.workspace)&& oldStatus === workspaceStatusEnum.AUTHORIZED){
context.workspaceState.update("locallySubmittedJobs", undefined);
localSubmissionsProvider.refresh(context);
}
Expand Down Expand Up @@ -536,7 +539,7 @@ export async function activate(context: vscode.ExtensionContext) {
}
if(!workspaceInfo){
totalSteps = 4;
workspaceInfo = await getWorkspaceFromUser(context, credential, workspaceStatusBarItem, totalSteps)
workspaceInfo = await getWorkspaceFromUser(context, credential, workspaceStatusBarItem, totalSteps);
}
if(!workspaceInfo){
return;
Expand Down Expand Up @@ -635,7 +638,6 @@ export async function activate(context: vscode.ExtensionContext) {
);

return context;

}

// this method is called when your extension is deactivated
Expand Down
25 changes: 9 additions & 16 deletions src/VSCodeExtension/src/quickPickWorkspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import {
AccessToken
} from "@azure/identity";
import { TextEncoder } from "util";
import {getConfig} from "./configFileHelpers";
import {workspaceInfo} from "./utils/types";
// import fetch from 'node-fetch';
import * as https from "https";
Expand All @@ -23,7 +22,7 @@ export async function getWorkspaceFromUser(
credential: InteractiveBrowserCredential | AzureCliCredential,
workspaceStatusBarItem: vscode.StatusBarItem,
totalSteps: number,
unauthorizedUser = false
existingWorkspace:workspaceInfo|undefined = undefined
) {
// get access token
let token: AccessToken;
Expand All @@ -39,12 +38,6 @@ export async function getWorkspaceFromUser(
});

return new Promise<workspaceInfo|undefined>( async (resolve, reject)=>{
let workspaceInfo: workspaceInfo|undefined;

if(!unauthorizedUser){
const configFileInfo = await getConfig(context, credential, workspaceStatusBarItem);
workspaceInfo = configFileInfo["workspaceInfo"];
}
const options:any = {
headers: {
Authorization: `Bearer ${token.token}`,
Expand All @@ -64,7 +57,7 @@ export async function getWorkspaceFromUser(
// if user is submitting job, total steps will be 7, otherwise 3
quickPick.totalSteps = totalSteps;

await setupSubscriptionIdQuickPick(quickPick, workspaceInfo, options);
await setupSubscriptionIdQuickPick(quickPick, existingWorkspace, options);
quickPick.onDidAccept(async () => {
const selection = quickPick.selectedItems[0];
// user selects subscription, now set up resource group selection
Expand All @@ -76,7 +69,7 @@ export async function getWorkspaceFromUser(
subscriptionId = selection["description"];
await setupResourceGroupQuickPick(
quickPick,
workspaceInfo,
existingWorkspace,
subscriptionId,
options
);
Expand Down Expand Up @@ -120,13 +113,13 @@ export async function getWorkspaceFromUser(
quickPick.onDidTriggerButton(async (button) => {
// resource group back button pressed, go back to subscription id
if (quickPick.step === selectionStepEnum.RESOURCE_GROUP) {
await setupSubscriptionIdQuickPick(quickPick, workspaceInfo, options);
await setupSubscriptionIdQuickPick(quickPick, existingWorkspace, options);
}
// workspaces back button pressed, go back to resource group
if (quickPick.step === selectionStepEnum.WORKSPACE) {
await setupResourceGroupQuickPick(
quickPick,
workspaceInfo,
existingWorkspace,
subscriptionId,
options
);
Expand All @@ -147,7 +140,7 @@ export async function getWorkspaceFromUser(

async function setupResourceGroupQuickPick(
quickPick: vscode.QuickPick<vscode.QuickPickItem>,
currentworkspaceInfo: workspaceInfo | undefined,
existingWorkspaceInfo: workspaceInfo | undefined,
subscriptionId: string,
options:any
) {
Expand Down Expand Up @@ -193,7 +186,7 @@ export async function getWorkspaceFromUser(
});
// Prefill if there is already a resource group
quickPick.items = rgJSON.value.map((rg: any) => {
if (currentworkspaceInfo?.resourceGroup === rg.name && quickPick.step ===selectionStepEnum.RESOURCE_GROUP) {
if (existingWorkspaceInfo?.resourceGroup === rg.name && quickPick.step ===selectionStepEnum.RESOURCE_GROUP) {
quickPick.value = rg.name;
}
return { label: rg.name };
Expand All @@ -207,7 +200,7 @@ export async function getWorkspaceFromUser(

async function setupSubscriptionIdQuickPick(
quickPick: vscode.QuickPick<vscode.QuickPickItem>,
currentworkspaceInfo: workspaceInfo | undefined,
existingWorkspaceInfo: workspaceInfo | undefined,
options: any
) {
quickPick.placeholder = "";
Expand Down Expand Up @@ -249,7 +242,7 @@ export async function getWorkspaceFromUser(
return rg1.displayName.localeCompare(rg2.displayName);
});
quickPick.items = subscriptionsJSON.value.map((subscription: any) => {
if (currentworkspaceInfo?.subscriptionId === subscription.subscriptionId && quickPick.step ===selectionStepEnum.SUBSCRIPTION) {
if (existingWorkspaceInfo?.subscriptionId === subscription.subscriptionId && quickPick.step ===selectionStepEnum.SUBSCRIPTION) {
quickPick.value = subscription.displayName;
}
return {
Expand Down
24 changes: 24 additions & 0 deletions src/VSCodeExtension/src/test/runTest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as path from 'path';

import { runTests } from '@vscode/test-electron';

async function main() {
try {
// The folder containing the Extension Manifest package.json
// Passed to `--extensionDevelopmentPath`
const extensionDevelopmentPath = path.resolve(__dirname, '../../');

// The path to the extension test runner script
// Passed to --extensionTestsPath
const extensionTestsPath = path.resolve(__dirname, './suite/index');

// Download VS Code, unzip it and run the integration test
await runTests({ extensionDevelopmentPath, extensionTestsPath });
} catch (err) {
console.error(err);
console.error('Failed to run tests');
process.exit(1);
}
}

main();
Loading