using System.Collections.Concurrent;
using Akka.Actor;
using Akka.TestKit.Xunit2;
using NSubstitute;
using Serilog;
using Serilog.Core;
using Serilog.Events;
using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Protocol;
using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Services;
using ZB.MOM.WW.ScadaBridge.Commons.Messages.DataConnection;
using ZB.MOM.WW.ScadaBridge.Commons.Observability;
using ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Actors;
using ZB.MOM.WW.ScadaBridge.HealthMonitoring;
namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests.Actors;
///
/// ScadaBridge#56: a device write the DCL performs for an execution runs the protocol adapter
/// inside that execution's log scope, so whatever the adapter logs while writing carries the
/// execution's id - though the write crossed two actor hops (script, Instance Actor, DCL).
///
public class ExecutionLogEnrichmentTests : TestKit
{
private sealed class CaptureSink : ILogEventSink
{
public ConcurrentQueue Events { get; } = new();
public void Emit(LogEvent logEvent) => Events.Enqueue(logEvent);
}
private readonly CaptureSink _sink = new();
private readonly Serilog.ILogger _adapterLog;
private readonly IDataConnection _adapter = Substitute.For();
/// Creates the adapter double; its writes log through a LogContext-enriched Serilog logger.
public ExecutionLogEnrichmentTests()
{
_adapterLog = new LoggerConfiguration().Enrich.FromLogContext().WriteTo.Sink(_sink).CreateLogger();
_adapter.ConnectAsync(Arg.Any>(), Arg.Any())
.Returns(Task.CompletedTask);
_adapter.WriteAsync(Arg.Any(), Arg.Any