1
0
forked from baron/baron-sso

adminfront 태넌트 화면 기능 누락 복구

This commit is contained in:
2026-05-21 10:29:15 +09:00
parent 5bb1c5871c
commit 8dfe6fed82
3 changed files with 326 additions and 9 deletions

View File

@@ -120,8 +120,8 @@ test.describe("Tenants Management", () => {
items: [
{
id: "company-1",
name: "Hanmac",
slug: "hanmac",
name: "Acme",
slug: "acme",
status: "active",
type: "COMPANY",
memberCount: 0,
@@ -162,7 +162,7 @@ test.describe("Tenants Management", () => {
.getByPlaceholder(/테넌트 이름 또는 슬러그 검색|search/i)
.fill("team-1");
await expect(page.locator("table")).toContainText("Platform");
await expect(page.locator("table")).toContainText("Hanmac");
await expect(page.locator("table")).toContainText("Acme");
await page.getByPlaceholder(/테넌트 이름 또는 슬러그 검색|search/i).fill("");
await page
@@ -176,6 +176,82 @@ test.describe("Tenants Management", () => {
);
});
test("switches tree and flat views, searches UUID, and selects descendants", async ({
page,
}) => {
await page.setViewportSize({ width: 1100, height: 760 });
await page.route("**/api/v1/admin/tenants**", async (route) => {
if (route.request().method() !== "GET") {
return route.continue();
}
await route.fulfill({
json: {
items: [
{
id: "company-1",
name: "Acme",
slug: "acme",
status: "active",
type: "COMPANY",
memberCount: 0,
updatedAt: new Date().toISOString(),
},
{
id: "dept-1",
name: "Planning",
slug: "planning",
status: "active",
type: "ORGANIZATION",
parentId: "company-1",
memberCount: 0,
updatedAt: new Date().toISOString(),
},
{
id: "team-1",
name: "Platform",
slug: "platform",
status: "active",
type: "USER_GROUP",
parentId: "dept-1",
memberCount: 0,
updatedAt: new Date().toISOString(),
},
],
total: 3,
limit: 500,
offset: 0,
},
headers: { "Access-Control-Allow-Origin": "*" },
});
});
await page.goto("/tenants");
await expect(page.getByTestId("tenant-view-tree-btn")).toBeVisible();
await page.getByTestId("tenant-view-table-btn").click();
await expect(page.getByTestId("tenant-view-table-btn")).toHaveAttribute(
"aria-pressed",
"true",
);
await page.getByPlaceholder(/UUID|슬러그|slug/i).fill("team-1");
await expect(page.locator("table")).toContainText("Platform");
await expect(page.locator("table")).not.toContainText("Acme");
await page.getByPlaceholder(/UUID|슬러그|slug/i).fill("");
await page
.locator("tbody tr")
.filter({ hasText: "Acme" })
.getByRole("checkbox")
.click();
await expect(page.getByTestId("tenant-bulk-action-bar")).toContainText(
"3개 선택됨",
);
});
test("should virtualize large tenant lists and load next pages automatically", async ({
page,
}) => {
@@ -565,6 +641,13 @@ test.describe("Tenants Management", () => {
let exportUrl = "";
let importRequested = false;
let importBody = "";
const openDataManagementMenu = async () => {
const exportMenuItem = page.getByTestId("tenant-export-menu-item");
if (!(await exportMenuItem.isVisible().catch(() => false))) {
await page.getByTestId("tenant-data-mgmt-btn").click();
}
await expect(exportMenuItem).toBeVisible();
};
await page.route("**/api/v1/admin/tenants**", async (route) => {
const url = route.request().url();
@@ -627,18 +710,34 @@ test.describe("Tenants Management", () => {
await expect(page.getByText(/조직\/사용자 통합/)).toHaveCount(0);
// Open Data Management dropdown for export check
await page.getByTestId("tenant-data-mgmt-btn").click();
await openDataManagementMenu();
await expect(page.getByTestId("tenant-template-menu-item")).toBeVisible();
await expect(page.getByTestId("tenant-export-menu-item")).toBeVisible();
await expect(page.getByTestId("tenant-import-menu-item")).toBeVisible();
const download = page.waitForEvent("download");
await page.getByTestId("tenant-export-menu-item").click();
await download;
await page.getByTestId("tenant-export-menu-item").dispatchEvent("click");
const exportDownload = await download;
expect(exportRequested).toBe(true);
expect(exportDownload.suggestedFilename()).toBe("tenants.csv");
expect(exportUrl).toContain("includeIds=false");
await openDataManagementMenu();
await expect(
page.getByTestId("tenant-export-with-ids-menu-item"),
).toBeVisible();
const exportWithIdsDownload = page.waitForEvent("download");
await page
.getByTestId("tenant-export-with-ids-menu-item")
.dispatchEvent("click");
await exportWithIdsDownload;
expect(exportUrl).toContain("includeIds=true");
await openDataManagementMenu();
const templateDownload = page.waitForEvent("download");
await page.getByTestId("tenant-template-menu-item").dispatchEvent("click");
const template = await templateDownload;
expect(template.suggestedFilename()).toBe("tenant-import-template.csv");
// Upload directly via setInputFiles (Playwright supports hidden inputs)
await page.getByTestId("tenant-import-input").setInputFiles({
name: "tenants.csv",