Files
dashboard/e2e/tests/dns-settings.spec.ts
Maycon Santos 7653e3411c Merge NetBird cloud edition into the dashboard (#674)
Brings the unified dashboard into the open-source repo. Premium features
ship in the open code, gated at runtime via NETBIRD_CLOUD and
NETBIRD_LICENSED, with upgrade prompts for unlicensed self-hosted
deployments. Adds the cloud-only feature areas (billing, integrations,
MSP, traffic events, notifications) and the Playwright e2e suite.
2026-06-21 16:01:08 +02:00

90 lines
3.3 KiB
TypeScript

import { test, expect } from "../helpers/fixtures";
import { navigateTo } from "../helpers/auth";
import { generateRandomName } from "../helpers/utils";
import { deleteGroupsByPrefix } from "../helpers/api";
let dnsGroups: string[] = [];
test.describe.serial("DNS - Settings @dns", () => {
test("Should add groups to DNS disabled management", async ({ dashboardAsOwner: page }) => {
// Clean up stale groups from previous failed runs
await deleteGroupsByPrefix(page, "dns-group-");
await navigateTo(page, "/dns/settings");
const name1 = generateRandomName("dns-group-");
const name2 = generateRandomName("dns-group-");
dnsGroups = [name1, name2];
await expect(page.getByTestId("dns-groups-selector")).toBeVisible({ timeout: 15_000 });
// Remove any existing group badges before adding new ones
const existingBadges = page.getByTestId("group-badge");
const badgeCount = await existingBadges.count();
for (let i = 0; i < badgeCount; i++) {
await existingBadges.first().click();
}
if (badgeCount > 0) {
await page.getByTestId("save-changes").click();
await expect(page.getByText("successfully").first()).toBeVisible();
}
for (const group of dnsGroups) {
// Ensure dropdown is closed before reopening
const search = page.getByTestId("dns-groups-selector-search");
if (await search.isVisible().catch(() => false)) {
await page.keyboard.press("Escape");
await expect(search).not.toBeVisible({ timeout: 3_000 });
}
await page.getByTestId("dns-groups-selector-open-close").click({ force: true });
await expect(search).toBeVisible({ timeout: 5_000 });
await search.fill(group);
await search.press("Enter");
// Wait for the group badge to appear before continuing
await expect(page.getByText(group).first()).toBeVisible({ timeout: 5_000 });
}
// Close the dropdown if still open
await page.keyboard.press("Escape");
for (const group of dnsGroups) {
await expect(page.getByText(group).first()).toBeVisible();
}
const saveResponse = page.waitForResponse(
(resp) => resp.url().includes("/api/dns/settings") && resp.request().method() === "PUT",
{ timeout: 10_000 },
);
await page.getByTestId("save-changes").click();
await saveResponse;
await expect(page.getByText("successfully").first()).toBeVisible();
});
test("Should persist groups after reload and then remove them", async ({
dashboardAsOwner: page,
}) => {
await page.reload();
await expect(page.getByTestId("dns-groups-selector")).toBeVisible({ timeout: 15_000 });
for (const group of dnsGroups) {
await expect(page.getByText(group).first()).toBeVisible({ timeout: 10_000 });
}
// Remove groups
for (const group of dnsGroups) {
await page.getByTestId("group-badge").filter({ hasText: group }).click();
}
await page.getByTestId("save-changes").click();
// Verify removed after reload
await page.reload();
for (const group of dnsGroups) {
await expect(page.getByTestId("group-badge").filter({ hasText: group })).toHaveCount(0);
}
});
test("Should delete the created groups", async ({ dashboardAsOwner: page }) => {
for (const group of dnsGroups) {
await deleteGroupsByPrefix(page, group);
}
});
});