@@ -57,13 +57,15 @@ public async Task SetInHash_ShouldStoreValueInHash()
5757 var key = Guid . NewGuid ( ) . ToString ( ) ;
5858 var field = "test-field" ;
5959 var payload = "test-payload" ;
60+ var values = new Dictionary < string , string > { { field , payload } } ;
6061
6162 // Act
62- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
63+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
6364
6465 // Assert - We'll verify by trying to get and delete it
65- var retrievedValue = await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
66- retrievedValue . Should ( ) . Be ( payload ) ;
66+ var retrievedValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
67+ retrievedValues . Should ( ) . NotBeNull ( ) ;
68+ retrievedValues ! [ field ] . Should ( ) . Be ( payload ) ;
6769 }
6870
6971 [ Test ]
@@ -74,14 +76,16 @@ public async Task TryGetAndDeleteFromHash_WithExistingValue_ShouldReturnValueAnd
7476 var key = Guid . NewGuid ( ) . ToString ( ) ;
7577 var field = "test-field" ;
7678 var payload = "test-payload" ;
79+ var values = new Dictionary < string , string > { { field , payload } } ;
7780
78- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
81+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
7982
8083 // Act
81- var retrievedValue = await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
84+ var retrievedValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
8285
8386 // Assert
84- retrievedValue . Should ( ) . Be ( payload ) ;
87+ retrievedValues . Should ( ) . NotBeNull ( ) ;
88+ retrievedValues ! [ field ] . Should ( ) . Be ( payload ) ;
8589 }
8690
8791 [ Test ]
@@ -92,8 +96,9 @@ public async Task HashContainsKey_WithExistingField_ShouldReturnTrue()
9296 var key = Guid . NewGuid ( ) . ToString ( ) ;
9397 var field = "test-field" ;
9498 var payload = "test-payload" ;
99+ var values = new Dictionary < string , string > { { field , payload } } ;
95100
96- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
101+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
97102
98103 // Act
99104 var exists = await redisFacade . HashContainsKey ( key , field , CancellationToken ) ;
@@ -140,25 +145,27 @@ public async Task TryGetAndDeleteFromHash_ShouldDeleteTheEntireKey()
140145 var key = Guid . NewGuid ( ) . ToString ( ) ;
141146 var field = "test-field" ;
142147 var payload = "test-payload" ;
148+ var values = new Dictionary < string , string > { { field , payload } } ;
143149
144- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
150+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
145151
146152 // Verify the hash field exists
147153 var existsBefore = await redisFacade . HashContainsKey ( key , field , CancellationToken ) ;
148154 existsBefore . Should ( ) . BeTrue ( ) ;
149155
150156 // Act
151- var retrievedValue = await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
157+ var retrievedValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
152158
153159 // Assert
154- retrievedValue . Should ( ) . Be ( payload ) ;
160+ retrievedValues . Should ( ) . NotBeNull ( ) ;
161+ retrievedValues ! [ field ] . Should ( ) . Be ( payload ) ;
155162
156163 // Verify the entire key was deleted (not just the field)
157164 var existsAfter = await redisFacade . HashContainsKey ( key , field , CancellationToken ) ;
158165 existsAfter . Should ( ) . BeFalse ( ) ;
159166
160167 // Verify trying to get it again returns null
161- var secondRetrieval = await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
168+ var secondRetrieval = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
162169 secondRetrieval . Should ( ) . BeNull ( ) ;
163170 }
164171
@@ -333,20 +340,22 @@ public async Task SetInHash_WithTTL_ShouldExpireAfterSpecifiedTime()
333340 var key = Guid . NewGuid ( ) . ToString ( ) ;
334341 var field = "test-field" ;
335342 var payload = "test-payload" ;
343+ var values = new Dictionary < string , string > { { field , payload } } ;
336344
337345 // Act - Set a value in hash with short TTL that we can actually test
338- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMinutes ( 3 ) , CancellationToken ) ;
346+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 3 ) , CancellationToken ) ;
339347
340348 // Immediately verify it exists
341349 var immediateExists = await redisFacade . HashContainsKey ( key , field , CancellationToken ) ;
342350 immediateExists . Should ( ) . BeTrue ( ) ;
343351
344352 // Also verify we can retrieve the value immediately
345- var immediateValue = await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
346- immediateValue . Should ( ) . Be ( payload ) ;
353+ var immediateValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
354+ immediateValues . Should ( ) . NotBeNull ( ) ;
355+ immediateValues ! [ field ] . Should ( ) . Be ( payload ) ;
347356
348357 // Set the value again to test expiration (since TryGetAndDeleteFromHash removes it)
349- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMilliseconds ( 3 ) , CancellationToken ) ;
358+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMilliseconds ( 3 ) , CancellationToken ) ;
350359
351360 // Assert - Should eventually expire
352361 await ShouldEventually . Eventually ( async ( ) =>
@@ -356,8 +365,8 @@ await ShouldEventually.Eventually(async () =>
356365 } , TimeSpan . FromSeconds ( 5 ) , CancellationToken ) ;
357366
358367 // Verify TryGetAndDeleteFromHash also returns null for expired key
359- var expiredValue = await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
360- expiredValue . Should ( ) . BeNull ( ) ;
368+ var expiredValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
369+ expiredValues . Should ( ) . BeNull ( ) ;
361370 }
362371
363372 [ Test ]
@@ -554,22 +563,23 @@ public async Task TryGetAndDeleteFromHash_WithConcurrentCalls_ShouldReturnValueT
554563 var key = Guid . NewGuid ( ) . ToString ( ) ;
555564 var field = "test-field" ;
556565 var payload = "test-payload" ;
566+ var values = new Dictionary < string , string > { { field , payload } } ;
557567 const int concurrentCallCount = 20 ;
558568
559569 // Set a value in the hash
560- await redisFacade . SetInHash ( key , field , payload , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
570+ await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
561571
562572 var countDownLatch = new AsyncCountdownEvent ( concurrentCallCount ) ;
563573
564574 // Act - Make multiple concurrent calls to TryGetAndDeleteFromHash
565- var concurrentTasks = new Task < string ? > [ concurrentCallCount ] ;
575+ var concurrentTasks = new Task < Dictionary < string , string ? > ? > [ concurrentCallCount ] ;
566576 for ( int i = 0 ; i < concurrentCallCount ; i ++ )
567577 {
568578 concurrentTasks [ i ] = Task . Run ( async ( ) =>
569579 {
570580 countDownLatch . Signal ( ) ;
571581 await countDownLatch . WaitAsync ( ) ;
572- return await redisFacade . TryGetAndDeleteFromHash ( key , field , CancellationToken ) ;
582+ return await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
573583 } ) ;
574584 }
575585
@@ -580,7 +590,7 @@ public async Task TryGetAndDeleteFromHash_WithConcurrentCalls_ShouldReturnValueT
580590 var nullResults = results . Where ( result => result == null ) . ToArray ( ) ;
581591
582592 nonNullResults . Should ( ) . HaveCount ( 1 , "exactly one concurrent call should retrieve the value" ) ;
583- nonNullResults [ 0 ] . Should ( ) . Be ( payload , "the successful call should return the correct payload" ) ;
593+ nonNullResults [ 0 ] ! [ field ] . Should ( ) . Be ( payload , "the successful call should return the correct payload" ) ;
584594 nullResults . Should ( ) . HaveCount ( concurrentCallCount - 1 , "all other concurrent calls should return null" ) ;
585595
586596 // Verify the hash key no longer exists
0 commit comments