11using EssentialCSharp . Web . Services ;
2- using Microsoft . Extensions . Caching . Memory ;
32
43namespace EssentialCSharp . Web . Tests ;
54
6- public class ResponseIdValidationServiceTests
5+ public class ResponseIdValidationServiceTests : IDisposable
76{
87 // Match production SizeLimit so SetSize(1) is exercised in tests, not silently ignored.
9- private static MemoryCache CreateCache ( ) => new ( new MemoryCacheOptions { SizeLimit = 10_000 } ) ;
8+ private readonly ResponseIdValidationService _service = new ( ) ;
109
11- private static ResponseIdValidationService CreateService ( MemoryCache cache ) => new ( cache ) ;
10+ [ After ( Test ) ]
11+ public void Cleanup ( ) => _service . Dispose ( ) ;
12+
13+ public void Dispose ( )
14+ {
15+ _service . Dispose ( ) ;
16+ GC . SuppressFinalize ( this ) ;
17+ }
1218
1319 [ Test ]
1420 [ Arguments ( null ) ]
1521 [ Arguments ( "" ) ]
1622 public async Task ValidateResponseId_BlankResponseId_AllowsNewConversation ( string ? responseId )
1723 {
18- using var cache = CreateCache ( ) ;
19- var service = CreateService ( cache ) ;
20-
21- bool result = service . ValidateResponseId ( "user1" , responseId ) ;
24+ bool result = _service . ValidateResponseId ( "user1" , responseId ) ;
2225
2326 await Assert . That ( result ) . IsTrue ( ) ;
2427 }
@@ -28,103 +31,83 @@ public async Task ValidateResponseId_BlankResponseId_AllowsNewConversation(strin
2831 [ Arguments ( "" ) ]
2932 public async Task ValidateResponseId_BlankUserId_Rejects ( string ? userId )
3033 {
31- using var cache = CreateCache ( ) ;
32- var service = CreateService ( cache ) ;
33-
34- bool result = service . ValidateResponseId ( userId , "resp_123" ) ;
34+ bool result = _service . ValidateResponseId ( userId , "resp_123" ) ;
3535
3636 await Assert . That ( result ) . IsFalse ( ) ;
3737 }
3838
3939 [ Test ]
4040 public async Task ValidateResponseId_CacheMiss_AllowsGracefulDegradation ( )
4141 {
42- using var cache = CreateCache ( ) ;
43- var service = CreateService ( cache ) ;
4442 // No RecordResponseId call — simulate server restart / different instance
45-
46- bool result = service . ValidateResponseId ( "user1" , "resp_unknown" ) ;
43+ bool result = _service . ValidateResponseId ( "user1" , "resp_unknown" ) ;
4744
4845 await Assert . That ( result ) . IsTrue ( ) ;
4946 }
5047
5148 [ Test ]
5249 public async Task ValidateResponseId_RecordedByOwner_Validates ( )
5350 {
54- using var cache = CreateCache ( ) ;
55- var service = CreateService ( cache ) ;
56- service . RecordResponseId ( "user1" , "resp_abc" ) ;
51+ _service . RecordResponseId ( "user1" , "resp_abc" ) ;
5752
58- bool result = service . ValidateResponseId ( "user1" , "resp_abc" ) ;
53+ bool result = _service . ValidateResponseId ( "user1" , "resp_abc" ) ;
5954
6055 await Assert . That ( result ) . IsTrue ( ) ;
6156 }
6257
6358 [ Test ]
6459 public async Task ValidateResponseId_RecordedByDifferentUser_Rejects ( )
6560 {
66- using var cache = CreateCache ( ) ;
67- var service = CreateService ( cache ) ;
68- service . RecordResponseId ( "user1" , "resp_abc" ) ;
61+ _service . RecordResponseId ( "user1" , "resp_abc" ) ;
6962
70- bool result = service . ValidateResponseId ( "user2" , "resp_abc" ) ;
63+ bool result = _service . ValidateResponseId ( "user2" , "resp_abc" ) ;
7164
7265 await Assert . That ( result ) . IsFalse ( ) ;
7366 }
7467
7568 [ Test ]
7669 public async Task RecordResponseId_NullInputs_DoesNotThrow ( )
7770 {
78- using var cache = CreateCache ( ) ;
79- var service = CreateService ( cache ) ;
80-
81- service . RecordResponseId ( null , "resp_abc" ) ;
82- service . RecordResponseId ( "user1" , null ) ;
83- service . RecordResponseId ( null , null ) ;
71+ _service . RecordResponseId ( null , "resp_abc" ) ;
72+ _service . RecordResponseId ( "user1" , null ) ;
73+ _service . RecordResponseId ( null , null ) ;
8474
8575 // Verify the service is still functional after no-op calls
86- service . RecordResponseId ( "user1" , "resp_abc" ) ;
87- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_abc" ) ) . IsTrue ( ) ;
76+ _service . RecordResponseId ( "user1" , "resp_abc" ) ;
77+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_abc" ) ) . IsTrue ( ) ;
8878 }
8979
9080 [ Test ]
9181 public async Task ValidateResponseId_MultipleResponseIds_EachValidatedIndependently ( )
9282 {
93- using var cache = CreateCache ( ) ;
94- var service = CreateService ( cache ) ;
95- service . RecordResponseId ( "user1" , "resp_001" ) ;
96- service . RecordResponseId ( "user1" , "resp_002" ) ;
83+ _service . RecordResponseId ( "user1" , "resp_001" ) ;
84+ _service . RecordResponseId ( "user1" , "resp_002" ) ;
9785
98- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_001" ) ) . IsTrue ( ) ;
99- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_002" ) ) . IsTrue ( ) ;
86+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_001" ) ) . IsTrue ( ) ;
87+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_002" ) ) . IsTrue ( ) ;
10088 // Unrecorded ID for same user → cache miss → allow
101- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_003" ) ) . IsTrue ( ) ;
89+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_003" ) ) . IsTrue ( ) ;
10290 }
10391
10492 [ Test ]
10593 public async Task ValidateResponseId_TwoUsers_IsolatedFromEachOther ( )
10694 {
107- using var cache = CreateCache ( ) ;
108- var service = CreateService ( cache ) ;
109- service . RecordResponseId ( "user1" , "resp_A" ) ;
110- service . RecordResponseId ( "user2" , "resp_B" ) ;
111-
112- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_A" ) ) . IsTrue ( ) ;
113- await Assert . That ( service . ValidateResponseId ( "user2" , "resp_B" ) ) . IsTrue ( ) ;
114- await Assert . That ( service . ValidateResponseId ( "user2" , "resp_A" ) ) . IsFalse ( ) ;
115- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_B" ) ) . IsFalse ( ) ;
95+ _service . RecordResponseId ( "user1" , "resp_A" ) ;
96+ _service . RecordResponseId ( "user2" , "resp_B" ) ;
97+
98+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_A" ) ) . IsTrue ( ) ;
99+ await Assert . That ( _service . ValidateResponseId ( "user2" , "resp_B" ) ) . IsTrue ( ) ;
100+ await Assert . That ( _service . ValidateResponseId ( "user2" , "resp_A" ) ) . IsFalse ( ) ;
101+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_B" ) ) . IsFalse ( ) ;
116102 }
117103
118104 [ Test ]
119105 public async Task RecordResponseId_SizeLimitEnforced_EntryCountedInCache ( )
120106 {
121- using var cache = CreateCache ( ) ;
122- var service = CreateService ( cache ) ;
123-
124107 // Record an entry — with SizeLimit set, SetSize(1) should count toward the cache size.
125- service . RecordResponseId ( "user1" , "resp_size_test" ) ;
108+ _service . RecordResponseId ( "user1" , "resp_size_test" ) ;
126109
127110 // Verify it was recorded (i.e., not silently evicted due to misconfiguration).
128- await Assert . That ( service . ValidateResponseId ( "user1" , "resp_size_test" ) ) . IsTrue ( ) ;
111+ await Assert . That ( _service . ValidateResponseId ( "user1" , "resp_size_test" ) ) . IsTrue ( ) ;
129112 }
130113}
0 commit comments