From f166ef9c66c72a70e1689ed75f7c474be9394868 Mon Sep 17 00:00:00 2001 From: sakshigupta12feb Date: Mon, 2 Feb 2026 13:02:36 +0530 Subject: [PATCH] Add Playwright E2E tests for Dynamic Data Masking feature (#2348) (#2349) * Add Playwright E2E tests for Dynamic Data Masking feature (#2348) * Initial plan * Add DDM Playwright test with comprehensive test cases Co-authored-by: sakshigupta12feb <206070758+sakshigupta12feb@users.noreply.github.com> * Remove disable DDM test - DDM cannot be disabled once enabled Co-authored-by: sakshigupta12feb <206070758+sakshigupta12feb@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sakshigupta12feb <206070758+sakshigupta12feb@users.noreply.github.com> * Fix format and lint errors in DDM Playwright tests (#2350) * Initial plan * Fix format and lint errors in dataMasking.spec.ts Co-authored-by: sakshigupta12feb <206070758+sakshigupta12feb@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sakshigupta12feb <206070758+sakshigupta12feb@users.noreply.github.com> * playwright testfor DDM * fixed errors * fixed playwright based on isPolicyEnabled(removal) --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: sakshigupta12feb <206070758+sakshigupta12feb@users.noreply.github.com> Co-authored-by: Sakshi Gupta --- test/sql/scaleAndSettings/dataMasking.spec.ts | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 test/sql/scaleAndSettings/dataMasking.spec.ts diff --git a/test/sql/scaleAndSettings/dataMasking.spec.ts b/test/sql/scaleAndSettings/dataMasking.spec.ts new file mode 100644 index 000000000..0c076554f --- /dev/null +++ b/test/sql/scaleAndSettings/dataMasking.spec.ts @@ -0,0 +1,127 @@ +import { expect, test, type Page } from "@playwright/test"; +import { DataExplorer, TestAccount } from "../../fx"; +import { createTestSQLContainer, TestContainerContext } from "../../testData"; + +/** + * Tests for Dynamic Data Masking (DDM) feature. + * + * Prerequisites: + * - Test account must have the EnableDynamicDataMasking capability enabled + * - If the capability is not enabled, the DataMaskingTab will not be visible and tests will be skipped + * + * Important Notes: + * - Tests focus on enabling DDM and modifying the masking policy configuration + */ + +let testContainer: TestContainerContext; +let DATABASE_ID: string; +let CONTAINER_ID: string; + +test.beforeAll(async () => { + testContainer = await createTestSQLContainer(); + DATABASE_ID = testContainer.database.id; + CONTAINER_ID = testContainer.container.id; +}); + +// Clean up test database after all tests +test.afterAll(async () => { + if (testContainer) { + await testContainer.dispose(); + } +}); + +// Helper function to navigate to Data Masking tab +async function navigateToDataMaskingTab(page: Page, explorer: DataExplorer): Promise { + // Refresh the tree to see the newly created database + const refreshButton = explorer.frame.getByTestId("Sidebar/RefreshButton"); + await refreshButton.click(); + await page.waitForTimeout(3000); + + // Expand database and container nodes + const databaseNode = await explorer.waitForNode(DATABASE_ID); + await databaseNode.expand(); + await page.waitForTimeout(2000); + + const containerNode = await explorer.waitForNode(`${DATABASE_ID}/${CONTAINER_ID}`); + await containerNode.expand(); + await page.waitForTimeout(1000); + + // Click Scale & Settings or Settings (depending on container type) + let settingsNode = explorer.frame.getByTestId(`TreeNode:${DATABASE_ID}/${CONTAINER_ID}/Scale & Settings`); + const isScaleAndSettings = await settingsNode.isVisible().catch(() => false); + + if (!isScaleAndSettings) { + settingsNode = explorer.frame.getByTestId(`TreeNode:${DATABASE_ID}/${CONTAINER_ID}/Settings`); + } + + await settingsNode.click(); + await page.waitForTimeout(2000); + + // Check if Data Masking tab is available + const dataMaskingTab = explorer.frame.getByTestId("settings-tab-header/DataMaskingTab"); + const isTabVisible = await dataMaskingTab.isVisible().catch(() => false); + + if (!isTabVisible) { + return false; + } + + await dataMaskingTab.click(); + await page.waitForTimeout(1000); + return true; +} + +test.describe("Data Masking under Scale & Settings", () => { + test("Data Masking tab should be visible and show JSON editor", async ({ page }) => { + const explorer = await DataExplorer.open(page, TestAccount.SQL); + const isTabAvailable = await navigateToDataMaskingTab(page, explorer); + + if (!isTabAvailable) { + test.skip( + true, + "Data Masking tab is not available. Test account may not have EnableDynamicDataMasking capability.", + ); + } + + // Verify the Data Masking editor is visible + const dataMaskingEditor = explorer.frame.locator(".settingsV2Editor"); + await expect(dataMaskingEditor).toBeVisible(); + }); + + test("Data Masking editor should contain default policy structure", async ({ page }) => { + const explorer = await DataExplorer.open(page, TestAccount.SQL); + const isTabAvailable = await navigateToDataMaskingTab(page, explorer); + + if (!isTabAvailable) { + test.skip( + true, + "Data Masking tab is not available. Test account may not have EnableDynamicDataMasking capability.", + ); + } + + // Verify the editor contains the expected JSON structure fields + const editorContent = explorer.frame.locator(".settingsV2Editor"); + await expect(editorContent).toBeVisible(); + + // Check that the editor contains key policy fields (default policy has empty arrays) + await expect(editorContent).toContainText("includedPaths"); + await expect(editorContent).toContainText("excludedPaths"); + }); + + test("Data Masking editor should have correct default policy values", async ({ page }) => { + const explorer = await DataExplorer.open(page, TestAccount.SQL); + const isTabAvailable = await navigateToDataMaskingTab(page, explorer); + + if (!isTabAvailable) { + test.skip( + true, + "Data Masking tab is not available. Test account may not have EnableDynamicDataMasking capability.", + ); + } + + const editorContent = explorer.frame.locator(".settingsV2Editor"); + await expect(editorContent).toBeVisible(); + + // Default policy should have empty includedPaths and excludedPaths arrays + await expect(editorContent).toContainText("[]"); + }); +});