import { describe, it, expect, vi, beforeEach } from 'vitest'; import { developerService } from './developerService'; // Mock the API layer vi.mock('./api/developer', () => ({ developerApi: { listKeys: vi.fn().mockResolvedValue([]), createKey: vi.fn().mockResolvedValue({ id: 'key-1', name: 'Test Key', prefix: 'veza_', scopes: ['read', 'write'], created_at: '2024-01-01T00:00:00Z', key: 'veza_test_key_123', }), deleteKey: vi.fn().mockResolvedValue(undefined), }, })); // Mock webhookService used internally by getStats vi.mock('./webhookService', () => ({ webhookService: { list: vi.fn().mockResolvedValue([]), }, })); // Mock logger vi.mock('@/utils/logger', () => ({ logger: { error: vi.fn(), warn: vi.fn(), info: vi.fn(), debug: vi.fn() }, })); describe('developerService', () => { beforeEach(() => { vi.clearAllMocks(); }); describe('listKeys', () => { it('should return empty array when no keys stored', async () => { const keys = await developerService.listKeys(); expect(keys).toBeDefined(); expect(Array.isArray(keys)).toBe(true); expect(keys.length).toBe(0); }); }); describe('createKey', () => { it('should create a new API key', async () => { const newKey = await developerService.createKey({ name: 'Test Key', scopes: ['read', 'write'], }); expect(newKey).toBeDefined(); expect(newKey.name).toBe('Test Key'); expect(newKey.scopes).toEqual(['read', 'write']); expect(newKey.status).toBe('active'); expect(newKey).toHaveProperty('id'); expect(newKey).toHaveProperty('prefix'); }); }); describe('deleteKey', () => { it('should delete an API key', async () => { await expect(developerService.deleteKey('key-1')).resolves.not.toThrow(); }); }); describe('getStats', () => { it('should return developer statistics', async () => { const stats = await developerService.getStats(); expect(stats).toBeDefined(); expect(stats).toHaveProperty('requests_24h'); expect(stats).toHaveProperty('avg_latency'); expect(stats).toHaveProperty('active_keys'); }); }); });