Add Mongo and Cassandra connection string E2E tests

Add connection-string data-plane coverage for Mongo and Cassandra, including Mongo firewall rejection coverage and the supporting E2E account/command helpers. Remove an unused import left by the merged login error handling.
This commit is contained in:
Asier Isayas
2026-09-09 06:56:55 -07:00
parent 49ecdb3f98
commit c1a6cf6ecd
4 changed files with 47 additions and 19 deletions
-1
View File
@@ -1,6 +1,5 @@
import { initializeIcons } from "@fluentui/react";
import { useBoolean } from "@fluentui/react-hooks";
import { getErrorMessage } from "Common/ErrorHandlingUtils";
import { AadAuthorizationFailure } from "Platform/Hosted/Components/AadAuthorizationFailure";
import * as React from "react";
import { render } from "react-dom";
+9 -9
View File
@@ -2,15 +2,15 @@ import { Page, expect, test } from "@playwright/test";
import { CosmosDBManagementClient } from "@azure/arm-cosmosdb";
import {
CommandBarButton,
DataExplorer,
ONE_MINUTE_MS,
TestAccount,
generateUniqueName,
getAccountName,
getAzureCLICredentials,
resourceGroupName,
subscriptionId,
CommandBarButton,
DataExplorer,
ONE_MINUTE_MS,
TestAccount,
generateUniqueName,
getAccountName,
getAzureCLICredentials,
resourceGroupName,
subscriptionId,
} from "../fx";
const keyspaceId = generateUniqueName("keyspace");
+4
View File
@@ -43,6 +43,7 @@ export enum TestAccount {
Cassandra = "Cassandra",
Gremlin = "Gremlin",
Mongo = "Mongo",
MongoConnectionStringPublicNetworkAccessDisabled = "MongoConnectionStringPublicNetworkAccessDisabled",
MongoReadonly = "MongoReadOnly",
Mongo32 = "Mongo32",
SQL = "SQL",
@@ -74,6 +75,8 @@ export function getDefaultAccountName(accountType: TestAccount): string {
return `${accountNamePrefix}-de-test-gremlin-1`;
case TestAccount.Mongo:
return `${accountNamePrefix}-de-test-mongo-1`;
case TestAccount.MongoConnectionStringPublicNetworkAccessDisabled:
return `${accountNamePrefix}-de-test-mongo-connstring-nopublic-1`;
case TestAccount.MongoReadonly:
return `${accountNamePrefix}-de-test-mongo-readonly`;
case TestAccount.Mongo32:
@@ -262,6 +265,7 @@ export async function getTestExplorerUrl(accountType: TestAccount, options?: Tes
case TestAccount.SQLConnectionString:
case TestAccount.SQLConnectionStringPublicNetworkAccessDisabled:
case TestAccount.MongoConnectionStringPublicNetworkAccessDisabled:
case TestAccount.TableConnectionString:
case TestAccount.GremlinConnectionString:
// Connection string (account key) login navigates directly to hostedExplorer.html and doesn't
+34 -9
View File
@@ -2,15 +2,15 @@ import { Page, expect, test } from "@playwright/test";
import { CosmosDBManagementClient } from "@azure/arm-cosmosdb";
import {
CommandBarButton,
DataExplorer,
ONE_MINUTE_MS,
TestAccount,
generateUniqueName,
getAccountName,
getAzureCLICredentials,
resourceGroupName,
subscriptionId,
CommandBarButton,
DataExplorer,
ONE_MINUTE_MS,
TestAccount,
generateUniqueName,
getAccountName,
getAzureCLICredentials,
resourceGroupName,
subscriptionId,
} from "../fx";
const databaseId = generateUniqueName("db");
@@ -143,6 +143,31 @@ test.describe("Mongo account using connection string login", () => {
await expect(page.locator(".errorDetails")).not.toBeEmpty();
});
test("blocks Data Explorer when the account does not have Portal middleware services' IPs allowlisted", async ({
page,
}) => {
const blockedAccountName = getAccountName(TestAccount.MongoConnectionStringPublicNetworkAccessDisabled);
const { connectionStrings = [] } = await armClient.databaseAccounts.listConnectionStrings(
resourceGroupName,
blockedAccountName,
);
const blockedConnectionString = connectionStrings.find((cs) => cs.type === "MongoDB")?.connectionString;
if (!blockedConnectionString) {
throw new Error(`Account ${blockedAccountName} did not return a MongoDB connection string`);
}
await loginWithConnectionString(page, blockedConnectionString);
// Unlike SQL, Mongo exchanges the connection string through the Portal Backend before opening
// Data Explorer. The account firewall rejects that middleware request, so login remains blocked.
await expect(page.locator("#connectExplorer")).toBeVisible();
await expect(page.locator(".errorDetails")).toContainText("Couldn't authenticate with Cosmos DB", {
timeout: ONE_MINUTE_MS,
});
await expect(page.getByRole("link", { name: "Allow access from Azure Portal" })).toBeVisible();
});
test("shows an error when the connection string is malformed", async ({ page }) => {
await loginWithConnectionString(page, "this-is-not-a-connection-string");