rama creada apartir de master en j
This commit is contained in:
@@ -14,12 +14,32 @@ namespace adas_core.Test.Services;
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Provides a fake implementation of the <see cref="ILockProvider"/> interface, typically used as a test double or non-functional placeholder.
|
||||
/// </summary>
|
||||
public class FakeLockProvider : ILockProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Asynchronously attempts to acquire a resource identified by the specified key within the given timeout.
|
||||
/// This implementation always reports a successful acquisition by returning <c>true</c>.
|
||||
/// </summary>
|
||||
/// <param name="key">The identifier of the resource to acquire.</param>
|
||||
/// <param name="timeout">The maximum time to wait for the resource to become available.</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> that always completes with <c>true</c>, indicating the resource was acquired.</returns>
|
||||
public Task<bool> AcquireAsync(string key, TimeSpan timeout) => Task.FromResult(true);
|
||||
/// <summary>
|
||||
/// Releases the resource associated with the specified key. This implementation completes immediately without performing any additional operation.
|
||||
/// </summary>
|
||||
/// <param name="key">The identifier of the resource to release.</param>
|
||||
public Task ReleaseAsync(string key) => Task.CompletedTask;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a fake implementation of <see cref="LockManagerService"/>, typically used as a test double to provide controlled or simplified behavior in unit tests.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Inherits all members from <see cref="LockManagerService"/> and is intended to be used in place of the real service when actual locking functionality is not required.
|
||||
/// </remarks>
|
||||
public class FakeLockManagerService : LockManagerService
|
||||
{
|
||||
public FakeLockManagerService() : base(
|
||||
@@ -30,6 +50,12 @@ public class FakeLockManagerService : LockManagerService
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Represents a fake or test double implementation of <see cref="RedisService"/> that also implements <see cref="ICacheService"/>, typically used to simulate Redis caching behavior in testing scenarios.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class combines the inheritance of <see cref="RedisService"/> with the contract of <see cref="ICacheService"/>, allowing it to stand in for a real Redis-backed cache during unit tests or development.
|
||||
/// </remarks>
|
||||
public class FakeRedisService : RedisService, ICacheService
|
||||
{
|
||||
public bool WasCalled { get; private set; }
|
||||
@@ -43,30 +69,55 @@ public class FakeRedisService : RedisService, ICacheService
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves a cached object associated with the specified key, or creates and stores one using the provided factory if no cached entry exists.
|
||||
/// This implementation bypasses caching and directly invokes the factory, recording the invocation for verification purposes while ignoring the TTL and cancellation token.
|
||||
/// </summary>
|
||||
/// <param name="key">The cache key used to identify the stored object.</param>
|
||||
/// <param name="factory">A delegate that asynchronously produces the object to cache when no entry exists for the specified key.</param>
|
||||
/// <param name="ttl">An optional time-to-live duration for the cached entry. Not used in this implementation.</param>
|
||||
/// <param name="cancellationToken">A token to observe for cancellation requests. Not used in this implementation.</param>
|
||||
/// <returns>A task that represents the asynchronous operation, containing the object produced by the factory.</returns>
|
||||
Task<T> ICacheService.GetOrSetObjectAsync<T>(
|
||||
string key,
|
||||
Func<Task<T>> factory,
|
||||
TimeSpan? ttl,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
WasCalled = true;
|
||||
LastKey = key;
|
||||
return factory();
|
||||
}
|
||||
string key,
|
||||
Func<Task<T>> factory,
|
||||
TimeSpan? ttl,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
WasCalled = true;
|
||||
LastKey = key;
|
||||
return factory();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves or sets a cached object associated with the specified grouped field and patient identifier.
|
||||
/// Marks the call as executed via the <c>WasCalled</c> flag and returns the value produced by the supplied factory delegate.
|
||||
/// </summary>
|
||||
/// <param name="groupedField">The grouped field used to identify the cached object.</param>
|
||||
/// <param name="patientId">The identifier of the patient associated with the cached object.</param>
|
||||
/// <param name="factory">The asynchronous factory delegate invoked to produce the value when no cached entry exists.</param>
|
||||
/// <param name="ttl">An optional time-to-live duration for the cached entry.</param>
|
||||
/// <param name="cancellationToken">The token used to cancel the asynchronous operation.</param>
|
||||
/// <returns>The value of type <typeparamref name="T"/> produced by the <paramref name="factory"/> delegate.</returns>
|
||||
Task<T> ICacheService.GetOrSetObjectAsync<T>(
|
||||
GroupedField groupedField,
|
||||
ObjectId patientId,
|
||||
Func<Task<T>> factory,
|
||||
TimeSpan? ttl,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
WasCalled = true;
|
||||
return factory();
|
||||
}
|
||||
GroupedField groupedField,
|
||||
ObjectId patientId,
|
||||
Func<Task<T>> factory,
|
||||
TimeSpan? ttl,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
WasCalled = true;
|
||||
return factory();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Represents a fake implementation of <see cref="CacheService"/> that also implements the <see cref="ICacheService"/> interface, typically used for testing or stubbing scenarios.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class combines inheritance from the concrete <see cref="CacheService"/> base class with the <see cref="ICacheService"/> contract, allowing it to be used wherever an <see cref="ICacheService"/> is required.
|
||||
/// </remarks>
|
||||
public class FakeCacheService : CacheService, ICacheService
|
||||
{
|
||||
public bool WasCalled { get; private set; }
|
||||
@@ -100,6 +151,12 @@ public class FakeCacheService : CacheService, ICacheService
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Represents a fake implementation of the cache service, used for testing or scenarios where a no-op cache behavior is required.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class inherits from <see cref="NoCacheService"/> and implements the <see cref="ICacheService"/> interface, providing a non-functional cache suitable for unit tests or environments where caching should be bypassed.
|
||||
/// </remarks>
|
||||
public class FakeNoCacheService : NoCacheService, ICacheService
|
||||
{
|
||||
public bool WasCalled { get; private set; }
|
||||
@@ -138,21 +195,24 @@ public class CacheDispatcherTest
|
||||
private CacheSettings _cacheSettings = null!;
|
||||
private CacheDispatcher _cacheDispatcher = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the test environment by instantiating fake implementations of the Redis, in-memory, and no-op cache services, along with default <see cref="CacheSettings"/>, and constructs a <see cref="CacheDispatcher"/> under test using these dependencies.
|
||||
/// </summary>
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_redisServiceFake = new FakeRedisService();
|
||||
_memoryServiceFake = new FakeCacheService();
|
||||
_noopServiceFake = new FakeNoCacheService();
|
||||
|
||||
_cacheSettings = new CacheSettings();
|
||||
|
||||
_cacheDispatcher = new CacheDispatcher(
|
||||
_redisServiceFake,
|
||||
_memoryServiceFake,
|
||||
_noopServiceFake,
|
||||
_cacheSettings);
|
||||
}
|
||||
public void SetUp()
|
||||
{
|
||||
_redisServiceFake = new FakeRedisService();
|
||||
_memoryServiceFake = new FakeCacheService();
|
||||
_noopServiceFake = new FakeNoCacheService();
|
||||
|
||||
_cacheSettings = new CacheSettings();
|
||||
|
||||
_cacheDispatcher = new CacheDispatcher(
|
||||
_redisServiceFake,
|
||||
_memoryServiceFake,
|
||||
_noopServiceFake,
|
||||
_cacheSettings);
|
||||
}
|
||||
|
||||
#region TC-23
|
||||
|
||||
@@ -240,17 +300,20 @@ public class CacheDispatcherTest
|
||||
Assert.That(_noopServiceFake.WasCalled, Is.False, "NoCacheService NO debería haber sido invocado");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that <see cref="CacheKeyClassifier.Classify"/> returns <see cref="CacheEnum.EntityType.Unknown"/> when the provided cache key does not start with any recognized prefix.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Classify_ReturnsUnknown_ForUnrecognizedPrefix()
|
||||
{
|
||||
// Arrange
|
||||
var key = "unknown:prefix:key";
|
||||
|
||||
// Act
|
||||
var result = CacheKeyClassifier.Classify(key);
|
||||
|
||||
// Assert
|
||||
Assert.That(result, Is.EqualTo(CacheEnum.EntityType.Unknown));
|
||||
}
|
||||
public void Classify_ReturnsUnknown_ForUnrecognizedPrefix()
|
||||
{
|
||||
// Arrange
|
||||
var key = "unknown:prefix:key";
|
||||
|
||||
// Act
|
||||
var result = CacheKeyClassifier.Classify(key);
|
||||
|
||||
// Assert
|
||||
Assert.That(result, Is.EqualTo(CacheEnum.EntityType.Unknown));
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user