using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Moq; using NUnit.Framework; using Strata.ContinuousImprovement.Biz.ChargeCode; using Strata.ContinuousImprovement.Biz.ChargeCode.Opportunities; using Strata.ContinuousImprovement.Biz.DbContexts; using Strata.ContinuousImprovement.Biz.Test.Unit.Utilities; using Strata.ContinuousImprovement.JazzEntityFrameworkStub; using Strata.Schema.Client.Dtos; using Strata.SqlTools.Configuration.Common.AsyncFactory; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using VerifyNUnit; namespace Strata.ContinuousImprovement.Biz.Test.Unit.ChargeCode.Opportunities { [TestFixture()] public class CCOpportunityServiceTests : OpportunityServiceTests { public IJazzDbContext DbContext { get; set; } private IAsyncDbContextFactory _dbContextFactory { get; set; } public ICCOpportunityService CCOpportunityService { get; set; } public IOptions SectionAccessor { get; set; } public ILogger Logger { get; set; } [SetUp] public void TestSetup() { var chargeCodeDimensionGuid = Guid.NewGuid(); var caseTypeDimensionGuid = Guid.NewGuid(); Mock.Get(SchemaServiceClient) .Setup(s => s.GetDimensionByGlobalIdAsync(It.IsAny(), It.IsAny())) .Returns((globalId, token) => globalId switch { "Charge Code" => Task.FromResult(new Schema.Client.Dtos.Info.ScoreDimensionInfoDto { DimensionGuid = chargeCodeDimensionGuid }), "Case Type" => Task.FromResult(new Schema.Client.Dtos.Info.ScoreDimensionInfoDto { DimensionGuid = caseTypeDimensionGuid }), _ => Task.FromResult(new Schema.Client.Dtos.Info.ScoreDimensionInfoDto { DimensionGuid = Guid.NewGuid() }) }); Mock.Get(SchemaServiceClient) .Setup(x => x.GetHierarchyNodesFromHierarchyPathsAsync(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns, CancellationToken>((dimensionGuid, codeHpaths, token) => Task.FromResult(new List { new HierarchyNodeDto{ Path = "Path", PathDisplay = "PathDisplay", Name = "Name", Count = 10, IsLeaf= false } }.AsEnumerable())); Mock.Get(SchemaServiceClient) .Setup(x => x.GetDimensionMembersFromHierarchyPathsAsync(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns, CancellationToken>((dimensionGuid, codeHpaths, token) => Task.FromResult(new List { new MemberDto { Name ="Name", Id = "02" } }.AsEnumerable())); Mock.Get(SchemaServiceClient) .Setup(x => x.GetFilteredDimensionMembersByGlobalIdAsync(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns(Task.FromResult(new List { new ChargeCodePickerModel(){ ChargeCodeId = 99, Name = "TestName", CostDriver = "TestCostDriver", Rollup = "TestRollup" } }.AsEnumerable())); var principal = TestUtilities.GetClaimsPrincipalAccessor(); var defaultUser = principal.GetCurrentClaimsPrincipal(); Mock.Get(ClaimsPrincipalAccessor) .Setup(x => x.GetCurrentClaimsPrincipal()) .Returns(defaultUser); SectionAccessor = Mock.Of>(); Mock.Get(SectionAccessor) .Setup(x => x.Value) .Returns(new ChargeCodeOpportunityValidationSection { MaxChargeCodeSelections = 10, MaxOpportunityLevelSelections = 10, }); Logger = Mock.Of>(); CCOpportunityService = new CCOpportunityService(DbContextFactory, null, // CentralDbContext, ClaimsPrincipalAccessor, ConfigurationService, AuthorizationServiceClient, IdServiceClient, FiscalMonthResolver, SchemaServiceClient, BackgroundJobClient, NotificationHubContext, SectionAccessor, InitiativeService, SnowflakeDatabaseContext, UpdateFactOpportunitySavingsService, Logger); } [Test()] public async Task CCOpportunityServiceTest() { await Verifier.Verify(CCOpportunityService, VerifySettings) .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task GetDbContextAsyncTest() { var dbContext = await CCOpportunityService.GetDbContext(CancellationToken.None); var names = dbContext.AllOpportunities.Select(opp => $"All - {opp.Name} {opp.OpportunityId}").ToList(); names.AddRange(dbContext.ChargeCodeOpportunities.Select(opp => opp.Name ?? "")); names.AddRange(dbContext.EncounterOpportunities.Select(opp => opp.Name ?? "")); names.AddRange(dbContext.FFOpportunities.Select(opp => opp.Name ?? "")); names.AddRange(dbContext.GeneralLedgerOpportunities.Select(opp => opp.Name ?? "")); names.AddRange(dbContext.Initiatives.Select(opp => $"Initiative - {opp.Name} {opp.OpportunityId}")); names.AddRange(dbContext.PayrollOpportunities.Select(opp => opp.Name ?? "")); names.AddRange(dbContext.VariationOpportunities.Where(opp => opp.OpportunityKey.StartsWith("UV")) .Select(opp => $"{opp.CostDriver ?? ""} {opp.ServiceLineName ?? ""} {opp.EntityName ?? ""} {opp.OpportunityId}")); await Verifier.Verify(new { names = names.Distinct().OrderBy(x => x), counts = new[] { dbContext.Configurations.Count(), dbContext.AllOpportunities.Count(opp => !opp.OpportunityKey.StartsWith("FE")), dbContext.ChargeCodeOpportunities.Count(), dbContext.EncounterOpportunities.Count(), dbContext.FFOpportunities.Count(), dbContext.GeneralLedgerOpportunities.Count(), dbContext.Initiatives.Count(), dbContext.PayrollOpportunities.Count(), dbContext.VariationOpportunities.Count(opp => opp.OpportunityKey.StartsWith("UV")) } }, VerifySettings) .IgnoreInstance((x) => true) .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task GetChargeCodeCustomPickerMembersAsyncTest() { var result = await CCOpportunityService.GetChargeCodePickerModelMembers(new List { "CC 1" }, CancellationToken.None); await Verifier.Verify(result, VerifySettings) .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task ValidateOpportunityLevelsAsyncTest() { Assert.Inconclusive(); } [Test()] public async Task CreateAsyncTest() { Assert.Inconclusive(); } [Test(), Ignore("Still working on this")] public async Task UpdateAsyncTest() { var dbGuid = JazzEntityFrameworkFactory.DatabaseGuid; var opportunities = JAZZ_Framework.ChargeCodeOpportunities; var opportunity = opportunities.FirstOrDefault(); opportunity.Name += " Updated"; var result = await CCOpportunityService.UpdateAsync(dbGuid, opportunity, CancellationToken.None); await Verifier.Verify(result, VerifySettings) .DontScrubGuids() .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task GetByIdTest() { var opportunities = JAZZ_Framework.CCOpportunities; var opportunity = opportunities.FirstOrDefault(); var result = await CCOpportunityService.GetById(opportunity.OpportunityGuid, CancellationToken.None); result.Configuration = null; await Verifier.Verify(result, VerifySettings) .DontScrubGuids() .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task DeleteAsyncTest() { Assert.Inconclusive(); } [Test()] public async Task GetInitiativeInfoAsyncTest() { var opportunities = JAZZ_Framework.CCOpportunities; var opportunity = opportunities.FirstOrDefault(); var result = await CCOpportunityService.GetInitiativeInfoAsync(opportunity.OpportunityGuid, CancellationToken.None); await Verifier.Verify(result, VerifySettings) .DontScrubGuids() .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task RefreshOpportunityTrackingDataTest() { Assert.Inconclusive(); } [Test(), Ignore("Still working on this")] public async Task ExportAsyncTest() { var opportunities = JAZZ_Framework.CCOpportunities; var opportunity = opportunities.FirstOrDefault(); var export = await CCOpportunityService.ExportAsync(opportunity.OpportunityGuid, new string[] { "CC 1" }, "", CancellationToken.None); var result = export.GetDataTables(); await Verifier.Verify(result, VerifySettings) .DontScrubGuids() .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task UpdateGoalTotalUnitsOfServiceAsyncTest() { var opportunities = JAZZ_Framework.CCOpportunities; var opportunity = opportunities.FirstOrDefault(); var result = await CCOpportunityService.UpdateGoalTotalUnitsOfServiceAsync(opportunity.OpportunityGuid, "|CC 1|", 100, CancellationToken.None); //await Verifier.Verify(result, VerifySettings) // .DontScrubGuids() // .UseFileName(TestContext.CurrentContext.TestName()); } [Test()] public async Task UpdateGoalCostPerUnitAsyncTest() { Assert.Inconclusive(); } } }