marketDataAdapter.test.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { describe, expect, it, vi } from 'vitest';
  2. import { MarketDataAdapter } from '../packages/utils/src/marketDataAdapter';
  3. import { ShadowBook } from '../packages/utils/src/shadowBook';
  4. import type { OrderBook } from '../packages/domain/src/types';
  5. describe('MarketDataAdapter', () => {
  6. it('updates shadow book and emits events for snapshot/delta', async () => {
  7. const shadow = new ShadowBook();
  8. const snapshot: OrderBook = {
  9. bids: [{ px: 100, sz: 1 }],
  10. asks: [{ px: 101, sz: 1 }],
  11. ts: Date.now()
  12. };
  13. const fetchSnapshot = vi.fn(async () => snapshot);
  14. const adapter = new MarketDataAdapter({
  15. symbols: ['BTC'],
  16. shadowBook: shadow,
  17. fetchSnapshot,
  18. pollIntervalMs: 10
  19. });
  20. const events: string[] = [];
  21. adapter.on('snapshot', payload => {
  22. events.push(`snapshot:${payload.symbol}`);
  23. });
  24. await adapter.start();
  25. expect(fetchSnapshot).toHaveBeenCalled();
  26. const stored = shadow.snapshot('BTC');
  27. expect(stored?.bids[0]?.px).toBe(100);
  28. adapter.ingestDelta('BTC', {
  29. bids: [{ price: 100.5, size: 2 }],
  30. seq: 1
  31. });
  32. const updated = shadow.snapshot('BTC');
  33. expect(updated?.bids[0]?.px).toBe(100.5);
  34. adapter.stop();
  35. expect(events).toContain('snapshot:BTC');
  36. });
  37. });