Files
crypto_trader/frontend/src/api/__tests__/trading.test.ts

127 lines
4.3 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { tradingApi } from '../trading'
import { apiClient } from '../client'
import { OrderSide, OrderType } from '../../types'
vi.mock('../client')
describe('tradingApi', () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe('createOrder', () => {
it('calls correct endpoint with order data', async () => {
const order = {
exchange_id: 1,
symbol: 'BTC/USD',
side: OrderSide.BUY,
order_type: OrderType.MARKET,
quantity: 0.1,
paper_trading: true,
}
const mockResponse = { data: { id: 1, ...order, status: 'pending' } }
vi.mocked(apiClient.post).mockResolvedValue(mockResponse)
const result = await tradingApi.createOrder(order)
expect(apiClient.post).toHaveBeenCalledWith('/api/trading/orders', order)
expect(result).toEqual(mockResponse.data)
})
})
describe('getOrders', () => {
it('calls correct endpoint with default parameters', async () => {
const mockOrders = [{ id: 1, symbol: 'BTC/USD' }]
vi.mocked(apiClient.get).mockResolvedValue({ data: mockOrders })
const result = await tradingApi.getOrders()
expect(apiClient.get).toHaveBeenCalledWith('/api/trading/orders', {
params: { paper_trading: true, limit: 100 },
})
expect(result).toEqual(mockOrders)
})
it('passes custom parameters', async () => {
const mockOrders = [{ id: 1 }]
vi.mocked(apiClient.get).mockResolvedValue({ data: mockOrders })
await tradingApi.getOrders(false, 50)
expect(apiClient.get).toHaveBeenCalledWith('/api/trading/orders', {
params: { paper_trading: false, limit: 50 },
})
})
})
describe('getOrder', () => {
it('calls correct endpoint with order ID', async () => {
const mockOrder = { id: 123, symbol: 'ETH/USD' }
vi.mocked(apiClient.get).mockResolvedValue({ data: mockOrder })
const result = await tradingApi.getOrder(123)
expect(apiClient.get).toHaveBeenCalledWith('/api/trading/orders/123')
expect(result).toEqual(mockOrder)
})
})
describe('cancelOrder', () => {
it('calls correct endpoint to cancel order', async () => {
vi.mocked(apiClient.post).mockResolvedValue({ data: {} })
await tradingApi.cancelOrder(123)
expect(apiClient.post).toHaveBeenCalledWith('/api/trading/orders/123/cancel')
})
})
describe('cancelAllOrders', () => {
it('calls correct endpoint with paper trading param', async () => {
const mockResponse = {
status: 'success',
cancelled_count: 5,
failed_count: 0,
total_orders: 5,
}
vi.mocked(apiClient.post).mockResolvedValue({ data: mockResponse })
const result = await tradingApi.cancelAllOrders(true)
expect(apiClient.post).toHaveBeenCalledWith('/api/trading/orders/cancel-all', null, {
params: { paper_trading: true },
})
expect(result).toEqual(mockResponse)
})
})
describe('getPositions', () => {
it('calls correct endpoint', async () => {
const mockPositions = [{ id: 1, symbol: 'BTC/USD', quantity: 0.5 }]
vi.mocked(apiClient.get).mockResolvedValue({ data: mockPositions })
const result = await tradingApi.getPositions()
expect(apiClient.get).toHaveBeenCalledWith('/api/trading/positions', {
params: { paper_trading: true },
})
expect(result).toEqual(mockPositions)
})
})
describe('getBalance', () => {
it('calls correct endpoint', async () => {
const mockBalance = { total: 10000, available: 8000 }
vi.mocked(apiClient.get).mockResolvedValue({ data: mockBalance })
const result = await tradingApi.getBalance()
expect(apiClient.get).toHaveBeenCalledWith('/api/trading/balance', {
params: { paper_trading: true },
})
expect(result).toEqual(mockBalance)
})
})
})