forked from baron/baron-sso
orgfront refresh token 관리 추가
This commit is contained in:
@@ -2,7 +2,12 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
import { render, renderHook, screen, waitFor } from "@testing-library/react";
|
||||
import type React from "react";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { fetchMe, fetchTenant } from "../../../lib/adminApi";
|
||||
import {
|
||||
fetchMe,
|
||||
fetchTenant,
|
||||
type TenantSummary,
|
||||
type UserProfileResponse,
|
||||
} from "../../../lib/adminApi";
|
||||
import { TenantPermissionGuard } from "../components/TenantPermissionGuard";
|
||||
import { useTenantPermission } from "./useTenantPermission";
|
||||
|
||||
@@ -22,18 +27,52 @@ function createWrapper() {
|
||||
);
|
||||
}
|
||||
|
||||
function mockProfile(
|
||||
overrides: Partial<UserProfileResponse>,
|
||||
): UserProfileResponse {
|
||||
return {
|
||||
id: "user-id",
|
||||
email: "user@example.com",
|
||||
name: "Test User",
|
||||
phone: "",
|
||||
role: "user",
|
||||
department: "",
|
||||
affiliationType: "general",
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
function mockTenant(overrides: Partial<TenantSummary>): TenantSummary {
|
||||
return {
|
||||
id: "tenant-id",
|
||||
type: "COMPANY",
|
||||
name: "Test Tenant",
|
||||
slug: "test-tenant",
|
||||
description: "",
|
||||
status: "active",
|
||||
memberCount: 0,
|
||||
createdAt: "2026-01-01T00:00:00Z",
|
||||
updatedAt: "2026-01-01T00:00:00Z",
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
describe("useTenantPermission", () => {
|
||||
it("returns true for all permissions if user is super_admin", async () => {
|
||||
vi.mocked(fetchMe).mockResolvedValue({
|
||||
id: "user-super",
|
||||
role: "super_admin",
|
||||
} as any);
|
||||
vi.mocked(fetchMe).mockResolvedValue(
|
||||
mockProfile({
|
||||
id: "user-super",
|
||||
role: "super_admin",
|
||||
}),
|
||||
);
|
||||
|
||||
vi.mocked(fetchTenant).mockResolvedValue({
|
||||
id: "tenant-1",
|
||||
name: "Super Tenant",
|
||||
userPermissions: { view: false, manage: false, manage_admins: false },
|
||||
} as any);
|
||||
vi.mocked(fetchTenant).mockResolvedValue(
|
||||
mockTenant({
|
||||
id: "tenant-1",
|
||||
name: "Super Tenant",
|
||||
userPermissions: { view: false, manage: false, manage_admins: false },
|
||||
}),
|
||||
);
|
||||
|
||||
const { result } = renderHook(() => useTenantPermission("tenant-1"), {
|
||||
wrapper: createWrapper(),
|
||||
@@ -49,16 +88,20 @@ describe("useTenantPermission", () => {
|
||||
});
|
||||
|
||||
it("returns permissions mapped from userPermissions for normal admins/users", async () => {
|
||||
vi.mocked(fetchMe).mockResolvedValue({
|
||||
id: "user-admin",
|
||||
role: "tenant_admin",
|
||||
} as any);
|
||||
vi.mocked(fetchMe).mockResolvedValue(
|
||||
mockProfile({
|
||||
id: "user-admin",
|
||||
role: "tenant_admin",
|
||||
}),
|
||||
);
|
||||
|
||||
vi.mocked(fetchTenant).mockResolvedValue({
|
||||
id: "tenant-2",
|
||||
name: "Tenant Admin Corp",
|
||||
userPermissions: { view: true, manage: true, manage_admins: false },
|
||||
} as any);
|
||||
vi.mocked(fetchTenant).mockResolvedValue(
|
||||
mockTenant({
|
||||
id: "tenant-2",
|
||||
name: "Tenant Admin Corp",
|
||||
userPermissions: { view: true, manage: true, manage_admins: false },
|
||||
}),
|
||||
);
|
||||
|
||||
const { result } = renderHook(() => useTenantPermission("tenant-2"), {
|
||||
wrapper: createWrapper(),
|
||||
@@ -76,15 +119,19 @@ describe("useTenantPermission", () => {
|
||||
|
||||
describe("TenantPermissionGuard", () => {
|
||||
it("renders children when user has permission", async () => {
|
||||
vi.mocked(fetchMe).mockResolvedValue({
|
||||
id: "user-admin",
|
||||
role: "tenant_admin",
|
||||
} as any);
|
||||
vi.mocked(fetchMe).mockResolvedValue(
|
||||
mockProfile({
|
||||
id: "user-admin",
|
||||
role: "tenant_admin",
|
||||
}),
|
||||
);
|
||||
|
||||
vi.mocked(fetchTenant).mockResolvedValue({
|
||||
id: "tenant-3",
|
||||
userPermissions: { view: true, manage: true, manage_admins: false },
|
||||
} as any);
|
||||
vi.mocked(fetchTenant).mockResolvedValue(
|
||||
mockTenant({
|
||||
id: "tenant-3",
|
||||
userPermissions: { view: true, manage: true, manage_admins: false },
|
||||
}),
|
||||
);
|
||||
|
||||
render(
|
||||
<TenantPermissionGuard
|
||||
@@ -104,15 +151,19 @@ describe("TenantPermissionGuard", () => {
|
||||
});
|
||||
|
||||
it("renders fallback when user lacks permission", async () => {
|
||||
vi.mocked(fetchMe).mockResolvedValue({
|
||||
id: "user-admin",
|
||||
role: "tenant_admin",
|
||||
} as any);
|
||||
vi.mocked(fetchMe).mockResolvedValue(
|
||||
mockProfile({
|
||||
id: "user-admin",
|
||||
role: "tenant_admin",
|
||||
}),
|
||||
);
|
||||
|
||||
vi.mocked(fetchTenant).mockResolvedValue({
|
||||
id: "tenant-4",
|
||||
userPermissions: { view: true, manage: false, manage_admins: false },
|
||||
} as any);
|
||||
vi.mocked(fetchTenant).mockResolvedValue(
|
||||
mockTenant({
|
||||
id: "tenant-4",
|
||||
userPermissions: { view: true, manage: false, manage_admins: false },
|
||||
}),
|
||||
);
|
||||
|
||||
render(
|
||||
<TenantPermissionGuard
|
||||
|
||||
Reference in New Issue
Block a user