You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.7 KiB
173 lines
4.7 KiB
import {renderHook} from '@testing-library/react';
|
|
import {usePermission} from '../../../src/hooks/usePermissions';
|
|
|
|
// Mock the currentUser API
|
|
vi.mock('../../../src/api/currentUser', () => ({
|
|
useCurrentUser: vi.fn()
|
|
}));
|
|
|
|
import {useCurrentUser} from '../../../src/api/currentUser';
|
|
|
|
const mockUseCurrentUser = useCurrentUser as any;
|
|
|
|
describe('usePermissions', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mockUseCurrentUser.mockReturnValue({data: null, isLoading: false});
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
it('returns false when current user is not loaded', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: null
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin']));
|
|
|
|
expect(result.current).toBe(false);
|
|
});
|
|
|
|
it('returns false when current user has no roles', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: []
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin']));
|
|
|
|
expect(result.current).toBe(false);
|
|
});
|
|
|
|
it('returns true when user has required role', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'admin', id: '1'},
|
|
{name: 'editor', id: '2'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin']));
|
|
|
|
expect(result.current).toBe(true);
|
|
});
|
|
|
|
it('returns true when user has one of multiple required roles', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'editor', id: '2'},
|
|
{name: 'author', id: '3'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin', 'editor', 'owner']));
|
|
|
|
expect(result.current).toBe(true);
|
|
});
|
|
|
|
it('returns false when user does not have any required roles', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'contributor', id: '4'},
|
|
{name: 'author', id: '3'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin', 'editor', 'owner']));
|
|
|
|
expect(result.current).toBe(false);
|
|
});
|
|
|
|
it('handles empty required roles array', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'admin', id: '1'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission([]));
|
|
|
|
expect(result.current).toBe(false);
|
|
});
|
|
|
|
it('handles case sensitivity correctly', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'Admin', id: '1'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin']));
|
|
|
|
expect(result.current).toBe(false); // Case sensitive match
|
|
});
|
|
|
|
it('returns false when current user data is undefined', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: undefined
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['admin']));
|
|
|
|
expect(result.current).toBe(false);
|
|
});
|
|
|
|
it('handles multiple role checks with complex role structure', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'owner', id: '1', description: 'Site owner'},
|
|
{name: 'administrator', id: '2', description: 'Site admin'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['owner']));
|
|
|
|
expect(result.current).toBe(true);
|
|
});
|
|
|
|
it('handles user with single role correctly', () => {
|
|
mockUseCurrentUser.mockReturnValue({
|
|
data: {
|
|
id: '1',
|
|
name: 'Test User',
|
|
roles: [
|
|
{name: 'author', id: '3'}
|
|
]
|
|
}
|
|
});
|
|
|
|
const {result} = renderHook(() => usePermission(['author']));
|
|
|
|
expect(result.current).toBe(true);
|
|
});
|
|
}); |