22using System ;
33using System . Collections . Generic ;
44using System . Linq ;
5+ using System . Text ;
56using System . Threading . Tasks ;
67using FluentAssertions ;
78using Halibut . Logging ;
8- using Halibut . Queue . Redis ;
99using Halibut . Queue . Redis . RedisHelpers ;
1010using Halibut . Tests . Queue . Redis . Utils ;
1111using Halibut . Tests . Support ;
@@ -57,15 +57,17 @@ 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 } } ;
60+ var values = new Dictionary < string , byte [ ] > { { field , Encoding . UTF8 . GetBytes ( payload ) } } ;
6161
6262 // Act
6363 await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
6464
6565 // Assert - We'll verify by trying to get and delete it
6666 var retrievedValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
67- retrievedValues . Should ( ) . NotBeNull ( ) ;
68- retrievedValues ! [ field ] . Should ( ) . Be ( payload ) ;
67+ var bytes = retrievedValues . Should ( ) . NotBeNull ( )
68+ . And . Subject . Should ( ) . ContainKey ( field )
69+ . WhoseValue ! ;
70+ Encoding . UTF8 . GetString ( bytes ) . Should ( ) . Be ( payload ) ;
6971 }
7072
7173 [ Test ]
@@ -76,16 +78,18 @@ public async Task TryGetAndDeleteFromHash_WithExistingValue_ShouldReturnValueAnd
7678 var key = Guid . NewGuid ( ) . ToString ( ) ;
7779 var field = "test-field" ;
7880 var payload = "test-payload" ;
79- var values = new Dictionary < string , string > { { field , payload } } ;
81+ var values = new Dictionary < string , byte [ ] > { { field , Encoding . UTF8 . GetBytes ( payload ) } } ;
8082
8183 await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
8284
8385 // Act
8486 var retrievedValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
8587
8688 // Assert
87- retrievedValues . Should ( ) . NotBeNull ( ) ;
88- retrievedValues ! [ field ] . Should ( ) . Be ( payload ) ;
89+ var bytes = retrievedValues . Should ( ) . NotBeNull ( )
90+ . And . Subject . Should ( ) . ContainKey ( field )
91+ . WhoseValue ! ;
92+ Encoding . UTF8 . GetString ( bytes ) . Should ( ) . Be ( payload ) ;
8993 }
9094
9195 [ Test ]
@@ -96,7 +100,7 @@ public async Task HashContainsKey_WithExistingField_ShouldReturnTrue()
96100 var key = Guid . NewGuid ( ) . ToString ( ) ;
97101 var field = "test-field" ;
98102 var payload = "test-payload" ;
99- var values = new Dictionary < string , string > { { field , payload } } ;
103+ var values = new Dictionary < string , byte [ ] > { { field , Encoding . UTF8 . GetBytes ( payload ) } } ;
100104
101105 await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
102106
@@ -145,7 +149,7 @@ public async Task TryGetAndDeleteFromHash_ShouldDeleteTheEntireKey()
145149 var key = Guid . NewGuid ( ) . ToString ( ) ;
146150 var field = "test-field" ;
147151 var payload = "test-payload" ;
148- var values = new Dictionary < string , string > { { field , payload } } ;
152+ var values = new Dictionary < string , byte [ ] > { { field , Encoding . UTF8 . GetBytes ( payload ) } } ;
149153
150154 await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 1 ) , CancellationToken ) ;
151155
@@ -158,7 +162,7 @@ public async Task TryGetAndDeleteFromHash_ShouldDeleteTheEntireKey()
158162
159163 // Assert
160164 retrievedValues . Should ( ) . NotBeNull ( ) ;
161- retrievedValues ! [ field ] . Should ( ) . Be ( payload ) ;
165+ Encoding . UTF8 . GetString ( retrievedValues ! [ field ] ! ) . Should ( ) . Be ( payload ) ;
162166
163167 // Verify the entire key was deleted (not just the field)
164168 var existsAfter = await redisFacade . HashContainsKey ( key , field , CancellationToken ) ;
@@ -340,7 +344,7 @@ public async Task SetInHash_WithTTL_ShouldExpireAfterSpecifiedTime()
340344 var key = Guid . NewGuid ( ) . ToString ( ) ;
341345 var field = "test-field" ;
342346 var payload = "test-payload" ;
343- var values = new Dictionary < string , string > { { field , payload } } ;
347+ var values = new Dictionary < string , byte [ ] > { { field , Encoding . UTF8 . GetBytes ( payload ) } } ;
344348
345349 // Act - Set a value in hash with short TTL that we can actually test
346350 await redisFacade . SetInHash ( key , values , TimeSpan . FromMinutes ( 3 ) , CancellationToken ) ;
@@ -352,7 +356,7 @@ public async Task SetInHash_WithTTL_ShouldExpireAfterSpecifiedTime()
352356 // Also verify we can retrieve the value immediately
353357 var immediateValues = await redisFacade . TryGetAndDeleteFromHash ( key , new [ ] { field } , CancellationToken ) ;
354358 immediateValues . Should ( ) . NotBeNull ( ) ;
355- immediateValues ! [ field ] . Should ( ) . Be ( payload ) ;
359+ Encoding . UTF8 . GetString ( immediateValues ! [ field ] ! ) . Should ( ) . Be ( payload ) ;
356360
357361 // Set the value again to test expiration (since TryGetAndDeleteFromHash removes it)
358362 await redisFacade . SetInHash ( key , values , TimeSpan . FromMilliseconds ( 3 ) , CancellationToken ) ;
@@ -563,7 +567,7 @@ public async Task TryGetAndDeleteFromHash_WithConcurrentCalls_ShouldReturnValueT
563567 var key = Guid . NewGuid ( ) . ToString ( ) ;
564568 var field = "test-field" ;
565569 var payload = "test-payload" ;
566- var values = new Dictionary < string , string > { { field , payload } } ;
570+ var values = new Dictionary < string , byte [ ] > { { field , Encoding . UTF8 . GetBytes ( payload ) } } ;
567571 const int concurrentCallCount = 20 ;
568572
569573 // Set a value in the hash
@@ -572,7 +576,7 @@ public async Task TryGetAndDeleteFromHash_WithConcurrentCalls_ShouldReturnValueT
572576 var countDownLatch = new AsyncCountdownEvent ( concurrentCallCount ) ;
573577
574578 // Act - Make multiple concurrent calls to TryGetAndDeleteFromHash
575- var concurrentTasks = new Task < Dictionary < string , string ? > ? > [ concurrentCallCount ] ;
579+ var concurrentTasks = new Task < Dictionary < string , byte [ ] ? > ? > [ concurrentCallCount ] ;
576580 for ( int i = 0 ; i < concurrentCallCount ; i ++ )
577581 {
578582 concurrentTasks [ i ] = Task . Run ( async ( ) =>
@@ -590,7 +594,7 @@ public async Task TryGetAndDeleteFromHash_WithConcurrentCalls_ShouldReturnValueT
590594 var nullResults = results . Where ( result => result == null ) . ToArray ( ) ;
591595
592596 nonNullResults . Should ( ) . HaveCount ( 1 , "exactly one concurrent call should retrieve the value" ) ;
593- nonNullResults [ 0 ] ! [ field ] . Should ( ) . Be ( payload , "the successful call should return the correct payload" ) ;
597+ Encoding . UTF8 . GetString ( nonNullResults [ 0 ] ! [ field ] ! ) . Should ( ) . Be ( payload , "the successful call should return the correct payload" ) ;
594598 nullResults . Should ( ) . HaveCount ( concurrentCallCount - 1 , "all other concurrent calls should return null" ) ;
595599
596600 // Verify the hash key no longer exists
0 commit comments