webview-ui/src/manualTest/createClusterTests.tsx (109 lines of code) (raw):
import { Scenario } from "../utilities/manualTest";
import { CreateCluster } from "../CreateCluster/CreateCluster";
import {
InitialState,
ProgressEventType,
ToVsCodeMsgDef,
ToWebViewMsgDef,
} from "../../../src/webview-contract/webviewDefinitions/createCluster";
import { MessageHandler, MessageSink } from "../../../src/webview-contract/messaging";
import { stateUpdater } from "../CreateCluster/helpers/state";
const failLocationMarker = "thiswillfail";
const cancelLocationMarker = "thiswillbecancelled";
const locations = [
"westus",
"eastus",
"northus",
"southus",
"centralus",
"notus",
failLocationMarker,
cancelLocationMarker,
];
const resourceGroups = locations.map((l) => ({ name: `rg_${l}`, location: l }));
export function getCreateClusterScenarios() {
const initialState: InitialState = {
subscriptionId: "7f9c8a5b-3e9d-4f1c-8c0f-6a3b2a0d2e7c",
subscriptionName: "Test Sub",
};
function getMessageHandler(webview: MessageSink<ToWebViewMsgDef>): MessageHandler<ToVsCodeMsgDef> {
return {
getLocationsRequest: () => handleGetLocationsRequest(webview),
getResourceGroupsRequest: () => handleGetResourceGroupsRequest(webview),
createClusterRequest: (args) =>
handleCreateClusterRequest(
args.isNewResourceGroup,
args.resourceGroupName,
args.location,
args.name,
webview,
),
};
}
async function handleGetLocationsRequest(webview: MessageSink<ToWebViewMsgDef>) {
await new Promise((resolve) => setTimeout(resolve, 1000));
webview.postGetLocationsResponse({ locations: locations });
}
async function handleGetResourceGroupsRequest(webview: MessageSink<ToWebViewMsgDef>) {
await new Promise((resolve) => setTimeout(resolve, 1000));
webview.postGetResourceGroupsResponse({ groups: resourceGroups });
}
async function handleCreateClusterRequest(
isNewResourceGroup: boolean,
groupName: string,
location: string,
name: string,
webview: MessageSink<ToWebViewMsgDef>,
) {
if (isNewResourceGroup) {
webview.postProgressUpdate({
operationDescription: `Creating Resource Group ${groupName} in ${location}`,
event: ProgressEventType.InProgress,
errorMessage: null,
deploymentPortalUrl: null,
createdCluster: null,
});
await new Promise((resolve) => setTimeout(resolve, 5000));
webview.postProgressUpdate({
operationDescription: `Successfully created ${groupName} in ${location}`,
event: ProgressEventType.InProgress,
errorMessage: null,
deploymentPortalUrl: null,
createdCluster: null,
});
}
const deploymentPortalUrl = `https://portal.azure.com/#resource/subscriptions/${initialState.subscriptionId}/resourceGroups/${groupName}/providers/Microsoft.Resources/deployments/testdeployment?referrer_source=vscode&referrer_context=vscode-aks-tools-test`;
webview.postProgressUpdate({
operationDescription: `Creating Cluster ${name}`,
event: ProgressEventType.InProgress,
errorMessage: null,
deploymentPortalUrl,
createdCluster: null,
});
const waitMs = location === failLocationMarker ? 500 : location === cancelLocationMarker ? 3000 : 10000;
const event =
location === failLocationMarker
? ProgressEventType.Failed
: location === cancelLocationMarker
? ProgressEventType.Cancelled
: ProgressEventType.Success;
const errorMessage = event === ProgressEventType.Failed ? "Mistakes were made" : null;
await new Promise((resolve) => setTimeout(resolve, waitMs));
webview.postProgressUpdate({
operationDescription: "Creating Cluster",
event,
errorMessage,
deploymentPortalUrl,
createdCluster:
event === ProgressEventType.Success
? {
portalUrl: `https://portal.azure.com/#resource/subscriptions/${initialState.subscriptionId}/resourceGroups/${groupName}/providers/Microsoft.ContainerService/managedClusters/${name}?referrer_source=vscode&referrer_context=vscode-aks-tools-test`,
}
: null,
});
}
return [
Scenario.create(
"createCluster",
"",
() => <CreateCluster {...initialState} />,
getMessageHandler,
stateUpdater.vscodeMessageHandler,
),
];
}