using System.Runtime.CompilerServices;
using ZB.MOM.WW.LmxProxy.Client.Domain;
namespace ZB.MOM.WW.LmxProxy.Client.Tests.Fakes;
///
/// Hand-written fake implementation of IScadaService for unit testing.
///
internal class FakeScadaService : IScadaService
{
// Configure responses
public ConnectResponse ConnectResponseToReturn { get; set; } = new() { Success = true, SessionId = "test-session-123", Message = "OK" };
public DisconnectResponse DisconnectResponseToReturn { get; set; } = new() { Success = true, Message = "OK" };
public GetConnectionStateResponse GetConnectionStateResponseToReturn { get; set; } = new() { IsConnected = true };
public ReadResponse ReadResponseToReturn { get; set; } = new() { Success = true };
public ReadBatchResponse ReadBatchResponseToReturn { get; set; } = new() { Success = true };
public WriteResponse WriteResponseToReturn { get; set; } = new() { Success = true };
public WriteBatchResponse WriteBatchResponseToReturn { get; set; } = new() { Success = true };
public WriteBatchAndWaitResponse WriteBatchAndWaitResponseToReturn { get; set; } = new() { Success = true };
public CheckApiKeyResponse CheckApiKeyResponseToReturn { get; set; } = new() { IsValid = true, Message = "Valid" };
// Track calls
public List ConnectCalls { get; } = [];
public List DisconnectCalls { get; } = [];
public List GetConnectionStateCalls { get; } = [];
public List ReadCalls { get; } = [];
public List ReadBatchCalls { get; } = [];
public List WriteCalls { get; } = [];
public List WriteBatchCalls { get; } = [];
public List WriteBatchAndWaitCalls { get; } = [];
public List CheckApiKeyCalls { get; } = [];
public List SubscribeCalls { get; } = [];
// Error injection
public Exception? GetConnectionStateException { get; set; }
// Subscription data
public List SubscriptionMessages { get; set; } = [];
public Exception? SubscriptionException { get; set; }
public ValueTask ConnectAsync(ConnectRequest request)
{
ConnectCalls.Add(request);
return new ValueTask(ConnectResponseToReturn);
}
public ValueTask DisconnectAsync(DisconnectRequest request)
{
DisconnectCalls.Add(request);
return new ValueTask(DisconnectResponseToReturn);
}
public ValueTask GetConnectionStateAsync(GetConnectionStateRequest request)
{
GetConnectionStateCalls.Add(request);
if (GetConnectionStateException is not null)
throw GetConnectionStateException;
return new ValueTask(GetConnectionStateResponseToReturn);
}
public ValueTask ReadAsync(ReadRequest request)
{
ReadCalls.Add(request);
return new ValueTask(ReadResponseToReturn);
}
public ValueTask ReadBatchAsync(ReadBatchRequest request)
{
ReadBatchCalls.Add(request);
return new ValueTask(ReadBatchResponseToReturn);
}
public ValueTask WriteAsync(WriteRequest request)
{
WriteCalls.Add(request);
return new ValueTask(WriteResponseToReturn);
}
public ValueTask WriteBatchAsync(WriteBatchRequest request)
{
WriteBatchCalls.Add(request);
return new ValueTask(WriteBatchResponseToReturn);
}
public ValueTask WriteBatchAndWaitAsync(WriteBatchAndWaitRequest request)
{
WriteBatchAndWaitCalls.Add(request);
return new ValueTask(WriteBatchAndWaitResponseToReturn);
}
public ValueTask CheckApiKeyAsync(CheckApiKeyRequest request)
{
CheckApiKeyCalls.Add(request);
return new ValueTask(CheckApiKeyResponseToReturn);
}
public async IAsyncEnumerable SubscribeAsync(
SubscribeRequest request, [EnumeratorCancellation] CancellationToken cancellationToken = default)
{
SubscribeCalls.Add(request);
foreach (var msg in SubscriptionMessages)
{
cancellationToken.ThrowIfCancellationRequested();
yield return msg;
await Task.Yield();
}
if (SubscriptionException is not null)
throw SubscriptionException;
}
}