in apps/vs-code-designer/src/app/commands/workflows/unitTest/runUnitTest.ts [140:247]
export async function runUnitTestFromPath(context: IActionContext, unitTestPath: string): Promise<UnitTestExecutionResult> {
return await callWithTelemetryAndErrorHandling(runUnitTestEvent, async () => {
const options: vscode.ProgressOptions = {
location: vscode.ProgressLocation.Notification,
title: localize('azureFunctions.runUnitTest', 'Running Unit Test...'),
};
await activateAzurite(context);
return await vscode.window.withProgress(options, async (progress, token) => {
token.onCancellationRequested(() => {
// Handle cancellation logic
context.telemetry.properties.canceledRun = 'true';
ext.outputChannel.appendLine(localize('canceledRunUnitTest', 'Run unit test was canceled'));
});
const start = Date.now();
try {
const testsDirectory = getTestsDirectory(vscode.workspace.workspaceFolders[0].uri.fsPath);
await new Promise((resolve) => setTimeout(resolve, 1000 + Math.random() * 1000));
const duration = Date.now() - start;
const testDirectory = getWorkspacePath(unitTestPath);
const logicAppName = path.relative(testDirectory, unitTestPath).split(path.sep)[0];
const workflowName = path.basename(path.dirname(unitTestPath));
const unitTestName = getUnitTestName(path.basename(unitTestPath));
const bundleVersionNumber = await getLatestBundleVersion(defaultExtensionBundlePathValue);
const pathToExe = path.join(
defaultExtensionBundlePathValue,
bundleVersionNumber,
'UnitTestExecutor',
'Microsoft.Azure.Workflows.UnitTestExecutor.exe'
);
const { cmdOutput, cmdOutputIncludingStderr } = await new Promise<{ cmdOutput: string; cmdOutputIncludingStderr: string }>(
(resolve, reject) => {
let cmdOutput = '';
let cmdOutputIncludingStderr = '';
const childProc: cp.ChildProcess = cp.spawn(pathToExe, [
'-PathToRootFolder',
path.dirname(testDirectory),
'-logicAppName',
logicAppName,
'-workflowName',
workflowName,
'-unitTestName',
unitTestName,
]);
childProc.stdout.on('data', (data: string | Buffer) => {
data = data.toString();
cmdOutput = cmdOutput.concat(data);
});
childProc.stderr.on('data', (data: string | Buffer) => {
data = data.toString();
cmdOutputIncludingStderr = cmdOutputIncludingStderr.concat(data);
});
childProc.on('error', reject);
childProc.on('close', (code: number) => {
if (code === 0) {
resolve({
cmdOutput,
cmdOutputIncludingStderr,
});
} else {
reject(new Error(`Process exited with code ${code}\n${cmdOutputIncludingStderr}`));
}
});
}
);
progress.report({ increment: 100 });
ext.outputChannel.appendLine(cmdOutput);
ext.outputChannel.appendLine(cmdOutputIncludingStderr);
context.telemetry.properties.unitTestCommandOut = cmdOutput;
context.telemetry.properties.cmdOutputIncludingStderr = cmdOutput;
context.telemetry.properties.sucessUnitTest = 'true';
const projectName = path.relative(testsDirectory.fsPath, path.dirname(unitTestPath));
const testResultsDirectory = path.join(testsDirectory.fsPath, testResultsDirectoryName, projectName, `${unitTestName}.unit-test`);
const latestUnitTest = await getLatestUnitTest(testResultsDirectory);
const testResult = {
isSuccessful: latestUnitTest.data.Results.OverallStatus,
duration,
};
vscode.window.showInformationMessage(localize('unitTestExecuted', 'Unit test results "{0}" was created.', latestUnitTest.label));
ext.testRuns.set(unitTestPath, {
unitTestPath,
results: testResult,
});
return testResult;
} catch (error) {
vscode.window.showErrorMessage(`${localize('runFailure', 'Error Running Unit Test.')} ${error.message}`, localize('OK', 'OK'));
context.telemetry.properties.errorMessage = error.message;
context.telemetry.properties.sucessUnitTest = 'false';
return {
isSuccessful: false,
duration: Date.now() - start,
};
}
});
});
}