1
0
forked from baron/baron-sso

chore: consolidate local integration changes

This commit is contained in:
2026-06-09 21:03:05 +09:00
parent aa2848c3b6
commit 1341f07ef9
158 changed files with 10995 additions and 1490 deletions

View File

@@ -194,32 +194,19 @@ test("org chart non-shared title does not render the MH Dashboard eyebrow", asyn
window.localStorage.setItem("dev_tenant_id", "group");
});
await page.route("**/api/v1/admin/tenants**", async (route) => {
await page.route("**/api/v1/admin/orgchart/snapshot**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
items: [
tenants: [
{
...tenant("group", "Baron Group", "baron"),
type: "COMPANY_GROUP",
},
tenant("engineering", "Engineering", "engineering", "group"),
],
limit: 10000,
offset: 0,
total: 2,
}),
});
});
await page.route("**/api/v1/admin/users**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
items: [user("u-eng", "Engineering User", "engineering")],
limit: 5000,
offset: 0,
total: 1,
users: [user("u-eng", "Engineering User", "engineering")],
cache: { source: "redis", hit: true },
}),
});
});
@@ -230,6 +217,103 @@ test("org chart non-shared title does not render the MH Dashboard eyebrow", asyn
await expect(page.getByText("MH Dashboard", { exact: true })).toHaveCount(0);
});
test("org chart toggles internal organizations from the total users tooltip", async ({
page,
}) => {
await page.addInitScript(() => {
window.localStorage.setItem("playwright_auth_bypass", "1");
window.localStorage.setItem("dev_tenant_id", "group");
});
await page.route("**/api/v1/admin/orgchart/snapshot**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
tenants: [
{
...tenant("group", "한맥가족", "hanmac-family"),
type: "COMPANY_GROUP",
},
tenant("company", "삼안", "saman", "group"),
{
...tenant("open-team", "공개 팀", "open-team", "company"),
config: { visibility: "public" },
},
{
...tenant("internal-team", "내부 팀", "internal-team", "company"),
config: { visibility: "internal" },
},
],
users: [
user("u-open", "Open User", "open-team"),
user("u-internal", "Internal User", "internal-team"),
],
cache: { source: "redis", hit: true },
}),
});
});
await page.goto("/chart");
await expect(page.getByRole("heading", { name: "조직 현황" })).toBeVisible();
const svg = page.locator('[data-testid="orgchart-vector-svg"]');
const totalUsersControl = page.getByTestId("orgchart-total-users-control");
await expect(totalUsersControl).toHaveText("총 1명");
await expect(svg.getByText("공개 팀", { exact: true })).toBeVisible();
await expect(svg.getByText(/Open User/)).toBeVisible();
await expect(svg.getByText("내부 팀", { exact: true })).toHaveCount(0);
await expect(svg.getByText("Internal User", { exact: true })).toHaveCount(0);
await totalUsersControl.hover();
await page.getByRole("switch", { name: "내부조직 보기" }).setChecked(true);
await expect(totalUsersControl).toHaveText("총 2명");
await expect(svg.getByText("내부 팀", { exact: true })).toBeVisible();
await expect(svg.getByText(/Internal User/)).toBeVisible();
});
test("org chart defaults to hanmac family when public sector group is listed first", async ({
page,
}) => {
await page.addInitScript(() => {
window.localStorage.setItem("playwright_auth_bypass", "1");
window.localStorage.setItem("dev_tenant_id", "family");
});
await page.route("**/api/v1/admin/orgchart/snapshot**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
tenants: [
{
...tenant("public-sector", "공공기관", "public-sector"),
type: "COMPANY_GROUP",
memberCount: 0,
},
{
...tenant("family", "한맥가족", "hanmac-family"),
type: "COMPANY_GROUP",
},
{
...tenant("saman", "삼안", "saman", "family"),
type: "COMPANY",
},
],
users: [user("u-saman", "Saman User", "saman")],
cache: { source: "redis", hit: true },
}),
});
});
await page.goto("/chart");
const svg = page.locator('[data-testid="orgchart-vector-svg"]');
await expect(page.getByRole("button", { name: "조직: 한맥가족" })).toBeVisible();
await expect(svg.getByText("한맥가족", { exact: true })).toBeVisible();
await expect(svg.getByText("삼안", { exact: true })).toBeVisible();
await expect(svg.getByText("공공기관", { exact: true })).toHaveCount(0);
});
test("org chart renders dense member nodes with calculated member columns", async ({
page,
}) => {

View File

@@ -269,6 +269,58 @@ test("org chart displays user names with short grade aliases and no job details"
await expect(svg.getByText(/팀장|Platform Engineer/)).toHaveCount(0);
});
test("org chart orders top executive members by rank priority", async ({
page,
}) => {
const executiveUser = (id: string, name: string, grade: string) => ({
...user(id, name, "engineering"),
grade,
});
await page.route("**/api/v1/public/orgchart**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
sharedWith: "Playwright",
tenants: [
tenant("group", "HMAC Group", "hmac"),
tenant("engineering", "Engineering", "engineering", "group"),
],
users: [
executiveUser("u-vice-president", "Vice President", "부사장"),
executiveUser("u-adviser", "Adviser", "고문"),
executiveUser("u-vice-chair", "Vice Chair", "부회장"),
executiveUser("u-president", "President", "사장"),
executiveUser("u-chair", "Chair", "회장"),
executiveUser("u-director", "Director", "전무"),
],
}),
});
});
await page.goto("/chart?token=rank-priority");
const engineeringNode = page.locator(
'[data-testid="orgchart-node-engineering"]',
);
await expect(engineeringNode).toBeVisible();
const orderedMemberIds = await engineeringNode
.locator('[data-testid^="orgchart-member-"]')
.evaluateAll((elements) =>
elements.map((element) => element.getAttribute("data-testid")),
);
expect(orderedMemberIds).toEqual([
"orgchart-member-u-chair",
"orgchart-member-u-president",
"orgchart-member-u-vice-chair",
"orgchart-member-u-adviser",
"orgchart-member-u-vice-president",
"orgchart-member-u-director",
]);
});
test("org chart only highlights flagged member cards", async ({ page }) => {
await page.route("**/api/v1/public/orgchart**", async (route) => {
await route.fulfill({
@@ -422,23 +474,12 @@ test("org chart places multi-tenant users only on leaf memberships without dupli
];
const [groupTenant, baronTenant, engineeringTenant, platformTenant] = tenants;
await page.route("**/api/v1/admin/tenants**", async (route) => {
await page.route("**/api/v1/admin/orgchart/snapshot**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
items: tenants,
total: tenants.length,
limit: 10000,
offset: 0,
}),
});
});
await page.route("**/api/v1/admin/users**", async (route) => {
await route.fulfill({
contentType: "application/json",
body: JSON.stringify({
items: [
tenants,
users: [
multiTenantUser("u-shared", "Shared User", "baron", [
groupTenant,
baronTenant,
@@ -446,9 +487,7 @@ test("org chart places multi-tenant users only on leaf memberships without dupli
platformTenant,
]),
],
total: 1,
limit: 5000,
offset: 0,
cache: { source: "redis", hit: true },
}),
});
});