using System.Data.Common;
using Dapr.Client;
using EntitlementBLL.Exceptions;
using EntitlementBLL.Implementations;
using EntitlementDAL.DTOs;
using EntitlementDAL.Interfaces;
using GB5Shared.DTO.Framework.CommonConfig;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.EventLogPublish;
using GB5Shared.GenerateAutoNumber;
using GB5Shared.QueryExecutor;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Moq;
using Xunit;
namespace EntitlementTests;
///
/// Covers the new BetaClientBLL.EnrolAsync/OptOutAsync — specifically the reactivate-vs-insert
/// branch driven by UX_MENTITLEMENTBETACLIENT (CLIENTID, BETAPROGRAMNAME) NOT being filtered by
/// STATUS: a client re-enrolling after a prior opt-out must reactivate the existing (soft-deleted)
/// row, never insert a duplicate that would violate the unique key.
///
public class BetaClientBLLTests
{
private static (BetaClientBLL Svc, Mock BetaClientDal) BuildService()
{
var betaClientDal = new Mock();
betaClientDal
.Setup(d => d.SaveAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(Task.CompletedTask);
betaClientDal
.Setup(d => d.ReactivateAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(Task.CompletedTask);
betaClientDal
.Setup(d => d.DeleteAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(Task.CompletedTask);
var queryExecutor = new Mock();
queryExecutor
.Setup(q => q.QueryAsync(It.IsAny(), It.IsAny(), It.IsAny