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; } }