Skip to content

Commit 5121f7b

Browse files
authored
feat: create e2e tests for IDP org sync settings page (#15767)
Idp organization sync setting is a premium feature located at `/deployment/idp-org-sync` This PR creates a minimal set of e2e tests.
1 parent aa310e3 commit 5121f7b

File tree

3 files changed

+187
-1
lines changed

3 files changed

+187
-1
lines changed

site/e2e/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ code .
5555
Enterprise tests require a license key to run.
5656

5757
```shell
58-
export CODER_E2E_ENTERPRISE_LICENSE=<license key>
58+
export CODER_E2E_LICENSE=<license key>
5959
```
6060

6161
# Debugging tests

site/e2e/api.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,35 @@ export const createOrganization = async () => {
6363
return org;
6464
};
6565

66+
export const deleteOrganization = async (orgName: string) => {
67+
await API.deleteOrganization(orgName);
68+
};
69+
70+
export const createOrganizationWithName = async (name: string) => {
71+
const org = await API.createOrganization({
72+
name,
73+
display_name: `${name}`,
74+
description: `Org description ${name}`,
75+
icon: "/emojis/1f957.png",
76+
});
77+
return org;
78+
};
79+
80+
export const createOrganizationSyncSettings = async () => {
81+
const settings = await API.patchOrganizationIdpSyncSettings({
82+
field: "organization-field-test",
83+
mapping: {
84+
"idp-org-1": [
85+
"fbd2116a-8961-4954-87ae-e4575bd29ce0",
86+
"13de3eb4-9b4f-49e7-b0f8-0c3728a0d2e2",
87+
],
88+
"idp-org-2": ["fbd2116a-8961-4954-87ae-e4575bd29ce0"],
89+
},
90+
organization_assign_default: true,
91+
});
92+
return settings;
93+
};
94+
6695
export async function verifyConfigFlagBoolean(
6796
page: Page,
6897
config: DeploymentConfig,
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
import { expect, test } from "@playwright/test";
2+
import {
3+
createOrganizationSyncSettings,
4+
createOrganizationWithName,
5+
deleteOrganization,
6+
setupApiCalls,
7+
} from "../../api";
8+
import { requiresLicense } from "../../helpers";
9+
import { beforeCoderTest } from "../../hooks";
10+
11+
test.describe("IdpOrgSyncPage", () => {
12+
test.beforeEach(async ({ page }) => await beforeCoderTest(page));
13+
14+
test("add new IdP organization mapping with API", async ({ page }) => {
15+
requiresLicense();
16+
await setupApiCalls(page);
17+
18+
await createOrganizationSyncSettings();
19+
20+
await page.goto("/deployment/idp-org-sync", {
21+
waitUntil: "domcontentloaded",
22+
});
23+
24+
await expect(
25+
page.getByRole("switch", { name: "Assign Default Organization" }),
26+
).toBeChecked();
27+
28+
await expect(page.getByText("idp-org-1")).toBeVisible();
29+
await expect(
30+
page.getByText("fbd2116a-8961-4954-87ae-e4575bd29ce0").first(),
31+
).toBeVisible();
32+
33+
await expect(page.getByText("idp-org-2")).toBeVisible();
34+
await expect(
35+
page.getByText("fbd2116a-8961-4954-87ae-e4575bd29ce0").last(),
36+
).toBeVisible();
37+
});
38+
39+
test("delete a IdP org to coder org mapping row", async ({ page }) => {
40+
requiresLicense();
41+
await setupApiCalls(page);
42+
await createOrganizationSyncSettings();
43+
await page.goto("/deployment/idp-org-sync", {
44+
waitUntil: "domcontentloaded",
45+
});
46+
47+
await expect(page.getByText("idp-org-1")).toBeVisible();
48+
await page
49+
.getByRole("button", { name: /delete/i })
50+
.first()
51+
.click();
52+
await expect(page.getByText("idp-org-1")).not.toBeVisible();
53+
await expect(
54+
page.getByText("Organization sync settings updated."),
55+
).toBeVisible();
56+
});
57+
58+
test("update sync field", async ({ page }) => {
59+
requiresLicense();
60+
await page.goto("/deployment/idp-org-sync", {
61+
waitUntil: "domcontentloaded",
62+
});
63+
64+
const syncField = page.getByRole("textbox", {
65+
name: "Organization sync field",
66+
});
67+
const saveButton = page.getByRole("button", { name: "Save" }).first();
68+
69+
await expect(saveButton).toBeDisabled();
70+
71+
await syncField.fill("test-field");
72+
await expect(saveButton).toBeEnabled();
73+
74+
await page.getByRole("button", { name: "Save" }).click();
75+
76+
await expect(
77+
page.getByText("Organization sync settings updated."),
78+
).toBeVisible();
79+
});
80+
81+
test("toggle default organization assignment", async ({ page }) => {
82+
requiresLicense();
83+
await page.goto("/deployment/idp-org-sync", {
84+
waitUntil: "domcontentloaded",
85+
});
86+
87+
const toggle = page.getByRole("switch", {
88+
name: "Assign Default Organization",
89+
});
90+
await toggle.click();
91+
92+
await expect(
93+
page.getByText("Organization sync settings updated."),
94+
).toBeVisible();
95+
96+
await expect(toggle).not.toBeChecked();
97+
});
98+
99+
test("export policy button is enabled when sync settings are present", async ({
100+
page,
101+
}) => {
102+
requiresLicense();
103+
await setupApiCalls(page);
104+
105+
await page.goto("/deployment/idp-org-sync", {
106+
waitUntil: "domcontentloaded",
107+
});
108+
109+
const exportButton = page.getByRole("button", { name: /Export Policy/i });
110+
await createOrganizationSyncSettings();
111+
112+
await expect(exportButton).toBeEnabled();
113+
await exportButton.click();
114+
});
115+
116+
test("add new IdP organization mapping with UI", async ({ page }) => {
117+
requiresLicense();
118+
await setupApiCalls(page);
119+
120+
await createOrganizationWithName("developers");
121+
122+
await page.goto("/deployment/idp-org-sync", {
123+
waitUntil: "domcontentloaded",
124+
});
125+
126+
const idpOrgInput = page.getByLabel("IdP organization name");
127+
const orgSelector = page.getByPlaceholder("Select organization");
128+
const addButton = page.getByRole("button", {
129+
name: /Add IdP organization/i,
130+
});
131+
132+
await expect(addButton).toBeDisabled();
133+
134+
await idpOrgInput.fill("new-idp-org");
135+
136+
// Select Coder organization from combobox
137+
await orgSelector.click();
138+
await page.getByRole("option", { name: "developers" }).click();
139+
140+
// Add button should now be enabled
141+
await expect(addButton).toBeEnabled();
142+
143+
await addButton.click();
144+
145+
// Verify new mapping appears in table
146+
const newRow = page.getByTestId("idp-org-new-idp-org");
147+
await expect(newRow).toBeVisible();
148+
await expect(newRow.getByText("new-idp-org")).toBeVisible();
149+
await expect(newRow.getByText("developers")).toBeVisible();
150+
151+
await expect(
152+
page.getByText("Organization sync settings updated."),
153+
).toBeVisible();
154+
155+
await deleteOrganization("developers");
156+
});
157+
});

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy