diff --git a/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx b/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx index 942e0e00..8a053d7c 100644 --- a/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx +++ b/adminfront/src/features/user-groups/routes/TenantUserGroupsTab.tsx @@ -231,10 +231,7 @@ export function TenantUserGroupsTab() { t("msg.admin.groups.list.delete_success", "그룹이 삭제되었습니다."), ); groupsQuery.refetch(); - if ( - selectedGroupId && - selectedGroupId === deleteMutation.variables - ) { + if (selectedGroupId && selectedGroupId === deleteMutation.variables) { setSelectedGroupId(null); } }, diff --git a/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx b/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx index 59091292..98b9f9c7 100644 --- a/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx +++ b/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx @@ -96,7 +96,8 @@ export function UserGroupDetailPage() { }); const addMemberMutation = useMutation({ - mutationFn: (userId: string) => addGroupMember(tenantId ?? "", id ?? "", userId), + mutationFn: (userId: string) => + addGroupMember(tenantId ?? "", id ?? "", userId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-detail", id] }); setIsAddMemberOpen(false); @@ -115,7 +116,8 @@ export function UserGroupDetailPage() { }); const removeMemberMutation = useMutation({ - mutationFn: (userId: string) => removeGroupMember(tenantId ?? "", id ?? "", userId), + mutationFn: (userId: string) => + removeGroupMember(tenantId ?? "", id ?? "", userId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-detail", id] }); toast.success( @@ -129,7 +131,12 @@ export function UserGroupDetailPage() { const assignRoleMutation = useMutation({ mutationFn: () => - assignGroupRole(tenantId ?? "", id ?? "", selectedTargetTenantId, selectedRelation), + assignGroupRole( + tenantId ?? "", + id ?? "", + selectedTargetTenantId, + selectedRelation, + ), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-roles", id] }); setIsAddRoleOpen(false); @@ -148,7 +155,12 @@ export function UserGroupDetailPage() { const removeRoleMutation = useMutation({ mutationFn: (role: { targetTenantId: string; relation: string }) => - removeGroupRole(tenantId ?? "", id ?? "", role.targetTenantId, role.relation), + removeGroupRole( + tenantId ?? "", + id ?? "", + role.targetTenantId, + role.relation, + ), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["user-group-roles", id] }); toast.success( diff --git a/adminfront/src/lib/auth.ts b/adminfront/src/lib/auth.ts index 5d1df7d8..8f46d964 100644 --- a/adminfront/src/lib/auth.ts +++ b/adminfront/src/lib/auth.ts @@ -2,7 +2,8 @@ import { UserManager, WebStorageStateStore } from "oidc-client-ts"; import type { AuthProviderProps } from "react-oidc-context"; export const oidcConfig: AuthProviderProps = { - authority: import.meta.env.VITE_OIDC_AUTHORITY || "http://localhost:5000/oidc", // Gateway Proxy URL + authority: + import.meta.env.VITE_OIDC_AUTHORITY || "http://localhost:5000/oidc", // Gateway Proxy URL client_id: import.meta.env.VITE_OIDC_CLIENT_ID || "adminfront", redirect_uri: `${window.location.origin}/auth/callback`, response_type: "code", diff --git a/adminfront/tests/auth.spec.ts b/adminfront/tests/auth.spec.ts index 2c8b7865..77c793f7 100644 --- a/adminfront/tests/auth.spec.ts +++ b/adminfront/tests/auth.spec.ts @@ -4,14 +4,16 @@ test.describe("Auth Flow", () => { test("unauthenticated user is redirected to login", async ({ page }) => { // Navigate to a protected route without setting localStorage await page.goto("/"); - + // Check if it redirects to login await expect(page).toHaveURL(/\/login$/); - + // Verify login page content await expect(page.getByText("Baron SSO")).toBeVisible(); await expect(page.getByText("관리자 로그인")).toBeVisible(); - await expect(page.getByRole("button", { name: "SSO 계정으로 로그인" })).toBeVisible(); + await expect( + page.getByRole("button", { name: "SSO 계정으로 로그인" }), + ).toBeVisible(); }); test("authenticated user can access dashboard", async ({ page }) => { @@ -19,9 +21,9 @@ test.describe("Auth Flow", () => { await page.addInitScript(() => { window.localStorage.setItem("admin_session", "playwright-admin-session"); }); - + await page.goto("/"); - + // Should stay on dashboard (or another protected route) and not redirect to login await expect(page).not.toHaveURL(/\/login$/); }); diff --git a/adminfront/tests/tenants.spec.ts b/adminfront/tests/tenants.spec.ts index 38a9dc47..20df7e27 100644 --- a/adminfront/tests/tenants.spec.ts +++ b/adminfront/tests/tenants.spec.ts @@ -82,7 +82,9 @@ test("tenant create and delete flow", async ({ page }) => { await page.goto("/tenants"); await expect(page).toHaveURL(/\/tenants$/); - await expect(page.getByRole("heading", { name: "테넌트 목록" })).toBeVisible(); + await expect( + page.getByRole("heading", { name: "테넌트 목록" }), + ).toBeVisible(); // Create const addTenantLink = page.getByRole("link", { name: "테넌트 추가" }); @@ -94,8 +96,10 @@ test("tenant create and delete flow", async ({ page }) => { await page.getByLabel("테넌트 유형").selectOption("COMPANY"); await page.getByLabel("슬러그 (Slug)").fill("test-tenant"); await page.getByLabel("설명").fill("This is an E2E test tenant"); - await page.getByLabel("허용된 도메인 (콤마로 구분)").fill("test.com, example.com"); - + await page + .getByLabel("허용된 도메인 (콤마로 구분)") + .fill("test.com, example.com"); + await page.getByRole("button", { name: "생성" }).click(); await expect(page).toHaveURL(/\/tenants$/); @@ -107,16 +111,17 @@ test("tenant create and delete flow", async ({ page }) => { page.once("dialog", (dialog) => dialog.accept()); await createdRow.getByRole("button", { name: "삭제" }).click(); - await expect(page.locator("tbody tr").filter({ hasText: uniqueName })).toHaveCount(0); + await expect( + page.locator("tbody tr").filter({ hasText: uniqueName }), + ).toHaveCount(0); }); test("tenant creation form validation", async ({ page }) => { await page.goto("/tenants/new"); - + // Try to submit empty form await page.getByRole("button", { name: "생성" }).click(); - + // Since 'name' is required, we check if button is still disabled or form doesn't navigate await expect(page).toHaveURL(/\/tenants\/new$/); }); - diff --git a/adminfront/vitest.config.ts b/adminfront/vitest.config.ts index 0d1ed502..db8221c5 100644 --- a/adminfront/vitest.config.ts +++ b/adminfront/vitest.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from "vitest/config"; import react from "@vitejs/plugin-react"; +import { defineConfig } from "vitest/config"; export default defineConfig({ plugins: [react()],