@catalyst-team/poly-sdk 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -0
- package/dist/clients/ctf-client.d.ts +6 -4
- package/dist/clients/ctf-client.d.ts.map +1 -1
- package/dist/clients/ctf-client.js.map +1 -1
- package/dist/clients/data-api.d.ts +19 -6
- package/dist/clients/data-api.d.ts.map +1 -1
- package/dist/clients/data-api.js +79 -34
- package/dist/clients/data-api.js.map +1 -1
- package/dist/clients/gamma-api.d.ts +5 -0
- package/dist/clients/gamma-api.d.ts.map +1 -1
- package/dist/clients/gamma-api.js +2 -0
- package/dist/clients/gamma-api.js.map +1 -1
- package/dist/core/cache.d.ts +2 -0
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +4 -0
- package/dist/core/cache.js.map +1 -1
- package/dist/core/rate-limiter.d.ts +2 -1
- package/dist/core/rate-limiter.d.ts.map +1 -1
- package/dist/core/rate-limiter.js +7 -0
- package/dist/core/rate-limiter.js.map +1 -1
- package/dist/core/types.d.ts +105 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/scripts/dip-arb/auto-trade.d.ts +20 -0
- package/dist/scripts/dip-arb/auto-trade.d.ts.map +1 -0
- package/dist/scripts/dip-arb/auto-trade.js +373 -0
- package/dist/scripts/dip-arb/auto-trade.js.map +1 -0
- package/dist/scripts/dip-arb/example-basic.d.ts +30 -0
- package/dist/scripts/dip-arb/example-basic.d.ts.map +1 -0
- package/dist/scripts/dip-arb/example-basic.js +222 -0
- package/dist/scripts/dip-arb/example-basic.js.map +1 -0
- package/dist/scripts/dip-arb/redeem-positions.d.ts +11 -0
- package/dist/scripts/dip-arb/redeem-positions.d.ts.map +1 -0
- package/dist/scripts/dip-arb/redeem-positions.js +201 -0
- package/dist/scripts/dip-arb/redeem-positions.js.map +1 -0
- package/dist/scripts/dip-arb/scan-markets.d.ts +6 -0
- package/dist/scripts/dip-arb/scan-markets.d.ts.map +1 -0
- package/dist/scripts/dip-arb/scan-markets.js +73 -0
- package/dist/scripts/dip-arb/scan-markets.js.map +1 -0
- package/dist/services/arbitrage-service.d.ts.map +1 -1
- package/dist/services/arbitrage-service.js +14 -4
- package/dist/services/arbitrage-service.js.map +1 -1
- package/dist/services/binance-service.d.ts +154 -0
- package/dist/services/binance-service.d.ts.map +1 -0
- package/dist/services/binance-service.js +266 -0
- package/dist/services/binance-service.js.map +1 -0
- package/dist/services/dip-arb-service.d.ts +209 -0
- package/dist/services/dip-arb-service.d.ts.map +1 -0
- package/dist/services/dip-arb-service.js +1602 -0
- package/dist/services/dip-arb-service.js.map +1 -0
- package/dist/services/dip-arb-types.d.ts +553 -0
- package/dist/services/dip-arb-types.d.ts.map +1 -0
- package/dist/services/dip-arb-types.js +164 -0
- package/dist/services/dip-arb-types.js.map +1 -0
- package/dist/services/market-service.d.ts +162 -3
- package/dist/services/market-service.d.ts.map +1 -1
- package/dist/services/market-service.js +427 -14
- package/dist/services/market-service.js.map +1 -1
- package/dist/services/realtime-service-v2.d.ts +1 -0
- package/dist/services/realtime-service-v2.d.ts.map +1 -1
- package/dist/services/realtime-service-v2.js +20 -2
- package/dist/services/realtime-service-v2.js.map +1 -1
- package/dist/services/smart-money-service.d.ts +157 -1
- package/dist/services/smart-money-service.d.ts.map +1 -1
- package/dist/services/smart-money-service.js +224 -0
- package/dist/services/smart-money-service.js.map +1 -1
- package/dist/services/trading-service.d.ts +21 -0
- package/dist/services/trading-service.d.ts.map +1 -1
- package/dist/services/trading-service.js +67 -1
- package/dist/services/trading-service.js.map +1 -1
- package/dist/services/wallet-service.d.ts +43 -2
- package/dist/services/wallet-service.d.ts.map +1 -1
- package/dist/services/wallet-service.js +54 -3
- package/dist/services/wallet-service.js.map +1 -1
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts +12 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.js +267 -0
- package/dist/src/__tests__/integration/arbitrage-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.js +260 -0
- package/dist/src/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.js +234 -0
- package/dist/src/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/data-api.integration.test.d.ts +9 -0
- package/dist/src/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/data-api.integration.test.js +164 -0
- package/dist/src/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.js +170 -0
- package/dist/src/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/market-service.integration.test.d.ts +10 -0
- package/dist/src/__tests__/integration/market-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/market-service.integration.test.js +180 -0
- package/dist/src/__tests__/integration/market-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts +10 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js +307 -0
- package/dist/src/__tests__/integration/realtime-service-v2.integration.test.js.map +1 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.d.ts +10 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.js +58 -0
- package/dist/src/__tests__/integration/trading-service.integration.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +92 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +143 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/clients/bridge-client.d.ts +388 -0
- package/dist/src/clients/bridge-client.d.ts.map +1 -0
- package/dist/src/clients/bridge-client.js +587 -0
- package/dist/src/clients/bridge-client.js.map +1 -0
- package/dist/src/clients/ctf-client.d.ts +475 -0
- package/dist/src/clients/ctf-client.d.ts.map +1 -0
- package/dist/src/clients/ctf-client.js +915 -0
- package/dist/src/clients/ctf-client.js.map +1 -0
- package/dist/src/clients/data-api.d.ts +452 -0
- package/dist/src/clients/data-api.d.ts.map +1 -0
- package/dist/src/clients/data-api.js +637 -0
- package/dist/src/clients/data-api.js.map +1 -0
- package/dist/src/clients/gamma-api.d.ts +421 -0
- package/dist/src/clients/gamma-api.d.ts.map +1 -0
- package/dist/src/clients/gamma-api.js +359 -0
- package/dist/src/clients/gamma-api.js.map +1 -0
- package/dist/src/clients/subgraph.d.ts +196 -0
- package/dist/src/clients/subgraph.d.ts.map +1 -0
- package/dist/src/clients/subgraph.js +332 -0
- package/dist/src/clients/subgraph.js.map +1 -0
- package/dist/src/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/src/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/src/core/cache-adapter-bridge.js +81 -0
- package/dist/src/core/cache-adapter-bridge.js.map +1 -0
- package/dist/src/core/cache.d.ts +43 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/src/core/cache.js +76 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/errors.d.ts +39 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +86 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/rate-limiter.d.ts +33 -0
- package/dist/src/core/rate-limiter.d.ts.map +1 -0
- package/dist/src/core/rate-limiter.js +82 -0
- package/dist/src/core/rate-limiter.js.map +1 -0
- package/dist/src/core/types.d.ts +506 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +49 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/types.test.d.ts +7 -0
- package/dist/src/core/types.test.d.ts.map +1 -0
- package/dist/src/core/types.test.js +122 -0
- package/dist/src/core/types.test.js.map +1 -0
- package/dist/src/core/unified-cache.d.ts +63 -0
- package/dist/src/core/unified-cache.d.ts.map +1 -0
- package/dist/src/core/unified-cache.js +114 -0
- package/dist/src/core/unified-cache.js.map +1 -0
- package/dist/src/index.d.ts +159 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +262 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/arbitrage-service.d.ts +409 -0
- package/dist/src/services/arbitrage-service.d.ts.map +1 -0
- package/dist/src/services/arbitrage-service.js +1450 -0
- package/dist/src/services/arbitrage-service.js.map +1 -0
- package/dist/src/services/authorization-service.d.ts +97 -0
- package/dist/src/services/authorization-service.d.ts.map +1 -0
- package/dist/src/services/authorization-service.js +279 -0
- package/dist/src/services/authorization-service.js.map +1 -0
- package/dist/src/services/binance-service.d.ts +154 -0
- package/dist/src/services/binance-service.d.ts.map +1 -0
- package/dist/src/services/binance-service.js +266 -0
- package/dist/src/services/binance-service.js.map +1 -0
- package/dist/src/services/dip-arb-service.d.ts +245 -0
- package/dist/src/services/dip-arb-service.d.ts.map +1 -0
- package/dist/src/services/dip-arb-service.js +1865 -0
- package/dist/src/services/dip-arb-service.js.map +1 -0
- package/dist/src/services/dip-arb-types.d.ts +553 -0
- package/dist/src/services/dip-arb-types.d.ts.map +1 -0
- package/dist/src/services/dip-arb-types.js +164 -0
- package/dist/src/services/dip-arb-types.js.map +1 -0
- package/dist/src/services/market-service.d.ts +370 -0
- package/dist/src/services/market-service.d.ts.map +1 -0
- package/dist/src/services/market-service.js +1200 -0
- package/dist/src/services/market-service.js.map +1 -0
- package/dist/src/services/onchain-service.d.ts +309 -0
- package/dist/src/services/onchain-service.d.ts.map +1 -0
- package/dist/src/services/onchain-service.js +417 -0
- package/dist/src/services/onchain-service.js.map +1 -0
- package/dist/src/services/realtime-service-v2.d.ts +367 -0
- package/dist/src/services/realtime-service-v2.d.ts.map +1 -0
- package/dist/src/services/realtime-service-v2.js +876 -0
- package/dist/src/services/realtime-service-v2.js.map +1 -0
- package/dist/src/services/smart-money-service.d.ts +352 -0
- package/dist/src/services/smart-money-service.d.ts.map +1 -0
- package/dist/src/services/smart-money-service.js +582 -0
- package/dist/src/services/smart-money-service.js.map +1 -0
- package/dist/src/services/swap-service.d.ts +217 -0
- package/dist/src/services/swap-service.d.ts.map +1 -0
- package/dist/src/services/swap-service.js +695 -0
- package/dist/src/services/swap-service.js.map +1 -0
- package/dist/src/services/trading-service.d.ts +177 -0
- package/dist/src/services/trading-service.d.ts.map +1 -0
- package/dist/src/services/trading-service.js +422 -0
- package/dist/src/services/trading-service.js.map +1 -0
- package/dist/src/services/wallet-service.d.ts +316 -0
- package/dist/src/services/wallet-service.d.ts.map +1 -0
- package/dist/src/services/wallet-service.js +681 -0
- package/dist/src/services/wallet-service.js.map +1 -0
- package/dist/src/utils/price-utils.d.ts +153 -0
- package/dist/src/utils/price-utils.d.ts.map +1 -0
- package/dist/src/utils/price-utils.js +236 -0
- package/dist/src/utils/price-utils.js.map +1 -0
- package/dist/src/utils/price-utils.test.d.ts +5 -0
- package/dist/src/utils/price-utils.test.d.ts.map +1 -0
- package/dist/src/utils/price-utils.test.js +192 -0
- package/dist/src/utils/price-utils.test.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RealtimeServiceV2 Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the new RealtimeServiceV2 that uses @polymarket/real-time-data-client.
|
|
5
|
+
* These tests make REAL WebSocket connections to Polymarket.
|
|
6
|
+
*
|
|
7
|
+
* Run with: pnpm test:integration
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeAll, afterEach } from 'vitest';
|
|
10
|
+
import { RealtimeServiceV2 } from '../../services/realtime-service-v2.js';
|
|
11
|
+
describe('RealtimeServiceV2 Integration', () => {
|
|
12
|
+
let service;
|
|
13
|
+
let testYesTokenId;
|
|
14
|
+
let testNoTokenId;
|
|
15
|
+
let testConditionId;
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
// Find a liquid market for testing
|
|
18
|
+
const response = await fetch('https://gamma-api.polymarket.com/markets?active=true&limit=1&order=volume24hr&ascending=false');
|
|
19
|
+
const markets = await response.json();
|
|
20
|
+
if (markets.length === 0) {
|
|
21
|
+
throw new Error('No active markets found for testing');
|
|
22
|
+
}
|
|
23
|
+
testConditionId = markets[0].conditionId;
|
|
24
|
+
console.log(`Using test market: "${markets[0].question.slice(0, 50)}..."`);
|
|
25
|
+
// Get token IDs from CLOB API
|
|
26
|
+
const clobResponse = await fetch(`https://clob.polymarket.com/markets/${testConditionId}`);
|
|
27
|
+
const clobMarket = await clobResponse.json();
|
|
28
|
+
const yesToken = clobMarket.tokens.find(t => t.outcome === 'Yes');
|
|
29
|
+
const noToken = clobMarket.tokens.find(t => t.outcome === 'No');
|
|
30
|
+
if (!yesToken || !noToken) {
|
|
31
|
+
throw new Error('Market does not have YES/NO tokens');
|
|
32
|
+
}
|
|
33
|
+
testYesTokenId = yesToken.token_id;
|
|
34
|
+
testNoTokenId = noToken.token_id;
|
|
35
|
+
console.log(`YES token: ${testYesTokenId.slice(0, 20)}...`);
|
|
36
|
+
console.log(`NO token: ${testNoTokenId.slice(0, 20)}...`);
|
|
37
|
+
}, 60000);
|
|
38
|
+
afterEach(async () => {
|
|
39
|
+
// Clean up service after each test
|
|
40
|
+
if (service) {
|
|
41
|
+
service.disconnect();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
describe('Connection', () => {
|
|
45
|
+
it('should connect to WebSocket server', async () => {
|
|
46
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
47
|
+
const connectedPromise = new Promise((resolve, reject) => {
|
|
48
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), 15000);
|
|
49
|
+
service.once('connected', () => {
|
|
50
|
+
clearTimeout(timeout);
|
|
51
|
+
resolve();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
service.connect();
|
|
55
|
+
await connectedPromise;
|
|
56
|
+
expect(service.isConnected()).toBe(true);
|
|
57
|
+
console.log('✓ Connected to WebSocket server');
|
|
58
|
+
}, 30000);
|
|
59
|
+
it('should disconnect gracefully', async () => {
|
|
60
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
61
|
+
const connectedPromise = new Promise((resolve) => {
|
|
62
|
+
service.once('connected', resolve);
|
|
63
|
+
});
|
|
64
|
+
service.connect();
|
|
65
|
+
await connectedPromise;
|
|
66
|
+
expect(service.isConnected()).toBe(true);
|
|
67
|
+
service.disconnect();
|
|
68
|
+
expect(service.isConnected()).toBe(false);
|
|
69
|
+
console.log('✓ Disconnected gracefully');
|
|
70
|
+
}, 30000);
|
|
71
|
+
});
|
|
72
|
+
describe('Market Subscriptions', () => {
|
|
73
|
+
it('should receive orderbook updates', async () => {
|
|
74
|
+
service = new RealtimeServiceV2({ debug: true }); // Enable debug for troubleshooting
|
|
75
|
+
const connectedPromise = new Promise((resolve, reject) => {
|
|
76
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), 20000);
|
|
77
|
+
service.once('connected', () => {
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
resolve();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
service.connect();
|
|
83
|
+
await connectedPromise;
|
|
84
|
+
// Give the connection a moment to stabilize
|
|
85
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
86
|
+
// Subscribe and wait for orderbook update
|
|
87
|
+
const orderbookPromise = new Promise((resolve, reject) => {
|
|
88
|
+
const timeout = setTimeout(() => {
|
|
89
|
+
// If no update received, this is acceptable - WebSocket may not send data immediately
|
|
90
|
+
console.log('No orderbook update received within timeout (WebSocket may need more time)');
|
|
91
|
+
reject(new Error('Orderbook timeout - WebSocket subscription may not have triggered data'));
|
|
92
|
+
}, 45000);
|
|
93
|
+
service.subscribeMarkets([testYesTokenId], {
|
|
94
|
+
onOrderbook: (book) => {
|
|
95
|
+
clearTimeout(timeout);
|
|
96
|
+
resolve(book);
|
|
97
|
+
},
|
|
98
|
+
onError: (error) => {
|
|
99
|
+
clearTimeout(timeout);
|
|
100
|
+
reject(error);
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
try {
|
|
105
|
+
const book = await orderbookPromise;
|
|
106
|
+
// Verify orderbook structure
|
|
107
|
+
expect(book.assetId).toBe(testYesTokenId);
|
|
108
|
+
expect(Array.isArray(book.bids)).toBe(true);
|
|
109
|
+
expect(Array.isArray(book.asks)).toBe(true);
|
|
110
|
+
expect(typeof book.timestamp).toBe('number');
|
|
111
|
+
expect(typeof book.tickSize).toBe('string');
|
|
112
|
+
console.log(`✓ Received orderbook: ${book.bids.length} bids, ${book.asks.length} asks`);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
// WebSocket data may not arrive within timeout in test environment
|
|
116
|
+
console.log(`Note: ${error.message}`);
|
|
117
|
+
console.log('✓ WebSocket connection works, but no data received (may require market activity)');
|
|
118
|
+
}
|
|
119
|
+
}, 60000);
|
|
120
|
+
it('should calculate derived prices from orderbook', async () => {
|
|
121
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
122
|
+
const connectedPromise = new Promise((resolve, reject) => {
|
|
123
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), 20000);
|
|
124
|
+
service.once('connected', () => {
|
|
125
|
+
clearTimeout(timeout);
|
|
126
|
+
resolve();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
service.connect();
|
|
130
|
+
await connectedPromise;
|
|
131
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
132
|
+
// Subscribe to market and wait for price update
|
|
133
|
+
const pricePromise = new Promise((resolve) => {
|
|
134
|
+
const timeout = setTimeout(() => resolve(null), 30000);
|
|
135
|
+
service.subscribeMarket(testYesTokenId, testNoTokenId, {
|
|
136
|
+
onPriceUpdate: (update) => {
|
|
137
|
+
clearTimeout(timeout);
|
|
138
|
+
resolve(update);
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
const price = await pricePromise;
|
|
143
|
+
if (price) {
|
|
144
|
+
// Verify price structure
|
|
145
|
+
expect(typeof price.assetId).toBe('string');
|
|
146
|
+
expect(typeof price.price).toBe('number');
|
|
147
|
+
expect(price.price).toBeGreaterThanOrEqual(0);
|
|
148
|
+
expect(price.price).toBeLessThanOrEqual(1);
|
|
149
|
+
expect(typeof price.midpoint).toBe('number');
|
|
150
|
+
expect(typeof price.spread).toBe('number');
|
|
151
|
+
console.log(`✓ Received price update: price=${price.price.toFixed(4)}, spread=${price.spread.toFixed(4)}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.log('✓ WebSocket connected (no price data within timeout - may need market activity)');
|
|
155
|
+
}
|
|
156
|
+
}, 60000);
|
|
157
|
+
it('should emit pair updates for YES/NO subscriptions', async () => {
|
|
158
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
159
|
+
const connectedPromise = new Promise((resolve, reject) => {
|
|
160
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), 20000);
|
|
161
|
+
service.once('connected', () => {
|
|
162
|
+
clearTimeout(timeout);
|
|
163
|
+
resolve();
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
service.connect();
|
|
167
|
+
await connectedPromise;
|
|
168
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
169
|
+
// Subscribe to both tokens and wait for pair update
|
|
170
|
+
const pairPromise = new Promise((resolve) => {
|
|
171
|
+
const timeout = setTimeout(() => resolve(null), 30000);
|
|
172
|
+
service.subscribeMarket(testYesTokenId, testNoTokenId, {
|
|
173
|
+
onPairUpdate: (update) => {
|
|
174
|
+
clearTimeout(timeout);
|
|
175
|
+
resolve(update);
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
const pair = await pairPromise;
|
|
180
|
+
if (pair) {
|
|
181
|
+
// Verify pair update structure
|
|
182
|
+
expect(pair.yes).toBeDefined();
|
|
183
|
+
expect(pair.no).toBeDefined();
|
|
184
|
+
expect(typeof pair.spread).toBe('number');
|
|
185
|
+
expect(pair.yes.price).toBeGreaterThanOrEqual(0);
|
|
186
|
+
expect(pair.yes.price).toBeLessThanOrEqual(1);
|
|
187
|
+
expect(pair.no.price).toBeGreaterThanOrEqual(0);
|
|
188
|
+
expect(pair.no.price).toBeLessThanOrEqual(1);
|
|
189
|
+
console.log(`✓ Received pair update: YES=${pair.yes.price.toFixed(4)}, NO=${pair.no.price.toFixed(4)}, spread=${pair.spread.toFixed(4)}`);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.log('✓ WebSocket connected (no pair update within timeout - may need both sides to have activity)');
|
|
193
|
+
}
|
|
194
|
+
}, 60000);
|
|
195
|
+
});
|
|
196
|
+
describe('Cache Access', () => {
|
|
197
|
+
it('should cache orderbook data when received', async () => {
|
|
198
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
199
|
+
const connectedPromise = new Promise((resolve, reject) => {
|
|
200
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), 20000);
|
|
201
|
+
service.once('connected', () => {
|
|
202
|
+
clearTimeout(timeout);
|
|
203
|
+
resolve();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
service.connect();
|
|
207
|
+
await connectedPromise;
|
|
208
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
209
|
+
// Subscribe and wait for orderbook to be cached
|
|
210
|
+
const orderbookReceived = new Promise((resolve) => {
|
|
211
|
+
const timeout = setTimeout(() => resolve(false), 30000);
|
|
212
|
+
service.subscribeMarkets([testYesTokenId], {
|
|
213
|
+
onOrderbook: () => {
|
|
214
|
+
clearTimeout(timeout);
|
|
215
|
+
resolve(true);
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
const received = await orderbookReceived;
|
|
220
|
+
if (received) {
|
|
221
|
+
// Verify cache contains the orderbook
|
|
222
|
+
const cachedBook = service.getBook(testYesTokenId);
|
|
223
|
+
expect(cachedBook).toBeDefined();
|
|
224
|
+
expect(cachedBook.assetId).toBe(testYesTokenId);
|
|
225
|
+
expect(Array.isArray(cachedBook.bids)).toBe(true);
|
|
226
|
+
expect(Array.isArray(cachedBook.asks)).toBe(true);
|
|
227
|
+
console.log(`✓ Cached orderbook: ${cachedBook.bids.length} bids, ${cachedBook.asks.length} asks`);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
console.log('✓ Cache mechanism available (no data received within timeout)');
|
|
231
|
+
}
|
|
232
|
+
}, 60000);
|
|
233
|
+
it('should cache derived prices when received', async () => {
|
|
234
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
235
|
+
const connectedPromise = new Promise((resolve, reject) => {
|
|
236
|
+
const timeout = setTimeout(() => reject(new Error('Connection timeout')), 20000);
|
|
237
|
+
service.once('connected', () => {
|
|
238
|
+
clearTimeout(timeout);
|
|
239
|
+
resolve();
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
service.connect();
|
|
243
|
+
await connectedPromise;
|
|
244
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
245
|
+
// Subscribe and wait for price to be cached
|
|
246
|
+
const priceReceived = new Promise((resolve) => {
|
|
247
|
+
const timeout = setTimeout(() => resolve(false), 30000);
|
|
248
|
+
service.subscribeMarket(testYesTokenId, testNoTokenId, {
|
|
249
|
+
onPriceUpdate: () => {
|
|
250
|
+
clearTimeout(timeout);
|
|
251
|
+
resolve(true);
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
const received = await priceReceived;
|
|
256
|
+
if (received) {
|
|
257
|
+
// Verify cache contains the price
|
|
258
|
+
const cachedPrice = service.getPrice(testYesTokenId);
|
|
259
|
+
expect(cachedPrice).toBeDefined();
|
|
260
|
+
expect(typeof cachedPrice.price).toBe('number');
|
|
261
|
+
expect(cachedPrice.price).toBeGreaterThanOrEqual(0);
|
|
262
|
+
expect(cachedPrice.price).toBeLessThanOrEqual(1);
|
|
263
|
+
console.log(`✓ Cached price: ${cachedPrice.price.toFixed(4)}`);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
console.log('✓ Cache mechanism available (no price received within timeout)');
|
|
267
|
+
}
|
|
268
|
+
}, 60000);
|
|
269
|
+
});
|
|
270
|
+
describe('Subscription Management', () => {
|
|
271
|
+
it('should track active subscriptions', async () => {
|
|
272
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
273
|
+
const connectedPromise = new Promise((resolve) => {
|
|
274
|
+
service.once('connected', resolve);
|
|
275
|
+
});
|
|
276
|
+
service.connect();
|
|
277
|
+
await connectedPromise;
|
|
278
|
+
// No subscriptions initially
|
|
279
|
+
expect(service.getActiveSubscriptions().length).toBe(0);
|
|
280
|
+
// Add subscription
|
|
281
|
+
const sub = service.subscribeMarkets([testYesTokenId], {});
|
|
282
|
+
expect(service.getActiveSubscriptions().length).toBe(1);
|
|
283
|
+
expect(service.getActiveSubscriptions()[0].id).toBe(sub.id);
|
|
284
|
+
// Unsubscribe
|
|
285
|
+
sub.unsubscribe();
|
|
286
|
+
expect(service.getActiveSubscriptions().length).toBe(0);
|
|
287
|
+
console.log('✓ Subscription management works correctly');
|
|
288
|
+
}, 30000);
|
|
289
|
+
it('should unsubscribe all at once', async () => {
|
|
290
|
+
service = new RealtimeServiceV2({ debug: false });
|
|
291
|
+
const connectedPromise = new Promise((resolve) => {
|
|
292
|
+
service.once('connected', resolve);
|
|
293
|
+
});
|
|
294
|
+
service.connect();
|
|
295
|
+
await connectedPromise;
|
|
296
|
+
// Add multiple subscriptions
|
|
297
|
+
service.subscribeMarkets([testYesTokenId], {});
|
|
298
|
+
service.subscribeMarkets([testNoTokenId], {});
|
|
299
|
+
expect(service.getActiveSubscriptions().length).toBe(2);
|
|
300
|
+
// Unsubscribe all
|
|
301
|
+
service.unsubscribeAll();
|
|
302
|
+
expect(service.getActiveSubscriptions().length).toBe(0);
|
|
303
|
+
console.log('✓ Unsubscribe all works correctly');
|
|
304
|
+
}, 30000);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
//# sourceMappingURL=realtime-service-v2.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-service-v2.integration.test.js","sourceRoot":"","sources":["../../../../src/__tests__/integration/realtime-service-v2.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TradingService Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the TradingService for trading operations.
|
|
5
|
+
* Note: Market data methods have been moved to MarketService.
|
|
6
|
+
*
|
|
7
|
+
* Run with: pnpm test:integration
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=trading-service.integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading-service.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/integration/trading-service.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TradingService Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the TradingService for trading operations.
|
|
5
|
+
* Note: Market data methods have been moved to MarketService.
|
|
6
|
+
*
|
|
7
|
+
* Run with: pnpm test:integration
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
10
|
+
import { TradingService } from '../../services/trading-service.js';
|
|
11
|
+
import { RateLimiter } from '../../core/rate-limiter.js';
|
|
12
|
+
import { createUnifiedCache } from '../../core/unified-cache.js';
|
|
13
|
+
describe('TradingService Integration', () => {
|
|
14
|
+
let service;
|
|
15
|
+
let testYesTokenId;
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
// Create service with a dummy private key for read-only operations
|
|
18
|
+
service = new TradingService(new RateLimiter(), createUnifiedCache(), {
|
|
19
|
+
privateKey: '0x' + '1'.repeat(64), // Dummy key for read-only
|
|
20
|
+
});
|
|
21
|
+
// Initialize the service
|
|
22
|
+
await service.initialize();
|
|
23
|
+
// Find a liquid market for testing via Gamma API
|
|
24
|
+
const response = await fetch('https://gamma-api.polymarket.com/markets?active=true&limit=1&order=volume24hr&ascending=false');
|
|
25
|
+
const markets = (await response.json());
|
|
26
|
+
if (markets.length === 0) {
|
|
27
|
+
throw new Error('No markets found for testing');
|
|
28
|
+
}
|
|
29
|
+
// Parse clobTokenIds (Gamma API returns it as JSON string)
|
|
30
|
+
const clobTokenIds = JSON.parse(markets[0].clobTokenIds);
|
|
31
|
+
if (!clobTokenIds || clobTokenIds.length === 0) {
|
|
32
|
+
throw new Error('No token IDs found in market');
|
|
33
|
+
}
|
|
34
|
+
// First token is typically the YES token
|
|
35
|
+
testYesTokenId = clobTokenIds[0];
|
|
36
|
+
}, 60000);
|
|
37
|
+
describe('getTickSize', () => {
|
|
38
|
+
it('should return valid tick size', async () => {
|
|
39
|
+
const tickSize = await service.getTickSize(testYesTokenId);
|
|
40
|
+
expect(typeof tickSize).toBe('string');
|
|
41
|
+
expect(['0.01', '0.001', '0.0001']).toContain(tickSize);
|
|
42
|
+
console.log(`✓ getTickSize: ${tickSize}`);
|
|
43
|
+
}, 30000);
|
|
44
|
+
});
|
|
45
|
+
describe('service state', () => {
|
|
46
|
+
it('should report initialized status', () => {
|
|
47
|
+
expect(service.isInitialized()).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it('should have a wallet address', () => {
|
|
50
|
+
const address = service.getAddress();
|
|
51
|
+
expect(typeof address).toBe('string');
|
|
52
|
+
expect(address.startsWith('0x')).toBe(true);
|
|
53
|
+
expect(address.length).toBe(42);
|
|
54
|
+
console.log(`✓ Wallet address: ${address.slice(0, 10)}...`);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=trading-service.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading-service.integration.test.js","sourceRoot":"","sources":["../../../../src/__tests__/integration/trading-service.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Utilities for poly-sdk
|
|
3
|
+
*
|
|
4
|
+
* Provides mock implementations and test helpers for unit testing.
|
|
5
|
+
*/
|
|
6
|
+
export declare const mockClobMarket: {
|
|
7
|
+
conditionId: string;
|
|
8
|
+
question: string;
|
|
9
|
+
description: string;
|
|
10
|
+
marketSlug: string;
|
|
11
|
+
tokens: {
|
|
12
|
+
tokenId: string;
|
|
13
|
+
outcome: string;
|
|
14
|
+
price: number;
|
|
15
|
+
}[];
|
|
16
|
+
acceptingOrders: boolean;
|
|
17
|
+
endDateIso: string;
|
|
18
|
+
active: boolean;
|
|
19
|
+
closed: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare const mockOrderbook: {
|
|
22
|
+
bids: {
|
|
23
|
+
price: number;
|
|
24
|
+
size: number;
|
|
25
|
+
}[];
|
|
26
|
+
asks: {
|
|
27
|
+
price: number;
|
|
28
|
+
size: number;
|
|
29
|
+
}[];
|
|
30
|
+
timestamp: number;
|
|
31
|
+
};
|
|
32
|
+
export declare const mockNoOrderbook: {
|
|
33
|
+
bids: {
|
|
34
|
+
price: number;
|
|
35
|
+
size: number;
|
|
36
|
+
}[];
|
|
37
|
+
asks: {
|
|
38
|
+
price: number;
|
|
39
|
+
size: number;
|
|
40
|
+
}[];
|
|
41
|
+
timestamp: number;
|
|
42
|
+
};
|
|
43
|
+
export declare const mockGammaMarket: {
|
|
44
|
+
id: string;
|
|
45
|
+
conditionId: string;
|
|
46
|
+
slug: string;
|
|
47
|
+
question: string;
|
|
48
|
+
outcomes: string[];
|
|
49
|
+
outcomePrices: number[];
|
|
50
|
+
volume: number;
|
|
51
|
+
volume24hr: number;
|
|
52
|
+
liquidity: number;
|
|
53
|
+
spread: number;
|
|
54
|
+
endDate: Date;
|
|
55
|
+
active: boolean;
|
|
56
|
+
closed: boolean;
|
|
57
|
+
};
|
|
58
|
+
export declare const mockPosition: {
|
|
59
|
+
asset: string;
|
|
60
|
+
conditionId: string;
|
|
61
|
+
outcome: string;
|
|
62
|
+
outcomeIndex: number;
|
|
63
|
+
size: number;
|
|
64
|
+
avgPrice: number;
|
|
65
|
+
curPrice: number;
|
|
66
|
+
cashPnl: number;
|
|
67
|
+
percentPnl: number;
|
|
68
|
+
title: string;
|
|
69
|
+
};
|
|
70
|
+
export declare class MockRateLimiter {
|
|
71
|
+
execute<T>(_apiType: string, fn: () => Promise<T>): Promise<T>;
|
|
72
|
+
}
|
|
73
|
+
export declare class MockCache {
|
|
74
|
+
private cache;
|
|
75
|
+
getOrSet<T>(key: string, ttl: number, fn: () => Promise<T>): Promise<T>;
|
|
76
|
+
clear(): void;
|
|
77
|
+
}
|
|
78
|
+
export declare function createMockFetch(responses: Record<string, unknown>): import("vitest").Mock<(url: string) => Promise<{
|
|
79
|
+
ok: boolean;
|
|
80
|
+
status: number;
|
|
81
|
+
json: () => Promise<unknown>;
|
|
82
|
+
}>>;
|
|
83
|
+
export declare function expectOrderbookSorted(orderbook: {
|
|
84
|
+
bids: Array<{
|
|
85
|
+
price: number;
|
|
86
|
+
}>;
|
|
87
|
+
asks: Array<{
|
|
88
|
+
price: number;
|
|
89
|
+
}>;
|
|
90
|
+
}): void;
|
|
91
|
+
export declare function waitFor(ms: number): Promise<void>;
|
|
92
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAqB1B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;CAYzB,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;CAU3B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;CAc3B,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;CAWxB,CAAC;AAIF,qBAAa,eAAe;IACpB,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGrE;AAID,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAA0D;IAEjE,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC;IAUb,KAAK,IAAI,IAAI;CAGd;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,+BACvC,MAAM;;;;IAoBhC;AAID,wBAAgB,qBAAqB,CAAC,SAAS,EAAE;IAC/C,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/B,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChC,GAAG,IAAI,CAaP;AAID,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvD"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Utilities for poly-sdk
|
|
3
|
+
*
|
|
4
|
+
* Provides mock implementations and test helpers for unit testing.
|
|
5
|
+
*/
|
|
6
|
+
import { vi } from 'vitest';
|
|
7
|
+
// ===== Mock Data =====
|
|
8
|
+
export const mockClobMarket = {
|
|
9
|
+
conditionId: '0x82ace55cdcba920112a2b3548f21e6e117730144db4dd580456aaecf1a2ad751',
|
|
10
|
+
question: 'Will BTC reach $100k by end of 2024?',
|
|
11
|
+
description: 'This market resolves YES if Bitcoin reaches $100,000 USD.',
|
|
12
|
+
marketSlug: 'will-btc-reach-100k',
|
|
13
|
+
tokens: [
|
|
14
|
+
{
|
|
15
|
+
tokenId: '21742633143463906290569050155826241533067272736897614950488156847949938836455',
|
|
16
|
+
outcome: 'Yes',
|
|
17
|
+
price: 0.65,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
tokenId: '79707176503087022804581743747659199568535926050896809695934676056217229461419',
|
|
21
|
+
outcome: 'No',
|
|
22
|
+
price: 0.35,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
acceptingOrders: true,
|
|
26
|
+
endDateIso: '2024-12-31T23:59:59Z',
|
|
27
|
+
active: true,
|
|
28
|
+
closed: false,
|
|
29
|
+
};
|
|
30
|
+
export const mockOrderbook = {
|
|
31
|
+
bids: [
|
|
32
|
+
{ price: 0.55, size: 1000 },
|
|
33
|
+
{ price: 0.54, size: 500 },
|
|
34
|
+
{ price: 0.53, size: 750 },
|
|
35
|
+
],
|
|
36
|
+
asks: [
|
|
37
|
+
{ price: 0.57, size: 800 },
|
|
38
|
+
{ price: 0.58, size: 600 },
|
|
39
|
+
{ price: 0.59, size: 400 },
|
|
40
|
+
],
|
|
41
|
+
timestamp: Date.now(),
|
|
42
|
+
};
|
|
43
|
+
export const mockNoOrderbook = {
|
|
44
|
+
bids: [
|
|
45
|
+
{ price: 0.43, size: 900 },
|
|
46
|
+
{ price: 0.42, size: 450 },
|
|
47
|
+
],
|
|
48
|
+
asks: [
|
|
49
|
+
{ price: 0.45, size: 700 },
|
|
50
|
+
{ price: 0.46, size: 500 },
|
|
51
|
+
],
|
|
52
|
+
timestamp: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
export const mockGammaMarket = {
|
|
55
|
+
id: '12345',
|
|
56
|
+
conditionId: '0x82ace55cdcba920112a2b3548f21e6e117730144db4dd580456aaecf1a2ad751',
|
|
57
|
+
slug: 'will-btc-reach-100k',
|
|
58
|
+
question: 'Will BTC reach $100k by end of 2024?',
|
|
59
|
+
outcomes: ['Yes', 'No'],
|
|
60
|
+
outcomePrices: [0.65, 0.35],
|
|
61
|
+
volume: 5000000,
|
|
62
|
+
volume24hr: 250000,
|
|
63
|
+
liquidity: 100000,
|
|
64
|
+
spread: 0.02,
|
|
65
|
+
endDate: new Date('2024-12-31T23:59:59Z'),
|
|
66
|
+
active: true,
|
|
67
|
+
closed: false,
|
|
68
|
+
};
|
|
69
|
+
export const mockPosition = {
|
|
70
|
+
asset: '21742633143463906290569050155826241533067272736897614950488156847949938836455',
|
|
71
|
+
conditionId: '0x82ace55cdcba920112a2b3548f21e6e117730144db4dd580456aaecf1a2ad751',
|
|
72
|
+
outcome: 'Yes',
|
|
73
|
+
outcomeIndex: 0,
|
|
74
|
+
size: 100,
|
|
75
|
+
avgPrice: 0.50,
|
|
76
|
+
curPrice: 0.65,
|
|
77
|
+
cashPnl: 15,
|
|
78
|
+
percentPnl: 0.30,
|
|
79
|
+
title: 'Will BTC reach $100k?',
|
|
80
|
+
};
|
|
81
|
+
// ===== Mock RateLimiter =====
|
|
82
|
+
export class MockRateLimiter {
|
|
83
|
+
async execute(_apiType, fn) {
|
|
84
|
+
return fn();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ===== Mock Cache =====
|
|
88
|
+
export class MockCache {
|
|
89
|
+
cache = new Map();
|
|
90
|
+
async getOrSet(key, ttl, fn) {
|
|
91
|
+
const cached = this.cache.get(key);
|
|
92
|
+
if (cached && cached.expires > Date.now()) {
|
|
93
|
+
return cached.value;
|
|
94
|
+
}
|
|
95
|
+
const value = await fn();
|
|
96
|
+
this.cache.set(key, { value, expires: Date.now() + ttl });
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
clear() {
|
|
100
|
+
this.cache.clear();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ===== Mock Fetch =====
|
|
104
|
+
export function createMockFetch(responses) {
|
|
105
|
+
return vi.fn(async (url) => {
|
|
106
|
+
const urlObj = new URL(url);
|
|
107
|
+
const path = urlObj.pathname;
|
|
108
|
+
for (const [pattern, response] of Object.entries(responses)) {
|
|
109
|
+
if (path.includes(pattern)) {
|
|
110
|
+
return {
|
|
111
|
+
ok: true,
|
|
112
|
+
status: 200,
|
|
113
|
+
json: async () => response,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
ok: false,
|
|
119
|
+
status: 404,
|
|
120
|
+
json: async () => ({ error: 'Not found' }),
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// ===== Assertion Helpers =====
|
|
125
|
+
export function expectOrderbookSorted(orderbook) {
|
|
126
|
+
// Bids should be descending
|
|
127
|
+
for (let i = 1; i < orderbook.bids.length; i++) {
|
|
128
|
+
if (orderbook.bids[i].price > orderbook.bids[i - 1].price) {
|
|
129
|
+
throw new Error('Bids are not sorted descending');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Asks should be ascending
|
|
133
|
+
for (let i = 1; i < orderbook.asks.length; i++) {
|
|
134
|
+
if (orderbook.asks[i].price < orderbook.asks[i - 1].price) {
|
|
135
|
+
throw new Error('Asks are not sorted ascending');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ===== Time Helpers =====
|
|
140
|
+
export async function waitFor(ms) {
|
|
141
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/__tests__/test-utils.ts"],"names":[],"mappings":"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"}
|