when disposing of database during playwright test, refresh tree to remove deleted database

This commit is contained in:
Asier Isayas
2025-12-29 17:13:22 -05:00
parent ff5ebda58e
commit 1736e24429
3 changed files with 105 additions and 94 deletions

View File

@@ -24,7 +24,7 @@ test.describe("Change Partition Key", () => {
}); });
test.afterAll("Delete Test Database", async () => { test.afterAll("Delete Test Database", async () => {
await context?.dispose(); await context?.dispose(explorer);
}); });
test("Change partition key path", async () => { test("Change partition key path", async () => {

View File

@@ -1,4 +1,4 @@
import { expect, Locator, Page, test } from "@playwright/test"; import { expect, Locator, test } from "@playwright/test";
import { import {
CommandBarButton, CommandBarButton,
DataExplorer, DataExplorer,
@@ -10,113 +10,117 @@ import {
import { createTestSQLContainer, TestContainerContext } from "../../testData"; import { createTestSQLContainer, TestContainerContext } from "../../testData";
test.describe("Autoscale and Manual throughput", () => { test.describe("Autoscale and Manual throughput", () => {
const withScaleTab = async ( let context: TestContainerContext = null!;
page: Page, let explorer: DataExplorer = null!;
run: (args: { context: TestContainerContext; explorer: DataExplorer }) => Promise<void>,
): Promise<void> => {
const context = await createTestSQLContainer();
try {
const explorer = await DataExplorer.open(page, TestAccount.SQL);
await explorer.openScaleAndSettings(context); test.beforeEach("Create Test Database & Open container settings", async ({ page }) => {
await explorer.frame.getByTestId("settings-tab-header/ScaleTab").click(); context = await createTestSQLContainer();
explorer = await DataExplorer.open(page, TestAccount.SQL);
await run({ context, explorer }); // Click Scale & Settings and open Scale tab
} finally { await explorer.openScaleAndSettings(context);
await context.dispose(); const scaleTab = explorer.frame.getByTestId("settings-tab-header/ScaleTab");
} await scaleTab.click();
}; });
const getThroughputInput = (explorer: DataExplorer, type: "manual" | "autopilot"): Locator => { test.afterEach("Delete Test Database", async () => {
await context?.dispose(explorer);
});
test("Update autoscale max throughput", async () => {
// By default the created container has manual throughput (Containers created via JS SDK v4.7.0 cannot be created with autoscale throughput)
await switchManualToAutoscaleThroughput();
// Update autoscale max throughput
await getThroughputInput("autopilot").fill(TEST_AUTOSCALE_MAX_THROUGHPUT_RU_2K.toString());
// Save
await explorer.commandBarButton(CommandBarButton.Save).click();
// Read console message
await expect(explorer.getConsoleMessage()).toContainText(
`Successfully updated offer for collection ${context.container.id}`,
{
timeout: 2 * ONE_MINUTE_MS,
},
);
});
test("Update autoscale max throughput passed allowed limit", async () => {
// By default the created container has manual throughput (Containers created via JS SDK v4.7.0 cannot be created with autoscale throughput)
await switchManualToAutoscaleThroughput();
// Get soft allowed max throughput and remove commas
const softAllowedMaxThroughputString = await explorer.frame
.getByTestId("soft-allowed-maximum-throughput")
.innerText();
const softAllowedMaxThroughput = Number(softAllowedMaxThroughputString.replace(/,/g, ""));
// Try to set autoscale max throughput above allowed limit
await getThroughputInput("autopilot").fill((softAllowedMaxThroughput * 10).toString());
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeDisabled();
await expect(getThroughputInputErrorMessage("autopilot")).toContainText(
"This update isn't possible because it would increase the total throughput",
);
});
test("Update autoscale max throughput with invalid increment", async () => {
// By default the created container has manual throughput (Containers created via JS SDK v4.7.0 cannot be created with autoscale throughput)
await switchManualToAutoscaleThroughput();
// Try to set autoscale max throughput with invalid increment
await getThroughputInput("autopilot").fill("1100");
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeDisabled();
await expect(getThroughputInputErrorMessage("autopilot")).toContainText(
"Throughput value must be in increments of 1000",
);
});
test("Update manual throughput", async () => {
await getThroughputInput("manual").fill(TEST_MANUAL_THROUGHPUT_RU_2K.toString());
await explorer.commandBarButton(CommandBarButton.Save).click();
await expect(explorer.getConsoleMessage()).toContainText(
`Successfully updated offer for collection ${context.container.id}`,
{
timeout: 2 * ONE_MINUTE_MS,
},
);
});
test("Update manual throughput passed allowed limit", async () => {
// Get soft allowed max throughput and remove commas
const softAllowedMaxThroughputString = await explorer.frame
.getByTestId("soft-allowed-maximum-throughput")
.innerText();
const softAllowedMaxThroughput = Number(softAllowedMaxThroughputString.replace(/,/g, ""));
// Try to set manual throughput above allowed limit
await getThroughputInput("manual").fill((softAllowedMaxThroughput * 10).toString());
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeDisabled();
await expect(getThroughputInputErrorMessage("manual")).toContainText(
"This update isn't possible because it would increase the total throughput",
);
});
// Helper methods
const getThroughputInput = (type: "manual" | "autopilot"): Locator => {
return explorer.frame.getByTestId(`${type}-throughput-input`); return explorer.frame.getByTestId(`${type}-throughput-input`);
}; };
const getThroughputInputErrorMessage = (explorer: DataExplorer, type: "manual" | "autopilot"): Locator => { const getThroughputInputErrorMessage = (type: "manual" | "autopilot"): Locator => {
return explorer.frame.getByTestId(`${type}-throughput-input-error`); return explorer.frame.getByTestId(`${type}-throughput-input-error`);
}; };
const switchManualToAutoscaleThroughput = async (explorer: DataExplorer, containerId: string): Promise<void> => { const switchManualToAutoscaleThroughput = async (): Promise<void> => {
const autoscaleRadioButton = explorer.frame.getByText("Autoscale", { exact: true }); const autoscaleRadioButton = explorer.frame.getByText("Autoscale", { exact: true });
await autoscaleRadioButton.click(); await autoscaleRadioButton.click();
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeEnabled(); await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeEnabled();
await explorer.commandBarButton(CommandBarButton.Save).click(); await explorer.commandBarButton(CommandBarButton.Save).click();
await expect(explorer.getConsoleMessage()).toContainText( await expect(explorer.getConsoleMessage()).toContainText(
`Successfully updated offer for collection ${containerId}`, `Successfully updated offer for collection ${context.container.id}`,
{ {
timeout: ONE_MINUTE_MS, timeout: ONE_MINUTE_MS,
}, },
); );
}; };
});
test("Update autoscale max throughput", async ({ page }) => {
await withScaleTab(page, async ({ context, explorer }) => {
await switchManualToAutoscaleThroughput(explorer, context.container.id);
await getThroughputInput(explorer, "autopilot").fill(TEST_AUTOSCALE_MAX_THROUGHPUT_RU_2K.toString());
await explorer.commandBarButton(CommandBarButton.Save).click();
await expect(explorer.getConsoleMessage()).toContainText(
`Successfully updated offer for collection ${context.container.id}`,
{ timeout: 2 * ONE_MINUTE_MS },
);
});
});
test("Update autoscale max throughput passed allowed limit", async ({ page }) => {
await withScaleTab(page, async ({ context, explorer }) => {
await switchManualToAutoscaleThroughput(explorer, context.container.id);
const softAllowedMaxThroughputString = await explorer.frame
.getByTestId("soft-allowed-maximum-throughput")
.innerText();
const softAllowedMaxThroughput = Number(softAllowedMaxThroughputString.replace(/,/g, ""));
await getThroughputInput(explorer, "autopilot").fill((softAllowedMaxThroughput * 10).toString());
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeDisabled();
await expect(getThroughputInputErrorMessage(explorer, "autopilot")).toContainText(
"This update isn't possible because it would increase the total throughput",
);
});
});
test("Update autoscale max throughput with invalid increment", async ({ page }) => {
await withScaleTab(page, async ({ context, explorer }) => {
await switchManualToAutoscaleThroughput(explorer, context.container.id);
await getThroughputInput(explorer, "autopilot").fill("1100");
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeDisabled();
await expect(getThroughputInputErrorMessage(explorer, "autopilot")).toContainText(
"Throughput value must be in increments of 1000",
);
});
});
test("Update manual throughput", async ({ page }) => {
await withScaleTab(page, async ({ context, explorer }) => {
await getThroughputInput(explorer, "manual").fill(TEST_MANUAL_THROUGHPUT_RU_2K.toString());
await explorer.commandBarButton(CommandBarButton.Save).click();
await expect(explorer.getConsoleMessage()).toContainText(
`Successfully updated offer for collection ${context.container.id}`,
{ timeout: 2 * ONE_MINUTE_MS },
);
});
});
test("Update manual throughput passed allowed limit", async ({ page }) => {
await withScaleTab(page, async ({ explorer }) => {
const softAllowedMaxThroughputString = await explorer.frame
.getByTestId("soft-allowed-maximum-throughput")
.innerText();
const softAllowedMaxThroughput = Number(softAllowedMaxThroughputString.replace(/,/g, ""));
await getThroughputInput(explorer, "manual").fill((softAllowedMaxThroughput * 10).toString());
await expect(explorer.commandBarButton(CommandBarButton.Save)).toBeDisabled();
await expect(getThroughputInputErrorMessage(explorer, "manual")).toContainText(
"This update isn't possible because it would increase the total throughput",
);
});
});
});

View File

@@ -5,6 +5,7 @@ import { BulkOperationType, Container, CosmosClient, CosmosClientOptions, Databa
import { AzureIdentityCredentialAdapter } from "@azure/ms-rest-js"; import { AzureIdentityCredentialAdapter } from "@azure/ms-rest-js";
import { import {
DataExplorer,
generateUniqueName, generateUniqueName,
getAccountName, getAccountName,
getAzureCLICredentials, getAzureCLICredentials,
@@ -69,8 +70,14 @@ export class TestContainerContext {
public testData: Map<string, TestItem>, public testData: Map<string, TestItem>,
) {} ) {}
async dispose() { async dispose(explorer: DataExplorer) {
await this.database.delete(); await this.database.delete();
// refresh tree to remove deleted database
if (explorer) {
const refreshButton = explorer.frame.getByTestId("Sidebar/RefreshButton");
await refreshButton.click();
}
} }
} }