@@ -165,6 +165,71 @@ public async Task GenericConflictResolver_BothNull_ShouldReturnDefault()
165165
166166 #region Integration with OperationsQueueManager Tests
167167
168+ [ Fact ]
169+ public async Task PushAsync_WithDefaultClientWinsResolver_ShouldResolveConflictAndRetry ( )
170+ {
171+ // Arrange
172+ var context = CreateContext ( ) ;
173+
174+ // Configure context to use client wins resolver
175+ context . Configurator = builder =>
176+ {
177+ builder . UseDefaultConflictResolver ( new ClientWinsConflictResolver ( ) ) ;
178+ builder . Entity < ClientMovie > ( c =>
179+ {
180+ c . ClientName = "movies" ;
181+ c . Endpoint = new Uri ( "/tables/movies" , UriKind . Relative ) ;
182+ } ) ;
183+ } ;
184+
185+ // Create a client movie and save it to generate operation
186+ var clientMovie = new ClientMovie ( TestData . Movies . BlackPanther )
187+ {
188+ Id = Guid . NewGuid ( ) . ToString ( "N" ) ,
189+ Title = "Client Title"
190+ } ;
191+ context . Movies . Add ( clientMovie ) ;
192+ context . SaveChanges ( ) ;
193+
194+ // Setup response for conflict followed by success
195+ var serverMovie = new ClientMovie ( TestData . Movies . BlackPanther )
196+ {
197+ Id = clientMovie . Id ,
198+ Title = "Server Title" ,
199+ UpdatedAt = DateTimeOffset . UtcNow ,
200+ Version = Guid . NewGuid ( ) . ToString ( )
201+ } ;
202+ string serverJson = DatasyncSerializer . Serialize ( serverMovie ) ;
203+
204+ // First response is a conflict
205+ context . Handler . AddResponseContent ( serverJson , HttpStatusCode . Conflict ) ;
206+
207+ // Second response (after resolution) is success
208+ var finalMovie = new ClientMovie ( TestData . Movies . BlackPanther )
209+ {
210+ Id = clientMovie . Id ,
211+ Title = "Client Title" , // This should match the client version after resolution
212+ UpdatedAt = DateTimeOffset . UtcNow . AddSeconds ( 1 ) ,
213+ Version = Guid . NewGuid ( ) . ToString ( )
214+ } ;
215+ string finalJson = DatasyncSerializer . Serialize ( finalMovie ) ;
216+ context . Handler . AddResponseContent ( finalJson , HttpStatusCode . OK ) ;
217+
218+ // Act
219+ var result = await context . QueueManager . PushAsync ( [ typeof ( ClientMovie ) ] , new PushOptions ( ) ) ;
220+
221+ // Assert
222+ result . IsSuccessful . Should ( ) . BeTrue ( ) ;
223+ result . CompletedOperations . Should ( ) . Be ( 1 ) ;
224+ result . FailedRequests . Should ( ) . BeEmpty ( ) ;
225+
226+ // Verify the database has the right value
227+ var savedMovie = context . Movies . Find ( clientMovie . Id ) ;
228+ savedMovie . Should ( ) . NotBeNull ( ) ;
229+ savedMovie ! . Title . Should ( ) . Be ( "Client Title" ) ;
230+ savedMovie . Version . Should ( ) . Be ( finalMovie . Version ) ;
231+ }
232+
168233 [ Fact ]
169234 public async Task PushAsync_WithClientWinsResolver_ShouldResolveConflictAndRetry ( )
170235 {
0 commit comments