import { describe, it, expect, vi, beforeEach } from 'vitest';
import { UserAdapter } from './UserAdapter';
import { UserError } from '../services/UserService';

describe('UserAdapter', () => {
  let adapter: UserAdapter;
  const mockBaseUrl = 'http://api.example.com';

  beforeEach(() => {
    adapter = new UserAdapter();
    vi.stubGlobal('fetch', vi.fn());
  });

  describe('getAll', () => {
    it('should fetch all entities', async () => {
      const mockEntities = [{ id: '1' }];
      (global.fetch as any).mockResolvedValueOnce({
        ok: true,
        json: () => Promise.resolve(mockEntities),
      });

      const result = await adapter.getAll();
      expect(result).toEqual(mockEntities);
      expect(global.fetch).toHaveBeenCalledWith(
        `${mockBaseUrl}/user`,
        expect.any(Object)
      );
    });

    it('should throw error when request fails', async () => {
      (global.fetch as any).mockResolvedValueOnce({
        ok: false,
        status: 500,
      });

      await expect(adapter.getAll()).rejects.toThrow(UserError);
    });
  });

  // Add more test cases for other methods...
});