import { SetMetadata } from '@nestjs/common'; import { RequireRoles, REQUIRE_ROLES_METADATA_KEY } from './RequireRoles'; // Mock SetMetadata vi.mock('@nestjs/common', () => ({ SetMetadata: vi.fn(() => (target: unknown, propertyKey: string, descriptor: PropertyDescriptor) => descriptor), })); describe('RequireRoles', () => { it('should return a method decorator', () => { const decorator = RequireRoles('admin'); expect(typeof decorator).toBe('function'); }); it('should call SetMetadata with correct key and value for single role', () => { RequireRoles('admin'); expect(SetMetadata).toHaveBeenCalledWith(REQUIRE_ROLES_METADATA_KEY, { anyOf: ['admin'], }); }); it('should call SetMetadata with correct key and value for multiple roles', () => { RequireRoles('admin', 'owner', 'moderator'); expect(SetMetadata).toHaveBeenCalledWith(REQUIRE_ROLES_METADATA_KEY, { anyOf: ['admin', 'owner', 'moderator'], }); }); it('should return a decorator that can be used as both method and class decorator', () => { const decorator = RequireRoles('admin'); // Test as method decorator const mockTarget = {}; const mockPropertyKey = 'testMethod'; const mockDescriptor = { value: () => {} }; const result = decorator(mockTarget, mockPropertyKey, mockDescriptor); // The decorator should return the descriptor expect(result).toBe(mockDescriptor); }); it('should have correct metadata key', () => { expect(REQUIRE_ROLES_METADATA_KEY).toBe('gridpilot:requireRoles'); }); it('should handle empty roles array', () => { const decorator = RequireRoles(); // Test as method decorator const mockTarget = {}; const mockPropertyKey = 'testMethod'; const mockDescriptor = { value: () => {} }; const result = decorator(mockTarget, mockPropertyKey, mockDescriptor); expect(result).toBe(mockDescriptor); }); it('should handle roles with special characters', () => { RequireRoles('admin-user', 'owner@company'); expect(SetMetadata).toHaveBeenCalledWith(REQUIRE_ROLES_METADATA_KEY, { anyOf: ['admin-user', 'owner@company'], }); }); });