forked from baron/baron-sso
adminfront 태넌트 화면 기능 누락 복구
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user