import { beforeEach, describe, expect, it, vi } from 'vitest' const getMock = vi.fn() const postMock = vi.fn() const putMock = vi.fn() const delMock = vi.fn() vi.mock('@/lib/http/client', () => ({ get: getMock, post: postMock, put: putMock, del: delMock, })) describe('permissions service', () => { beforeEach(() => { getMock.mockReset() postMock.mockReset() putMock.mockReset() delMock.mockReset() }) it('gets permission tree', async () => { const mockTree = [ { id: 1, name: 'dashboard', type: 0, children: [{ id: 2, name: 'view', type: 2 }] }, ] getMock.mockResolvedValue(mockTree) const { getPermissionTree } = await import('./permissions') const result = await getPermissionTree() expect(getMock).toHaveBeenCalledWith('/permissions/tree') expect(result).toEqual([ { id: 1, name: 'dashboard', type: 'menu', children: [{ id: 2, name: 'view', type: 'api' }] }, ]) }) it('lists all permissions', async () => { const mockPermissions = [ { id: 1, name: 'view dashboard', code: 'dashboard:view', type: 0 }, { id: 2, name: 'edit dashboard', code: 'dashboard:edit', type: 1 }, ] getMock.mockResolvedValue(mockPermissions) const { listPermissions } = await import('./permissions') const result = await listPermissions() expect(getMock).toHaveBeenCalledWith('/permissions') expect(result).toEqual([ { id: 1, name: 'view dashboard', code: 'dashboard:view', type: 'menu' }, { id: 2, name: 'edit dashboard', code: 'dashboard:edit', type: 'button' }, ]) }) it('gets a single permission', async () => { getMock.mockResolvedValue({ id: 5, name: 'view users', code: 'users:view', type: 2 }) const { getPermission } = await import('./permissions') const result = await getPermission(5) expect(getMock).toHaveBeenCalledWith('/permissions/5') expect(result).toEqual({ id: 5, name: 'view users', code: 'users:view', type: 'api' }) }) it('creates a permission', async () => { const newPermission = { name: 'new permission', code: 'new:code', type: 'button' as const } const created = { id: 10, ...newPermission, type: 1 } postMock.mockResolvedValue(created) const { createPermission } = await import('./permissions') const result = await createPermission(newPermission) expect(postMock).toHaveBeenCalledWith('/permissions', { ...newPermission, type: 1, }) expect(result).toEqual({ id: 10, name: 'new permission', code: 'new:code', type: 'button' }) }) it('updates a permission', async () => { const updateData = { name: 'updated name' } putMock.mockResolvedValue({ id: 3, ...updateData, type: 0 }) const { updatePermission } = await import('./permissions') const result = await updatePermission(3, updateData) expect(putMock).toHaveBeenCalledWith('/permissions/3', updateData) expect(result).toEqual({ id: 3, name: 'updated name', type: 'menu' }) }) it('deletes a permission', async () => { delMock.mockResolvedValue(undefined) const { deletePermission } = await import('./permissions') await deletePermission(7) expect(delMock).toHaveBeenCalledWith('/permissions/7') }) it('updates permission status', async () => { putMock.mockResolvedValue(undefined) const { updatePermissionStatus } = await import('./permissions') await updatePermissionStatus(4, 0) expect(putMock).toHaveBeenCalledWith('/permissions/4/status', { status: 0 }) }) })