Template
317 lines
16 KiB
C#
317 lines
16 KiB
C#
using DocumentFormat.OpenXml.Wordprocessing;
|
|
using Microsoft.Extensions.Logging;
|
|
using Moq;
|
|
using MoreLinq;
|
|
using NUnit.Framework;
|
|
using Strata.ContinuousImprovement.Biz.Configuration;
|
|
using Strata.ContinuousImprovement.Biz.DbContexts;
|
|
using Strata.ContinuousImprovement.Biz.DbContexts.Snowflake;
|
|
using Strata.ContinuousImprovement.Biz.Exploration;
|
|
using Strata.ContinuousImprovement.Biz.Exploration.CaseTypeFamilies;
|
|
using Strata.ContinuousImprovement.Biz.Exploration.Filters;
|
|
using Strata.ContinuousImprovement.Biz.FiscalMonths;
|
|
using Strata.ContinuousImprovement.Biz.Test.Unit.Utilities;
|
|
using Strata.ContinuousImprovement.Biz.Utilities;
|
|
using Strata.ContinuousImprovement.JazzEntityFrameworkStub;
|
|
using Strata.SqlTools.Configuration.Common.AsyncFactory;
|
|
using Strata.StrataSphereCompare.Client;
|
|
using Strata.StrataSphereCompare.Client.Models;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.Json;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using VerifyNUnit;
|
|
using VerifyTests;
|
|
using static Strata.ContinuousImprovement.Biz.Exploration.ExplorationService;
|
|
using ExplorationFilter = Strata.ContinuousImprovement.Biz.Exploration.Filters.Filter;
|
|
|
|
namespace Strata.ContinuousImprovement.Biz.Test.Unit.Exploration
|
|
{
|
|
[TestFixture, Category("Unit")]
|
|
public class ExplorationServiceTest
|
|
{
|
|
private const string SourceFilePath = @"Exploration/source/";
|
|
|
|
public IAsyncDbContextFactory<JazzDbContext> DbContextFactory { get; set; }
|
|
public JazzEntityFrameworkFactory JAZZ_Framework { get; set; }
|
|
public JazzDbContext JazzDbContext { get; set; }
|
|
public ISqlGridReaderWrapper SqlGridReader { get; set; }
|
|
public ISnowflakeDatabaseContext SnowflakeDatabaseContext { get; set; }
|
|
public IConfigurationService ConfigurationService { get; set; }
|
|
public IFiscalMonthResolver FiscalMonthResolver { get; set; }
|
|
public ILogger<ExplorationService> Logger { get; set; }
|
|
public VerifySettings VerifySettings { get; set; }
|
|
public IFeatureFlagWrapper FeatureFlagWrapper { get; set; }
|
|
public IStrataSphereCompareService StrataSphereCompareService { get; set; }
|
|
public IExplorationFilterService ExplorationFilterService { get; set; }
|
|
|
|
[OneTimeSetUp]
|
|
public void ExplorationServiceTestOneTimeSetUp()
|
|
{
|
|
DbContextFactory = Mock.Of<IAsyncDbContextFactory<JazzDbContext>>();
|
|
JAZZ_Framework = new JazzEntityFrameworkFactory();
|
|
|
|
Mock.Get(DbContextFactory)
|
|
.Setup(s => s.CreateDbContextAsync(It.IsAny<CancellationToken>()))
|
|
.Returns(async () =>
|
|
{
|
|
JazzDbContext = await JAZZ_Framework.CreateDbContextAsync(CancellationToken.None);
|
|
return JazzDbContext;
|
|
});
|
|
|
|
SqlGridReader = Mock.Of<ISqlGridReaderWrapper>();
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read(It.IsAny<bool>()))
|
|
.Returns(Enumerable.Empty<dynamic>());
|
|
SnowflakeDatabaseContext = Mock.Of<ISnowflakeDatabaseContext>();
|
|
Mock.Get(SnowflakeDatabaseContext)
|
|
.Setup(s => s.QueryMultipleAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<object>(), It.IsAny<TimeSpan>()))
|
|
.Returns(Task.FromResult(SqlGridReader));
|
|
|
|
ConfigurationService = Mock.Of<IConfigurationService>();
|
|
FiscalMonthResolver = Mock.Of<IFiscalMonthResolver>();
|
|
Logger = Mock.Of<ILogger<ExplorationService>>();
|
|
VerifySettings = TestExtensions.TestSettings();
|
|
FeatureFlagWrapper = Mock.Of<IFeatureFlagWrapper>();
|
|
StrataSphereCompareService = Mock.Of<IStrataSphereCompareService>();
|
|
ExplorationFilterService = Mock.Of<IExplorationFilterService>();
|
|
|
|
// Setup the mock to return empty results
|
|
Mock.Get(ExplorationFilterService)
|
|
.Setup(s => s.GetFilterStringsAsync(It.IsAny<IEnumerable<FilterChipItem>>(), It.IsAny<IQueryParamBase>(), It.IsAny<CancellationToken>()))
|
|
.ReturnsAsync(("", ""));
|
|
Mock.Get(ExplorationFilterService)
|
|
.Setup(s => s.BuildDataFiltersAsync(It.IsAny<CaseTypeFamily>(), It.IsAny<string>(), It.IsAny<ExplorationFilter>(), It.IsAny<bool>(), It.IsAny<bool>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
|
|
.ReturnsAsync(new CostDetailsFilterDto());
|
|
Mock.Get(ExplorationFilterService)
|
|
.Setup(s => s.CreateCostDriverFilter())
|
|
.Returns(new FilterChipItem());
|
|
Mock.Get(FeatureFlagWrapper)
|
|
.Setup(f => f.IsCiBenchmarkingEnabled(It.IsAny<bool>()))
|
|
.ReturnsAsync(true);
|
|
|
|
|
|
}
|
|
|
|
[TestCaseSource(nameof(GetCaseTypeFamilyDetailsTestCases))]
|
|
public async Task GetCaseTypeFamilyDetailsTest(GetCaseTypeFamilyDetailsTestData data)
|
|
{
|
|
// arrange
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<CTFGroupCalcs>(It.IsAny<bool>()))
|
|
.Returns(data.CTFGroupCalcsList);
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<EntityGroupCalcs>(It.IsAny<bool>()))
|
|
.Returns(data.EntityGroupCalcsList);
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<EntityCodeGroupCalcs>(It.IsAny<bool>()))
|
|
.Returns(data.EntityCodeGroupCalcsList);
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<EntityCodePhysicianGroupCalcs>(It.IsAny<bool>()))
|
|
.Returns(data.EntityCodePhysicianGroupCalcsList);
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<CTFEncounterDetail>(It.IsAny<bool>()))
|
|
.Returns(data.CTFEncounterDetailList);
|
|
|
|
var explorationService = new ExplorationService(
|
|
DbContextFactory,
|
|
SnowflakeDatabaseContext,
|
|
FiscalMonthResolver,
|
|
FeatureFlagWrapper,
|
|
StrataSphereCompareService,
|
|
ExplorationFilterService,
|
|
Logger);
|
|
|
|
// act
|
|
var taskResult = await explorationService.GetCaseTypeFamilyDetailsAsync(data.ExplorationDetailInfoData, CancellationToken.None);
|
|
|
|
// assert
|
|
await Verifier.Verify(taskResult, VerifySettings)
|
|
.UseFileName(TestContext.CurrentContext.TestName());
|
|
}
|
|
|
|
[TestCaseSource(nameof(GetEncountersTestCases))]
|
|
public async Task GetEncountersTest(GetEncountersTestData data)
|
|
{
|
|
// arrange
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<PhysicianInfo>(It.IsAny<bool>()))
|
|
.Returns(data.PhysicianInfoList);
|
|
Mock.Get(SqlGridReader)
|
|
.Setup(s => s.Read<EncounterInfoBase>(It.IsAny<bool>()))
|
|
.Returns(data.EncounterInfoBaseList);
|
|
var configurationGuid = Guid.Empty;
|
|
|
|
var explorationService = new ExplorationService(
|
|
DbContextFactory,
|
|
SnowflakeDatabaseContext,
|
|
FiscalMonthResolver,
|
|
FeatureFlagWrapper,
|
|
StrataSphereCompareService,
|
|
ExplorationFilterService,
|
|
Logger);
|
|
|
|
// act
|
|
var taskResult = await explorationService.GetEncountersAsync(data.ExplorationDetailInfoData, configurationGuid, CancellationToken.None);
|
|
|
|
// assert
|
|
await Verifier.Verify(taskResult, VerifySettings)
|
|
.UseFileName(TestContext.CurrentContext.TestName());
|
|
}
|
|
|
|
private static IEnumerable<TestCaseData> GetCaseTypeFamilyDetailsTestCases()
|
|
{
|
|
var testName = "GetCaseTypeFamilyDetailsTest";
|
|
|
|
var explorationDetailInfoDataJson = GetSourceFile("ExplorationDetailInfo.txt");
|
|
var ctfGroupCalcsListJson = GetSourceFile("CTFGroupCalcs.txt");
|
|
var entityGroupCalcsListJson = GetSourceFile("EntityGroupCalcs.txt");
|
|
var entityCodeGroupCalcsListJson = GetSourceFile("EntityCodeGroupCalcs.txt");
|
|
var entityCodePhysicianGroupCalcsListJson = GetSourceFile("EntityCodePhysicianGroupCalcs.txt");
|
|
var ctfEncounterDetailListJson = GetSourceFile("CTFEncounterDetail.txt");
|
|
|
|
var dataAllMatch = new GetCaseTypeFamilyDetailsTestData()
|
|
{
|
|
ExplorationDetailInfoData = JsonSerializer.Deserialize<ExplorationDetailInfo>(explorationDetailInfoDataJson),
|
|
CTFGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<CTFGroupCalcs>>(ctfGroupCalcsListJson),
|
|
EntityGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<EntityGroupCalcs>>(entityGroupCalcsListJson),
|
|
EntityCodeGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<EntityCodeGroupCalcs>>(entityCodeGroupCalcsListJson),
|
|
EntityCodePhysicianGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<EntityCodePhysicianGroupCalcs>>(entityCodePhysicianGroupCalcsListJson),
|
|
CTFEncounterDetailList = JsonSerializer.Deserialize<IEnumerable<CTFEncounterDetail>>(ctfEncounterDetailListJson)
|
|
};
|
|
dataAllMatch.ExplorationDetailInfoData.Filters = new ExplorationFilter() // FIXED: Changed from Biz.Exploration.Filters.Filter to ExplorationFilter
|
|
{
|
|
FilterChipItems = new List<FilterChipItem>()
|
|
{
|
|
new FilterChipItem {
|
|
ChipType = ChipType.DateRange, Key = ChipKey.DischargeDateID,
|
|
DateRange = new List<DateTime>()
|
|
{
|
|
new DateTime(2024, 1, 1),
|
|
new DateTime(2024, 12, 31)
|
|
}
|
|
}
|
|
}
|
|
};
|
|
yield return new TestCaseData(dataAllMatch)
|
|
.SetName($"{testName} All Match");
|
|
|
|
var dataPhysicianIdNotMatch = new GetCaseTypeFamilyDetailsTestData()
|
|
{
|
|
ExplorationDetailInfoData = dataAllMatch.ExplorationDetailInfoData,
|
|
CTFGroupCalcsList = dataAllMatch.CTFGroupCalcsList,
|
|
EntityGroupCalcsList = dataAllMatch.EntityGroupCalcsList,
|
|
EntityCodeGroupCalcsList = dataAllMatch.EntityCodeGroupCalcsList,
|
|
EntityCodePhysicianGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<EntityCodePhysicianGroupCalcs>>(entityCodePhysicianGroupCalcsListJson),
|
|
CTFEncounterDetailList = dataAllMatch.CTFEncounterDetailList
|
|
};
|
|
dataPhysicianIdNotMatch.EntityCodePhysicianGroupCalcsList.First().PhysicianId = 0;
|
|
yield return new TestCaseData(dataPhysicianIdNotMatch)
|
|
.SetName($"{testName} PhysicianId Not Match");
|
|
|
|
var dataCodeNotMatch = new GetCaseTypeFamilyDetailsTestData()
|
|
{
|
|
ExplorationDetailInfoData = dataAllMatch.ExplorationDetailInfoData,
|
|
CTFGroupCalcsList = dataAllMatch.CTFGroupCalcsList,
|
|
EntityGroupCalcsList = dataAllMatch.EntityGroupCalcsList,
|
|
EntityCodeGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<EntityCodeGroupCalcs>>(entityCodeGroupCalcsListJson),
|
|
EntityCodePhysicianGroupCalcsList = dataAllMatch.EntityCodePhysicianGroupCalcsList,
|
|
CTFEncounterDetailList = dataAllMatch.CTFEncounterDetailList
|
|
};
|
|
dataCodeNotMatch.EntityCodeGroupCalcsList.First().Code = "";
|
|
yield return new TestCaseData(dataCodeNotMatch)
|
|
.SetName($"{testName} Code Not Match");
|
|
|
|
var dataEntityNotMatch = new GetCaseTypeFamilyDetailsTestData()
|
|
{
|
|
ExplorationDetailInfoData = dataAllMatch.ExplorationDetailInfoData,
|
|
CTFGroupCalcsList = dataAllMatch.CTFGroupCalcsList,
|
|
EntityGroupCalcsList = JsonSerializer.Deserialize<IEnumerable<EntityGroupCalcs>>(entityGroupCalcsListJson),
|
|
EntityCodeGroupCalcsList = dataAllMatch.EntityCodeGroupCalcsList,
|
|
EntityCodePhysicianGroupCalcsList = dataAllMatch.EntityCodePhysicianGroupCalcsList,
|
|
CTFEncounterDetailList = dataAllMatch.CTFEncounterDetailList
|
|
};
|
|
dataEntityNotMatch.EntityGroupCalcsList.First().EntityId = 0;
|
|
yield return new TestCaseData(dataEntityNotMatch)
|
|
.SetName($"{testName} Entity Not Match");
|
|
}
|
|
|
|
private static IEnumerable<TestCaseData> GetEncountersTestCases()
|
|
{
|
|
var testName = "GetEncountersTest";
|
|
|
|
var explorationDetailInfoDataJson = GetSourceFile("ExplorationDetailInfo.txt");
|
|
var physicianInfoJson = GetSourceFile("PhysicianInfo.txt");
|
|
var encounterInfoBaseJson = GetSourceFile("EncounterInfoBase.txt");
|
|
|
|
var dataAllMatch = new GetEncountersTestData()
|
|
{
|
|
ExplorationDetailInfoData = JsonSerializer.Deserialize<ExplorationDetailInfo>(explorationDetailInfoDataJson),
|
|
PhysicianInfoList = JsonSerializer.Deserialize<IEnumerable<PhysicianInfo>>(physicianInfoJson),
|
|
EncounterInfoBaseList = JsonSerializer.Deserialize<IEnumerable<EncounterInfoBase>>(encounterInfoBaseJson)
|
|
};
|
|
|
|
dataAllMatch.ExplorationDetailInfoData.Filters = new ExplorationFilter() // FIXED: Changed from Biz.Exploration.Filters.Filter to ExplorationFilter
|
|
{
|
|
FilterChipItems = new List<FilterChipItem>()
|
|
{
|
|
new FilterChipItem {
|
|
ChipType = ChipType.DateRange, Key = ChipKey.DischargeDateID,
|
|
DateRange = new List<DateTime>()
|
|
{
|
|
new DateTime(2024, 1, 1),
|
|
new DateTime(2024, 12, 31)
|
|
}
|
|
}
|
|
}
|
|
};
|
|
yield return new TestCaseData(dataAllMatch)
|
|
.SetName($"{testName} All Match");
|
|
|
|
var dataPhysicianIdNotMatch = new GetEncountersTestData()
|
|
{
|
|
ExplorationDetailInfoData = dataAllMatch.ExplorationDetailInfoData,
|
|
PhysicianInfoList = JsonSerializer.Deserialize<IEnumerable<PhysicianInfo>>(physicianInfoJson),
|
|
EncounterInfoBaseList = dataAllMatch.EncounterInfoBaseList,
|
|
};
|
|
dataPhysicianIdNotMatch.PhysicianInfoList.First().PhysicianID = 0;
|
|
yield return new TestCaseData(dataPhysicianIdNotMatch)
|
|
.SetName($"{testName} PhysicianId Not Match");
|
|
}
|
|
|
|
private static string GetSourceFile(string file)
|
|
{
|
|
string filePath = Path.Combine(TestHelper.TestsRootDirectory, SourceFilePath, file);
|
|
string jsonData = File.ReadAllText(filePath);
|
|
return jsonData;
|
|
}
|
|
|
|
public class GetCaseTypeFamilySummariesTestData
|
|
{
|
|
public ExplorationInfo ExplorationInfoData { get; set; }
|
|
public IEnumerable<CaseTypeFamilyEncounterInfo> CaseTypeFamilyEncounterInfoList { get; set; }
|
|
|
|
}
|
|
|
|
public class GetCaseTypeFamilyDetailsTestData
|
|
{
|
|
public ExplorationDetailInfo ExplorationDetailInfoData { get; set; }
|
|
public IEnumerable<CTFGroupCalcs> CTFGroupCalcsList { get; set; }
|
|
public IEnumerable<EntityGroupCalcs> EntityGroupCalcsList { get; set; }
|
|
public IEnumerable<EntityCodeGroupCalcs> EntityCodeGroupCalcsList { get; set; }
|
|
public IEnumerable<EntityCodePhysicianGroupCalcs> EntityCodePhysicianGroupCalcsList { get; set; }
|
|
public IEnumerable<CTFEncounterDetail> CTFEncounterDetailList { get; set; }
|
|
}
|
|
|
|
public class GetEncountersTestData
|
|
{
|
|
public ExplorationDetailInfo ExplorationDetailInfoData { get; set; }
|
|
public IEnumerable<PhysicianInfo> PhysicianInfoList { get; set; }
|
|
public IEnumerable<EncounterInfoBase> EncounterInfoBaseList { get; set; }
|
|
}
|
|
}
|
|
}
|