import { describe, it, expect, vi, beforeEach } from 'vitest'; import { userService } from './userService'; import { apiClient } from '@/services/api/client'; // Mock apiClient vi.mock('@/services/api/client', () => ({ apiClient: { get: vi.fn(), put: vi.fn(), delete: vi.fn(), }, })); const mockedApiClient = apiClient as { get: ReturnType; put: ReturnType; }; describe('userService', () => { beforeEach(() => { vi.clearAllMocks(); }); describe('getProfile', () => { it('should return user profile by id', async () => { mockedApiClient.get.mockResolvedValue({ data: { id: 'u1', username: 'testuser', email: 'test@example.com', first_name: 'Test', last_name: 'User', }, }); const result = await userService.getProfile('u1'); expect(result).toBeDefined(); expect(result).toHaveProperty('profile'); expect(result.profile).toHaveProperty('id'); expect(result.profile).toHaveProperty('username'); expect(result.profile).toHaveProperty('email'); }); }); describe('getProfileByUsername', () => { it('should return user profile by username', async () => { mockedApiClient.get.mockResolvedValue({ data: { id: 'u1', username: 'testuser', email: 'test@example.com', }, }); const result = await userService.getProfileByUsername('testuser'); expect(result).toBeDefined(); expect(result).toHaveProperty('profile'); expect(result.profile).toHaveProperty('username'); expect(result.profile.username).toBe('testuser'); }); }); describe('updateProfile', () => { it('should update user profile', async () => { mockedApiClient.put.mockResolvedValue({ data: { id: 'u1', username: 'testuser', first_name: 'Updated', last_name: 'Name', }, }); const result = await userService.updateProfile('u1', { first_name: 'Updated', last_name: 'Name', }); expect(result).toBeDefined(); expect(result).toHaveProperty('profile'); expect(result.profile.first_name).toBe('Updated'); expect(result.profile.last_name).toBe('Name'); }); }); describe('getProfileCompletion', () => { it('should return profile completion data', async () => { mockedApiClient.get.mockResolvedValue({ data: { completion_percentage: 80, missing_fields: ['bio', 'location'], }, }); const result = await userService.getProfileCompletion('u1'); expect(result).toBeDefined(); expect(result).toHaveProperty('completion_percentage'); expect(result).toHaveProperty('missing_fields'); expect(typeof result.completion_percentage).toBe('number'); expect(Array.isArray(result.missing_fields)).toBe(true); }); }); });