diff --git a/test/sql/containercopy/permissionsScreen.spec.ts b/test/sql/containercopy/permissionsScreen.spec.ts index 2ffb5d56b..ec4ebd0db 100644 --- a/test/sql/containercopy/permissionsScreen.spec.ts +++ b/test/sql/containercopy/permissionsScreen.spec.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { expect, Frame, Locator, Page, test } from "@playwright/test"; -import { set } from "lodash"; import { ContainerCopy, getAccountName, TestAccount } from "../../fx"; const VISIBLE_TIMEOUT_MS = 30 * 1000; @@ -103,9 +102,14 @@ test.describe("Container Copy - Permission Screen Verification", () => { await expect(permissionScreen.getByText("Online container copy", { exact: true })).toBeVisible(); await expect(permissionScreen.getByText("Cross-account container copy", { exact: true })).toBeVisible(); - // Setup API mocking for the source account + // Mock source account updates and refreshes used by the permission actions. await page.route(`**/Microsoft.DocumentDB/databaseAccounts/${sourceAccountName}**`, async (route) => { const mockData = { + id: new URL(route.request().url()).pathname, + name: sourceAccountName, + location: "East US", + type: "Microsoft.DocumentDB/databaseAccounts", + kind: "GlobalDocumentDB", identity: { type: "SystemAssigned", principalId: "00-11-22-33", @@ -118,20 +122,17 @@ test.describe("Container Copy - Permission Screen Verification", () => { capabilities: [{ name: "EnableOnlineContainerCopy" }], }, }; - if (route.request().method() === "GET") { - const response = await route.fetch(); - const actualData = await response.json(); - const mergedData = { ...actualData }; - - set(mergedData, "identity", mockData.identity); - set(mergedData, "properties.defaultIdentity", mockData.properties.defaultIdentity); - set(mergedData, "properties.backupPolicy", mockData.properties.backupPolicy); - set(mergedData, "properties.capabilities", mockData.properties.capabilities); - + if (route.request().method() === "PATCH") { await route.fulfill({ status: 200, contentType: "application/json", - body: JSON.stringify(mergedData), + body: JSON.stringify({ status: "Succeeded" }), + }); + } else if (route.request().method() === "GET") { + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(mockData), }); } else { await route.continue(); @@ -157,16 +158,16 @@ test.describe("Container Copy - Permission Screen Verification", () => { const pitrBtn = accordionPanel.getByTestId("pointInTimeRestore:PrimaryBtn"); await expect(pitrBtn).toBeVisible(); - await pitrBtn.click({ force: true }); // Verify new page opens with correct URL pattern - page.context().on("page", async (newPage) => { - const expectedUrlEndPattern = new RegExp( - `/providers/Microsoft.(DocumentDB|DocumentDb)/databaseAccounts/${sourceAccountName}/backupRestore`, - ); - expect(newPage.url()).toMatch(expectedUrlEndPattern); - await newPage.close(); - }); + const newPagePromise = page.context().waitForEvent("page"); + await pitrBtn.click({ force: true }); + const newPage = await newPagePromise; + const expectedUrlEndPattern = new RegExp( + `/providers/Microsoft.(DocumentDB|DocumentDb)/databaseAccounts/${sourceAccountName}/backupRestore`, + ); + await expect(newPage).toHaveURL(expectedUrlEndPattern); + await newPage.close(); const loadingOverlay = frame.locator("[data-test='loading-overlay']"); await expect(loadingOverlay).toBeVisible(); @@ -216,46 +217,6 @@ test.describe("Container Copy - Permission Screen Verification", () => { }); }); - await page.route(`**/Microsoft.DocumentDB/databaseAccounts/${sourceAccountName}**`, async (route) => { - const mockData = { - identity: { - type: "SystemAssigned", - principalId: "00-11-22-33", - }, - properties: { - defaultIdentity: "SystemAssignedIdentity", - backupPolicy: { - type: "Continuous", - }, - capabilities: [{ name: "EnableOnlineContainerCopy" }], - }, - }; - - if (route.request().method() === "PATCH") { - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify({ status: "Succeeded" }), - }); - } else if (route.request().method() === "GET") { - const response = await route.fetch(); - const actualData = await response.json(); - const mergedData = { ...actualData }; - set(mergedData, "identity", mockData.identity); - set(mergedData, "properties.defaultIdentity", mockData.properties.defaultIdentity); - set(mergedData, "properties.backupPolicy", mockData.properties.backupPolicy); - set(mergedData, "properties.capabilities", mockData.properties.capabilities); - - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify(mergedData), - }); - } else { - await route.continue(); - } - }); - // Verify cross-account permissions functionality const expandedCrossAccordionHeader = permissionScreen .getByTestId("permission-group-container-crossAccountConfigs") @@ -283,12 +244,28 @@ test.describe("Container Copy - Permission Screen Verification", () => { await expect(yesButton).toBeVisible(); await expect(noButton).toBeVisible(); + const identityUpdatePromise = page.waitForResponse( + (response) => + response.request().method() === "PATCH" && + response.url().includes(`/databaseAccounts/${sourceAccountName}`) && + response.url().includes("api-version=2025-04-15"), + ); + const accountRefreshPromise = page.waitForResponse( + (response) => + response.request().method() === "GET" && + response.url().includes(`/databaseAccounts/${sourceAccountName}`) && + response.url().includes("api-version=2025-05-01-preview"), + ); await yesButton.click({ force: true }); + const [identityUpdateResponse, accountRefreshResponse] = await Promise.all([ + identityUpdatePromise, + accountRefreshPromise, + ]); + expect(identityUpdateResponse.ok()).toBe(true); + expect(accountRefreshResponse.ok()).toBe(true); - // Verify loading states - await expect(loadingOverlay).toBeVisible(); - await expect(loadingOverlay).toBeHidden({ timeout: 10 * 1000 }); - await expect(popover).toBeHidden({ timeout: 10 * 1000 }); + // Verify the refreshed account state completes the permission section. + await expect(popover).toBeHidden({ timeout: VISIBLE_TIMEOUT_MS }); // Cancel the panel to clean up await panel.getByRole("button", { name: "Cancel" }).click({ force: true });