using ClosedXML.Excel; using DocumentFormat.OpenXml.Drawing.Diagrams; using FluentAssertions; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Moq; using NUnit.Framework; using Strata.ContinuousImprovement.Api.Controllers; using Strata.ContinuousImprovement.Biz.All.Opportunities; using Strata.ContinuousImprovement.Biz.ChargeCode.Initiatives; using Strata.ContinuousImprovement.Biz.ChargeCode.Opportunities; using Strata.ContinuousImprovement.Biz.Configuration; using Strata.ContinuousImprovement.Biz.DbContexts; using Strata.ContinuousImprovement.Biz.Dtos; using Strata.ContinuousImprovement.Biz.Initiatives; using Strata.ContinuousImprovement.Biz.OrgDefined; using Strata.ContinuousImprovement.Biz.Shared; using Strata.ContinuousImprovement.Biz.Test.Unit.Utilities; using Strata.ContinuousImprovement.JazzEntityFrameworkStub; using Strata.ContinuousImprovement.JazzEntityFrameworkStub.Generics; using Strata.CoreLib.Claims; using Strata.FeatureFlags.Client; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using NUnitSetup = NUnit.Framework.SetUpAttribute; namespace Strata.ContinuousImprovement.Api.Test.Unit.Controllers { [TestFixture, Category("Unit"), Category("Controller")] public class ChargeCodeOpportunitiesControllerTests { public JazzDbContext DbContext { get; set; } public ChargeCodeOpportunitiesController Controller { get; set; } public IEnumerable Configurations { get; set; } public IClaimsPrincipalAccessor ClaimsPrincipalAccessor { get; set; } public IConfigurationService ConfigurationService { get; set; } public ICCOpportunityService OpportunityService; public ICCInitiativeService InitiativeService; public IOpportunityMetricCohortService OpportunityMetricCohortService; public IFeatureFlagServiceClient FeatureFlagServiceClient; public IAllOpportunityService AllOpportunityService; [OneTimeSetUp] public async Task ConfigurationsControllerTestSetup() { // Arrange var jeff = new JazzEntityFrameworkFactory(); DbContext = await jeff.CreateDbContextAsync(nameof(ConfigurationsControllerTests), CancellationToken.None); Configurations = jeff.Configurations.ToList(); var configuration = jeff.Configurations.First(c => c.ConfigurationGuid == JazzEntityFrameworkFactory.CurrentConfigurationGuid); var ccOpportunityDataModel = jeff.CCOpportunities[0].MapToDataModel(configuration); var workbook = new XLWorkbook(); // Act ClaimsPrincipalAccessor = TestUtilities.GetClaimsPrincipalAccessor(); FeatureFlagServiceClient = TestUtilities.GetFeatureFlagServiceClient("chargecodebeta", true); ConfigurationService = Mock.Of(); Mock.Get(ConfigurationService) .Setup(s => s.GetConfigurationsAsync(It.IsAny())) .Returns(Task.FromResult(Configurations.AsEnumerable())); Mock.Get(ConfigurationService) .Setup(s => s.GetConfigurationAsync(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(configuration)); AllOpportunityService = Mock.Of(); Mock.Get(AllOpportunityService) .Setup(s => s.NameIsValid(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(Task.FromResult(true)); OpportunityService = Mock.Of(); Mock.Get(OpportunityService) .Setup(s => s.UpdateAsync(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(Task.FromResult(Guid.NewGuid().ToString())); Mock.Get(OpportunityService) .Setup(s => s.ValidateChargeCodesAsync(It.IsAny>(), It.IsAny())) .Returns(Task.FromResult(true)); Mock.Get(OpportunityService) .Setup(s => s.ValidateOpportunityLevelsAsync(It.IsAny(), It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(Task.FromResult(true)); Mock.Get(OpportunityService) .Setup(s => s.DeleteAsync(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(true)); Mock.Get(OpportunityService) .Setup(s => s.GetById(It.IsAny(), It.IsAny())) .Returns((oppGuid, token) => oppGuid == ccOpportunityDataModel.OpportunityGuid ? Task.FromResult(ccOpportunityDataModel) : Task.FromResult((CCOpportunityDataModel)null)); Mock.Get(OpportunityService) .Setup(s => s.ExportAsync(It.IsAny(), It.IsAny>(), It.IsAny(), It.IsAny())) .Returns, string, CancellationToken>((oppGuid, chargeCodes, userName, token) => oppGuid == ccOpportunityDataModel.OpportunityGuid ? Task.FromResult(((IXLWorkbook)workbook)) : Task.FromResult(((IXLWorkbook)null))); Mock.Get(OpportunityService) .Setup(s => s.UpdateGoalTotalUnitsOfServiceAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns((oppGuid, key, value, token) => oppGuid == ccOpportunityDataModel.OpportunityGuid ? Task.FromResult(true) : Task.FromResult(false)); Mock.Get(OpportunityService) .Setup(s => s.UpdateGoalCostPerUnitAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns((oppGuid, key, goalValue, token) => oppGuid == ccOpportunityDataModel.OpportunityGuid ? Task.FromResult(true) : Task.FromResult(false)); Mock.Get(OpportunityService) .Setup(s => s.GetInitiativeInfoAsync(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(new InitiativeInfo())); Mock.Get(OpportunityService) .Setup(s => s.RefreshOpportunityTrackingData(It.IsAny(), It.IsAny(), It.IsAny())) .Returns((dbGuid, oppGuid, token) => dbGuid.ToString() == TestUtilities.DbGuid && oppGuid == ccOpportunityDataModel.OpportunityGuid ? Task.FromResult("Good") : Task.FromResult("")); InitiativeService = Mock.Of(); Mock.Get(InitiativeService) .Setup(s => s.UpdateSavings(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(true)); OpportunityMetricCohortService = Mock.Of(); } [NUnitSetup] public void TestSetup() { // Arrange Controller = new ChargeCodeOpportunitiesController(ClaimsPrincipalAccessor, ConfigurationService, OpportunityService, InitiativeService, OpportunityMetricCohortService, FeatureFlagServiceClient, AllOpportunityService); } [Test()] public void ChargeCodeOpportunitiesControllerTest() { // Act var controller = new ChargeCodeOpportunitiesController(ClaimsPrincipalAccessor, ConfigurationService, OpportunityService, InitiativeService, OpportunityMetricCohortService, FeatureFlagServiceClient, AllOpportunityService); // Assert controller.Should().NotBeNull(); } [Test()] public async Task UpdateOpportunityTest() { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstOrDefaultAsync(CancellationToken.None); var opportunity = opp.MapToSaveModel(); // Act var result = await Controller.UpdateOpportunity(opportunity.OpportunityGuid, opportunity, CancellationToken.None); // Assert var actual = result.Result; result.Result.Should().BeOfType(); var okResult = (OkObjectResult)result.Result; okResult.Value.Should().BeOfType(); var value = new Guid(okResult.Value as string); value.Should().NotBeEmpty(); } [Test()] public async Task ValidateChargeCodesAsyncTest() { // Arrange var chargeCodes = new List(); // Act var result = await Controller.ValidateChargeCodesAsync(new ChargeCodeOpportunitiesController.ValidateChargeCodeDto() { ChargeCodes = chargeCodes }, CancellationToken.None); // Assert result.Result.Should().BeOfType(); var okResult = (OkObjectResult)result.Result; okResult.Value.Should().BeOfType(); var value = (bool)okResult.Value; value.Should().BeTrue(); } [Test()] public async Task GetCustomPickerChargeCodesAsyncTest() { // Arrange var chargeCodes = new List(); // Act var result = await Controller.GetChargeCodeMembers(chargeCodes, CancellationToken.None); // Assert result.Result.Should().BeOfType(); var okResult = (OkObjectResult)result.Result; okResult.Value.Should().BeOfType(); var value = (ChargeCodePickerModel[])okResult.Value; value.Should().NotBeNull(); } [Test()] public async Task ValidateOpportunityLevelsAsyncTest() { // Arrange var info = new ChargeCodeOpportunitiesController.OpportunityLevelSelectionInfo { Configuration = Configurations.First().ConfigurationGuid, OpportunityLevel = OpportunityLevel.Entity, OpportunityLevels = new List() }; // Act var result = await Controller.ValidateOpportunityLevelsAsync(info, CancellationToken.None); // Assert result.Result.Should().BeOfType(); var okResult = (OkObjectResult)result.Result; okResult.Value.Should().BeOfType(); var value = (bool)okResult.Value; value.Should().BeTrue(); } [Test()] public async Task DeleteTest() { // Act var result = await Controller.Delete(Guid.NewGuid(), CancellationToken.None); // Assert result.Should().BeTrue(); } [TestCase(true, TestName = "GetByIdTest - true")] [TestCase(false, TestName = "GetByIdTest - false")] public async Task GetByIdTest(bool withOpp) { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstAsync(CancellationToken.None); // Act var result = await Controller.GetById(withOpp ? opp.OpportunityGuid : Guid.NewGuid(), CancellationToken.None); // Assert if (withOpp) { result.Result.Should().BeOfType(); var okResult = (OkObjectResult)result.Result; okResult.Value.Should().BeOfType() .And.NotBeOfType(); } else { result.Result.Should().BeOfType(); } } [TestCase(true, TestName = "GetEditModelTest - true")] [TestCase(false, TestName = "GetEditModelTest - false")] public async Task GetEditModelTest(bool withOpp) { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstAsync(CancellationToken.None); // Act var result = await Controller.GetEditModel(withOpp ? opp.OpportunityGuid : Guid.NewGuid(), CancellationToken.None); // Assert if (withOpp) { result.Should().BeOfType(); } else { result.Should().BeNull(); } } [TestCase(true, TestName = "UpdateGoalTotalUnitsOfServiceTest - true")] [TestCase(false, TestName = "UpdateGoalTotalUnitsOfServiceTest - false")] public async Task UpdateGoalTotalUnitsOfServiceTest(bool withOpp) { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstAsync(CancellationToken.None); // Act var result = await Controller.UpdateGoalTotalUnitsOfService(withOpp ? opp.OpportunityGuid : Guid.NewGuid(), new ChargeCodeOpportunitiesController.GoalSetDto(), CancellationToken.None); // Assert result.Should().Be(withOpp); } [TestCase(true, TestName = "UpdateGoalCostPerUnitTest - true")] [TestCase(false, TestName = "UpdateGoalCostPerUnitTest - false")] public async Task UpdateGoalCostPerUnitTest(bool withOpp) { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstAsync(CancellationToken.None); // Act var result = await Controller.UpdateGoalCostPerUnit(withOpp ? opp.OpportunityGuid : Guid.NewGuid(), new ChargeCodeOpportunitiesController.GoalSetDto(), CancellationToken.None); // Assert result.Should().Be(withOpp); } [TestCase(true, TestName = "ExportTest - true")] [TestCase(false, TestName = "ExportTest - false")] public async Task ExportTest(bool withOpp) { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstAsync(CancellationToken.None); var chargeCodeItems = new ChargeCodeOpportunitiesController.ChargeCodeItems { ChargeCodes = new List() }; // Act var result = await Controller.Export(withOpp ? opp.OpportunityGuid : Guid.NewGuid(), chargeCodeItems, CancellationToken.None); // Assert result.Should().BeOfType(); var excelContentResult = (ExcelContentResult)result; if (withOpp) { excelContentResult.Workbook.Should().NotBeNull(); } else { excelContentResult.Workbook.Should().BeNull(); } } [Test()] public async Task OpportunityCreateEnabledTest() { // Act var result = await Controller.OpportunityCreateEnabled(CancellationToken.None); // Assert result.Should().BeTrue(); } [Test()] public async Task GetInitiativeInfoTest() { // Act var result = await Controller.GetInitiativeInfo(Guid.NewGuid(), CancellationToken.None); // Assert result.Should().BeOfType() .And.NotBeNull(); } [TestCase(true, TestName = "RefreshTest - true")] [TestCase(false, TestName = "RefreshTest - false")] public async Task RefreshTest(bool withOpp) { // Arrange var opp = await DbContext.ChargeCodeOpportunities.FirstAsync(CancellationToken.None); // Act var result = await Controller.Refresh(new ChargeCodeOpportunitiesController.RefreshData { DatabaseGuid = new Guid(TestUtilities.DbGuid), Guid = withOpp ? opp.OpportunityGuid : Guid.NewGuid() }, CancellationToken.None); // Assert result.Should().BeOfType(); if (withOpp) { result.Should().NotBeNullOrEmpty(); } else { result.Should().BeNullOrEmpty(); } } } }