using Grpc.Core; using MxGateway.Contracts.Proto; namespace MxGateway.Client.Tests; internal sealed class FakeGatewayTransport(MxGatewayClientOptions options) : IMxGatewayClientTransport { private readonly Queue _invokeReplies = new(); private readonly List _events = []; public MxGatewayClientOptions Options { get; } = options; public MxAccessGateway.MxAccessGatewayClient? RawClient => null; public List<(OpenSessionRequest Request, CallOptions CallOptions)> OpenSessionCalls { get; } = []; public List<(CloseSessionRequest Request, CallOptions CallOptions)> CloseSessionCalls { get; } = []; public List<(MxCommandRequest Request, CallOptions CallOptions)> InvokeCalls { get; } = []; public List<(StreamEventsRequest Request, CallOptions CallOptions)> StreamEventsCalls { get; } = []; public OpenSessionReply OpenSessionReply { get; set; } = new() { SessionId = "session-fixture", BackendName = "mxaccess-worker", GatewayProtocolVersion = 1, WorkerProtocolVersion = 1, ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.Ok }, }; public CloseSessionReply CloseSessionReply { get; set; } = new() { SessionId = "session-fixture", FinalState = SessionState.Closed, ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.Ok }, }; public Task OpenSessionAsync( OpenSessionRequest request, CallOptions callOptions) { OpenSessionCalls.Add((request, callOptions)); return Task.FromResult(OpenSessionReply); } public Task CloseSessionAsync( CloseSessionRequest request, CallOptions callOptions) { CloseSessionCalls.Add((request, callOptions)); return Task.FromResult(CloseSessionReply); } public Task InvokeAsync( MxCommandRequest request, CallOptions callOptions) { InvokeCalls.Add((request, callOptions)); return Task.FromResult(_invokeReplies.Dequeue()); } public async IAsyncEnumerable StreamEventsAsync( StreamEventsRequest request, CallOptions callOptions) { StreamEventsCalls.Add((request, callOptions)); foreach (MxEvent gatewayEvent in _events) { callOptions.CancellationToken.ThrowIfCancellationRequested(); await Task.Yield(); yield return gatewayEvent; } } public void AddInvokeReply(MxCommandReply reply) { _invokeReplies.Enqueue(reply); } public void AddEvent(MxEvent gatewayEvent) { _events.Add(gatewayEvent); } }