Testing Your Integration

Comprehensive testing strategies for Quub Exchange integrations.

Unit Testing

Mock Quub Client

// __mocks__/@quub/sdk.js
export class QuubClient {
  exchange = {
    createOrder: jest.fn(),
    getMarket: jest.fn(),
    getOrders: jest.fn(),
  };

  custodian = {
    getBalance: jest.fn(),
    getBalances: jest.fn(),
  };
}

Test Example

// __tests__/order-service.test.js
import { OrderService } from "../services/order-service";
import { QuubClient } from "@quub/sdk";

jest.mock("@quub/sdk");

describe("OrderService", () => {
  let orderService;
  let mockClient;

  beforeEach(() => {
    mockClient = new QuubClient();
    orderService = new OrderService(mockClient);
  });

  test("should place order successfully", async () => {
    mockClient.exchange.createOrder.mockResolvedValue({
      orderId: "order_123",
      status: "open",
    });

    const order = await orderService.placeOrder({
      symbol: "BTC-USD",
      side: "buy",
      type: "limit",
      quantity: "0.01",
      price: "45000",
    });

    expect(order.orderId).toBe("order_123");
    expect(mockClient.exchange.createOrder).toHaveBeenCalledTimes(1);
  });
});

Integration Testing

Sandbox Environment

// tests/integration/exchange.test.js
import { QuubClient } from "@quub/sdk";

describe("Exchange Integration", () => {
  let client;

  beforeAll(() => {
    client = new QuubClient({
      apiKey: process.env.SANDBOX_API_KEY,
      apiSecret: process.env.SANDBOX_API_SECRET,
      environment: "sandbox",
    });
  });

  test("should fetch markets", async () => {
    const markets = await client.exchange.getMarkets();
    expect(Array.isArray(markets)).toBe(true);
    expect(markets.length).toBeGreaterThan(0);
  });

  test("should place and cancel order", async () => {
    const order = await client.exchange.createOrder({
      symbol: "BTC-USD",
      side: "buy",
      type: "limit",
      quantity: "0.001",
      price: "1000",
      timeInForce: "GTC",
    });

    expect(order.orderId).toBeDefined();

    const cancelled = await client.exchange.cancelOrder(order.orderId);
    expect(cancelled.status).toBe("cancelled");
  });
});

E2E Testing

Full Flow Test

// tests/e2e/trading-flow.test.js
describe('Complete Trading Flow', () => {
  test('should complete full trading cycle', async () => {
    // 1. Check balance
    const balance = await client.custodian.getBalance('USD');
    expect(parseFloat(balance.available)).toBeGreaterThan(100);

    // 2. Place order
    const order = await client.exchange.createOrder({...});
    expect(order.status).toBe('open');

    // 3. Monitor until filled
    await waitForOrderFill(order.orderId);

    // 4. Verify position
    const position = await client.exchange.getPosition('BTC-USD');
    expect(parseFloat(position.quantity)).toBeGreaterThan(0);

    // 5. Close position
    const closeOrder = await client.exchange.createOrder({
      symbol: 'BTC-USD',
      side: 'sell',
      type: 'market',
      quantity: position.quantity
    });

    expect(closeOrder.status).toBe('filled');
  });
});

Next Steps: