forked from baron/baron-sso
테넌트 스위칭 기능 E2E 테스트 추가
This commit is contained in:
118
devfront/tests/devfront-tenant-switch.spec.ts
Normal file
118
devfront/tests/devfront-tenant-switch.spec.ts
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
import {
|
||||||
|
installDevApiMock,
|
||||||
|
makeClient,
|
||||||
|
seedAuth,
|
||||||
|
} from "./helpers/devfront-fixtures";
|
||||||
|
|
||||||
|
test.describe("DevFront tenant switch", () => {
|
||||||
|
const MOCK_STATE = {
|
||||||
|
clients: [
|
||||||
|
makeClient("client-a", { name: "Tenant A App" }),
|
||||||
|
],
|
||||||
|
consents: [],
|
||||||
|
auditLogs: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.route("**/api/v1/user/me", async (route) => {
|
||||||
|
if (route.request().method() === "GET") {
|
||||||
|
await route.fulfill({
|
||||||
|
status: 200,
|
||||||
|
contentType: "application/json",
|
||||||
|
body: JSON.stringify({
|
||||||
|
id: "playwright-user",
|
||||||
|
email: "playwright@example.com",
|
||||||
|
name: "Playwright User",
|
||||||
|
role: "tenant_admin",
|
||||||
|
tenantId: "tenant-a",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await route.continue();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("multiple tenants: user can switch tenant context", async ({ page }) => {
|
||||||
|
// Seed an admin user
|
||||||
|
await seedAuth(page, "tenant_admin");
|
||||||
|
|
||||||
|
await installDevApiMock(page, MOCK_STATE);
|
||||||
|
|
||||||
|
// Mock API to return multiple tenants
|
||||||
|
await page.route("**/api/v1/dev/my-tenants", async (route) => {
|
||||||
|
await route.fulfill({
|
||||||
|
status: 200,
|
||||||
|
contentType: "application/json",
|
||||||
|
body: JSON.stringify([
|
||||||
|
{ id: "tenant-a", name: "Tenant A", slug: "tenant-a" },
|
||||||
|
{ id: "tenant-b", name: "Tenant B", slug: "tenant-b" },
|
||||||
|
]),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Navigate to profile page
|
||||||
|
await page.goto("/profile");
|
||||||
|
|
||||||
|
// Wait for the switcher to load
|
||||||
|
const switcherHeading = page.getByText("작업 테넌트 (컨텍스트)");
|
||||||
|
await expect(switcherHeading).toBeVisible();
|
||||||
|
|
||||||
|
// Verify initial state is selected (tenant-a comes from seedAuth)
|
||||||
|
const select = page.getByRole("combobox", { name: /테넌트/i });
|
||||||
|
await expect(select).toHaveValue("tenant-a");
|
||||||
|
|
||||||
|
// Change to Tenant B
|
||||||
|
await select.selectOption("tenant-b");
|
||||||
|
|
||||||
|
// Click Save
|
||||||
|
await page.getByRole("button", { name: /저장|Save/i }).click();
|
||||||
|
|
||||||
|
// Verify success toast
|
||||||
|
await expect(page.getByText("테넌트 전환 완료").first()).toBeVisible();
|
||||||
|
|
||||||
|
// Verify localStorage was updated
|
||||||
|
const savedTenantId = await page.evaluate(() =>
|
||||||
|
window.localStorage.getItem("dev_tenant_id"),
|
||||||
|
);
|
||||||
|
expect(savedTenantId).toBe("tenant-b");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("single tenant: switcher is disabled with a notice", async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
await seedAuth(page, "tenant_admin");
|
||||||
|
|
||||||
|
// Mock API to return only ONE tenant
|
||||||
|
await page.route("**/api/v1/dev/my-tenants", async (route) => {
|
||||||
|
await route.fulfill({
|
||||||
|
status: 200,
|
||||||
|
contentType: "application/json",
|
||||||
|
body: JSON.stringify([
|
||||||
|
{ id: "tenant-a", name: "Tenant A", slug: "tenant-a" },
|
||||||
|
]),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await installDevApiMock(page, MOCK_STATE);
|
||||||
|
|
||||||
|
await page.goto("/profile");
|
||||||
|
|
||||||
|
// Wait for the switcher to load
|
||||||
|
await expect(page.getByText("작업 테넌트 (컨텍스트)")).toBeVisible();
|
||||||
|
|
||||||
|
// Verify the select is disabled
|
||||||
|
const select = page.getByRole("combobox", { name: /테넌트/i });
|
||||||
|
await expect(select).toBeDisabled();
|
||||||
|
|
||||||
|
// Verify the save button is disabled
|
||||||
|
const saveButton = page.getByRole("button", { name: /저장|Save/i });
|
||||||
|
await expect(saveButton).toBeDisabled();
|
||||||
|
|
||||||
|
// Verify the notice message
|
||||||
|
await expect(
|
||||||
|
page.getByText("단일 테넌트에 소속되어 전환할 필요가 없습니다.")
|
||||||
|
).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user