Skip to content

Commit 85270f0

Browse files
committed
Add recommended tests and suggested enhancements for MarketDepthManager
1 parent 35f9003 commit 85270f0

1 file changed

Lines changed: 118 additions & 0 deletions

File tree

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# `MarketDepthManager` Improvements
2+
3+
## 📋 Recommended Additional Tests
4+
5+
### Integration-Style Tests (High Priority)
6+
7+
```csharp
8+
public class MarketDepthManagerIntegrationTests
9+
{
10+
[Test]
11+
public async Task BuildAsync_WithRealTimeSimulation_SynchronizesCorrectly()
12+
{
13+
// Test that simulates realistic WebSocket + REST timing
14+
// Validates the 7-step algorithm with controlled event sequences
15+
}
16+
17+
[Test]
18+
public async Task BuildAsync_WithSlowSnapshot_HandlesBufferedEvents()
19+
{
20+
// Simulates slow snapshot retrieval while events keep arriving
21+
// Ensures buffer doesn't overflow and events are properly queued
22+
}
23+
24+
[Test]
25+
public async Task BuildAsync_WithOutdatedSnapshot_RetriesUntilValid()
26+
{
27+
// Tests snapshot validation and retry logic (Step 4)
28+
// Ensures system gets a fresh enough snapshot
29+
}
30+
31+
[Theory]
32+
[InlineData(ContractType.Spot)]
33+
[InlineData(ContractType.Futures)]
34+
public async Task ProcessDepthUpdate_WithSequentialEvents_MaintainsOrderBook(ContractType contractType)
35+
{
36+
// Validates that sequential updates are processed correctly
37+
// Tests both Spot and Futures contract types
38+
}
39+
}
40+
```
41+
42+
### Edge Case Tests (Medium Priority)
43+
44+
```csharp
45+
[Test]
46+
public async Task BuildAsync_WithNoBufferedEvents_StillAppliesSnapshot()
47+
{
48+
// Edge case: snapshot arrives before any WebSocket events
49+
}
50+
51+
[Test]
52+
public async Task ProcessDepthUpdate_WithDuplicateUpdateId_IgnoresCorrectly()
53+
{
54+
// Validates idempotency - duplicate events should be ignored
55+
}
56+
57+
[Test]
58+
public async Task BuildAsync_CancellationToken_CancelsGracefully()
59+
{
60+
// Tests cancellation during various stages of BuildAsync
61+
}
62+
63+
[Test]
64+
public async Task StopStreamingAsync_WithActiveSubscription_UnsubscribesCleanly()
65+
{
66+
// Validates proper cleanup of WebSocket subscriptions
67+
}
68+
```
69+
70+
---
71+
72+
## 🔄 Suggested Future Enhancements
73+
74+
### 1. Configuration Object Pattern
75+
Instead of multiple parameters, consider a configuration object:
76+
77+
```csharp
78+
public class MarketDepthConfiguration
79+
{
80+
public short OrderBookDepth { get; init; } = 10;
81+
public TimeSpan UpdateInterval { get; init; } = TimeSpan.FromMilliseconds(100);
82+
public TimeSpan BufferTimeMultiplier { get; init; } = TimeSpan.FromMilliseconds(5);
83+
public int MinimumBufferTimeMs { get; init; } = 500;
84+
}
85+
86+
public async Task BuildAsync(
87+
MarketDepth marketDepth,
88+
MarketDepthConfiguration config = null,
89+
CancellationToken ct = default)
90+
```
91+
92+
### 2. Resilience Improvements
93+
```csharp
94+
// Add automatic reconnection on WebSocket disconnect
95+
// Add configurable retry policy for snapshot retrieval
96+
// Add circuit breaker pattern for repeated failures
97+
```
98+
99+
### 3. Observability Enhancements
100+
```csharp
101+
public class MarketDepthMetrics
102+
{
103+
public long TotalUpdatesProcessed { get; set; }
104+
public long UpdatesIgnored { get; set; }
105+
public long SnapshotRetries { get; set; }
106+
public TimeSpan AverageUpdateLatency { get; set; }
107+
}
108+
109+
public MarketDepthMetrics GetMetrics() => _metrics;
110+
```
111+
112+
### 4. Event-Driven Architecture
113+
```csharp
114+
public event EventHandler<SnapshotAppliedEventArgs> SnapshotApplied;
115+
public event EventHandler<SynchronizationErrorEventArgs> SynchronizationError;
116+
public event EventHandler<MetricsUpdatedEventArgs> MetricsUpdated;
117+
```
118+

0 commit comments

Comments
 (0)