Skip to content

Commit ddc3251

Browse files
test: DRY up ResponseIdValidationServiceTests
Replace per-test CreateCache/CreateService helpers and local variables with a shared _service field initialized via the production parameterless constructor. Use [After(Test)] for TUnit-idiomatic cleanup and implement IDisposable with GC.SuppressFinalize to satisfy CA1001/CA1816 analyzers. Removes ~30 lines of repetitive setup boilerplate across 9 tests.
1 parent 0d2cb75 commit ddc3251

1 file changed

Lines changed: 36 additions & 53 deletions

File tree

Lines changed: 36 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
using EssentialCSharp.Web.Services;
2-
using Microsoft.Extensions.Caching.Memory;
32

43
namespace 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

Comments
 (0)