public async Task OnGet_WhenSpecCalculationDoesntExistThenErrorReturned()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();

            ISpecsApiClient specsClient = Substitute.For <ISpecsApiClient>();

            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ILogger logger = Substitute.For <ILogger>();

            Calculation expectedCalculation = new Calculation()
            {
                CalculationSpecification = new Reference("1", "Calc spec"),
                Id   = "2",
                Name = "Specs Calculation",
                FundingPeriodName = "2018/19",
                SpecificationId   = "3",
                PublishStatus     = PublishStatus.Draft,
                LastModifiedBy    = new Reference("1", "Matt Vallily"),
                SourceCode        = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product  Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
                Version           = 4
            };

            IEnumerable <int> versions = new List <int> {
                1, 2
            };
            string calculationId = "1";

            Clients.SpecsClient.Models.CalculationCurrentVersion specCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id             = "1",
                Name           = "Test spec",
                Description    = "Test description",
                AllocationLine = new Reference("1", "Test Allocation")
            };

            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Clients.CalcsClient.Models.Calculation>(System.Net.HttpStatusCode.OK, expectedCalculation));

            specsClient
            .GetCalculationById(calculationId, "3")
            .Returns(new ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.NotFound, specCalculation));

            DiffCalculationModel diffCalcModel = new DiffCalculationModel(specsClient, calcsClient, mapper);

            // Act
            IActionResult result = await diffCalcModel.OnGet(versions, calculationId);

            // Assert
            result.Should().NotBeNull();
            result.Should().BeOfType <NotFoundObjectResult>();

            NotFoundObjectResult typeResult = result as NotFoundObjectResult;

            typeResult.Value.Should().Be("Check the specification you entered - one or more of the specifications you entered aren't working");
        }
Esempio n. 2
0
        public async Task EditCalculationPageModel_OnPostAsync_WhenUserDoesNotHaveEditSpecificationPermission_ThenForbidResultReturned()
        {
            // Arrange
            const string specificationId = "spec1";
            const string calculationId   = "calculationId";

            CalculationCurrentVersion calculation = new CalculationCurrentVersion()
            {
                Id              = calculationId,
                Name            = "Calculation Name",
                AllocationLine  = new Reference("al1", "Allocation Line"),
                CalculationType = CalculationSpecificationType.Funding,
                Description     = "Calculation Description",
                IsPublic        = false,
                PolicyId        = "policyId",
                PolicyName      = "Policy Name"
            };

            Specification specification = CreateSpecification(specificationId);

            ISpecsApiClient specsClient = CreateSpecsClient();

            specsClient
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId))
            .Returns(new ApiResponse <CalculationCurrentVersion>(HttpStatusCode.OK, calculation));

            specsClient
            .GetSpecification(Arg.Is(specificationId))
            .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, specification));

            IAuthorizationHelper authorizationHelper = Substitute.For <IAuthorizationHelper>();

            authorizationHelper
            .DoesUserHavePermission(Arg.Any <ClaimsPrincipal>(), Arg.Any <ISpecificationAuthorizationEntity>(), Arg.Is(SpecificationActionTypes.CanEditSpecification))
            .Returns(false);

            EditCalculationPageModel pageModel = CreatePageModel(specsClient, authorizationHelper: authorizationHelper);

            // Act
            IActionResult result = await pageModel.OnPostAsync(specificationId, calculationId);

            // Assert
            result
            .Should()
            .BeOfType <ForbidResult>();

            pageModel
            .IsAuthorizedToEdit
            .Should().BeFalse();
        }
        public async Task OnGet_WhenCalculationExistdCalculationTypeIsFunding_ThenCalculationDisplayTypeIsFunding()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            string calculationId = "5";

            Calculation calcsCalculation = new Calculation()
            {
                Id = calculationId,
                CalculationSpecification = new Reference(calculationId, "Test Calculation Specification"),
                SpecificationId          = "54",
                SourceCode      = "Test Source Code",
                CalculationType = Clients.SpecsClient.Models.CalculationSpecificationType.Funding
            };

            Clients.SpecsClient.Models.CalculationCurrentVersion specsCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id          = calculationId,
                Name        = "Specs Calculation",
                Description = "Spec Description",
            };

            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Calculation>(System.Net.HttpStatusCode.OK, calcsCalculation));

            specsClient
            .GetCalculationById(calcsCalculation.SpecificationId, calculationId)
            .Returns(new ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.OK, specsCalculation));

            EditCalculationPageModel pageModel = CreatePageModel(specsClient: specsClient, calcsClient: calcsClient, mapper: mapper);

            // Act
            IActionResult result = await pageModel.OnGet(calculationId);

            // Assert
            result.Should().NotBeNull();
            result.Should().BeOfType <PageResult>();

            pageModel.Calculation.Should().NotBeNull();
            pageModel.Calculation.Name.Should().Be(calcsCalculation.Name);
            pageModel.Calculation.Description.Should().Be(specsCalculation.Description);
            pageModel.SpecificationId.Should().Be(calcsCalculation.SpecificationId);
            pageModel.EditModel.SourceCode.Should().Be(calcsCalculation.SourceCode);
            pageModel.Calculation.CalculationType.Should().Be(CalculationSpecificationTypeViewModel.Funding);
        }
        public async Task <IActionResult> OnGetAsync(string specificationId, string calculationId)
        {
            Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId));

            Specification specification = await GetSpecification(specificationId);

            if (specification != null)
            {
                IsAuthorizedToEdit = await _authorizationHelper.DoesUserHavePermission(User, specification, SpecificationActionTypes.CanEditSpecification);

                ApiResponse <CalculationCurrentVersion> calculationResult = await _specsClient.GetCalculationById(specificationId, calculationId);

                if (calculationResult == null)
                {
                    _logger.Error("Calculation Result API response returned null for calculation ID '{calculationId}' on specificationId '{specificationId}'", calculationId, specificationId);

                    return(new InternalServerErrorResult("Calculation Result API response returned null"));
                }

                if (calculationResult.StatusCode == HttpStatusCode.NotFound)
                {
                    return(new NotFoundObjectResult("Calculation not found"));
                }
                else if (calculationResult.StatusCode != HttpStatusCode.OK)
                {
                    _logger.Warning($"Unexpected status code from Calculation API call '{calculationResult.StatusCode}'");
                    return(new InternalServerErrorResult($"Unexpected status code from Calculation API call '{calculationResult.StatusCode}'"));
                }

                Calculation calculation = calculationResult.Content;
                if (calculation == null)
                {
                    _logger.Warning("Calculation Result API response content returned null for calculation ID '{calculationId}' on specificationId '{specificationId}'", calculationId, specificationId);

                    return(new InternalServerErrorResult("Calculation content returned null"));
                }

                EditCalculationViewModel = _mapper.Map <EditCalculationViewModel>(calculation);

                return(await PopulateForm(specification, calculationId));
            }
            else
            {
                return(new PreconditionFailedResult("Specification not found"));
            }
        }
        public async Task OnGet_WhenSpecificationDoesntExist_ThenErrorReturned()
        {
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();
            IMapper     mapper              = MappingHelper.CreateFrontEndMapper();
            ILogger     logger              = Substitute.For <ILogger>();
            string      calculationId       = "1";
            Calculation expectedCalculation = new Calculation()
            {
                Id   = "2",
                Name = "Specs Calculation",
                FundingPeriodName = "2018/19",
                SpecificationId   = "3",
                PublishStatus     = PublishStatus.Draft,
                LastModifiedBy    = new Reference("1", "Matt Vallily"),
                SourceCode        = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
                Version           = 4
            };

            calcsClient
            .GetCalculationById("2")
            .Returns(new ApiResponse <Calculation>(System.Net.HttpStatusCode.OK, expectedCalculation));

            Clients.SpecsClient.Models.CalculationCurrentVersion specCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id             = "1",
                Name           = "Test spec",
                Description    = "Test description",
                AllocationLine = new Reference("1", "Test Allocation")
            };

            specsClient
            .GetCalculationById(calculationId, "3")
            .Returns(new ApiResponse <CalculateFunding.Frontend.Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.NotFound, specCalculation));

            ComparePageModel compPageModel = new ComparePageModel(specsClient, calcsClient, mapper);

            // Act
            IActionResult result = await compPageModel.OnGet(calculationId);

            // Assert
            result.Should().NotBeNull();
            result.Should().BeOfType <StatusCodeResult>();
            Assert.IsInstanceOfType(result, typeof(StatusCodeResult));
        }
Esempio n. 6
0
        public async Task EditCalculationPageModel_OnGetAsync_WhenCalculationApiResponseContentIsNull_ThenInternalErrorIsReturned()
        {
            // Arrange
            const string specificationId = "spec1";
            const string calculationId   = "calculationId";

            ISpecsApiClient specsClient = CreateSpecsClient();
            ILogger         logger      = CreateLogger();

            specsClient
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId))
            .Returns(new ApiResponse <CalculationCurrentVersion>(HttpStatusCode.OK, null));

            specsClient
            .GetSpecification(Arg.Is(specificationId))
            .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, new Specification()));

            EditCalculationPageModel pageModel = CreatePageModel(specsClient, logger);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId, calculationId);

            // Assert
            result
            .Should()
            .BeOfType <InternalServerErrorResult>()
            .Which
            .Value
            .Should()
            .Be("Calculation content returned null");

            logger
            .Received(1)
            .Warning("Calculation Result API response content returned null for calculation ID '{calculationId}' on specificationId '{specificationId}'", calculationId, specificationId);

            await specsClient
            .Received(1)
            .GetSpecification(Arg.Is(specificationId));

            await specsClient
            .Received(1)
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId));
        }
Esempio n. 7
0
        public async Task EditCalculationPageModel_OnGetAsync_WhenCalculationApiResponseIsNotSuccessful_ThenInternalErrorIsReturned()
        {
            // Arrange
            const string specificationId = "spec1";
            const string calculationId   = "calculationId";

            ISpecsApiClient specsClient = CreateSpecsClient();
            ILogger         logger      = CreateLogger();

            specsClient
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId))
            .Returns(new ApiResponse <CalculationCurrentVersion>(HttpStatusCode.InternalServerError, null));

            specsClient
            .GetSpecification(Arg.Is(specificationId))
            .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, new Specification()));

            EditCalculationPageModel pageModel = CreatePageModel(specsClient, logger);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId, calculationId);

            // Assert
            result
            .Should()
            .BeOfType <InternalServerErrorResult>()
            .Which
            .Value
            .Should()
            .Be("Unexpected status code from Calculation API call 'InternalServerError'");

            logger
            .Received(1)
            .Warning($"Unexpected status code from Calculation API call 'InternalServerError'");

            await specsClient
            .Received(1)
            .GetSpecification(Arg.Is(specificationId));

            await specsClient
            .Received(1)
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId));
        }
Esempio n. 8
0
        public async Task EditCalculationPageModel_OnGetAsync_WhenCalculationNotFound_ThenNotFoundIsReturned()
        {
            // Arrange
            const string specificationId = "spec1";
            const string calculationId   = "calculationId";

            ISpecsApiClient specsClient = CreateSpecsClient();

            specsClient
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId))
            .Returns(new ApiResponse <CalculationCurrentVersion>(HttpStatusCode.NotFound, null));

            specsClient
            .GetSpecification(Arg.Is(specificationId))
            .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, new Specification()));

            EditCalculationPageModel pageModel = CreatePageModel(specsClient);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId, calculationId);

            // Assert
            result
            .Should()
            .BeOfType <NotFoundObjectResult>()
            .Which
            .Value
            .Should()
            .Be("Calculation not found");

            await specsClient
            .Received(1)
            .GetSpecification(Arg.Is(specificationId));

            await specsClient
            .Received(1)
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId));
        }
        public async Task OnGet_WhencalculationVersionsListReturned()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ILogger logger = Substitute.For <ILogger>();

            Calculation expectedCalculation = new Calculation()
            {
                CalculationSpecification = new Reference("1", "Calc spec"),
                Id   = "2",
                Name = "Specs Calculation",
                FundingPeriodName = "2018/19",
                SpecificationId   = "1",
                PublishStatus     = PublishStatus.Draft,
                LastModifiedBy    = new Reference("1", "Matt Vallily"),
                SourceCode        = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product  Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
                Version           = 4
            };

            IEnumerable <int> versions = new List <int> {
                1, 2
            };
            string calculationId = "1";

            Clients.SpecsClient.Models.CalculationCurrentVersion specCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id             = "1",
                Name           = "Test spec",
                Description    = "Test description",
                AllocationLine = new Reference("1", "Test Allocation")
            };

            // build two versions for feeding the left and right panel
            CalculationVersion calver1 = new CalculationVersion()
            {
                DecimalPlaces = 2,
                Version       = "1",
                Date          = new DateTime(2018, 1, 1, 10, 23, 34),
                Author        = new Reference("1", "Clifford"),
                Status        = "Draft",
                SourceCode    = "Test"
            };

            CalculationVersion calver2 = new CalculationVersion()
            {
                DecimalPlaces = 2,
                Version       = "2",
                Date          = new DateTime(2018, 1, 1, 10, 23, 34),
                Author        = new Reference("2", "Clifford"),
                Status        = "Draft",
                SourceCode    = "Test"
            };

            IEnumerable <CalculationVersion> calcVerArray = new List <CalculationVersion> {
                calver1, calver2
            };

            calcVerArray.AsEnumerable();
            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Clients.CalcsClient.Models.Calculation>(System.Net.HttpStatusCode.OK, expectedCalculation));

            specsClient
            .GetCalculationById("1", calculationId)
            .Returns(new ApiResponse <CalculateFunding.Frontend.Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.OK, specCalculation));  // CalculateFunding.Frontend.Clients.SpecsClient.Models

            calcsClient
            .GetMultipleVersionsByCalculationId(versions, calculationId)
            .Returns(new ApiResponse <IEnumerable <CalculationVersion> >(System.Net.HttpStatusCode.OK, calcVerArray));

            DiffCalculationModel diffCalcPageModel = new DiffCalculationModel(specsClient, calcsClient, mapper);

            // Act
            IActionResult result = await diffCalcPageModel.OnGet(versions, calculationId);

            // Assert
            result.Should().NotBeNull();

            diffCalcPageModel.RightCalculationDiffModel.Version.Should().Be(calver2.Version);
            diffCalcPageModel.LeftCalcualationDiffModel.Version.Should().Be(calver1.Version);
        }
        public async Task OnGet_WhenCalculationHasManyVersions_ThenReturnsVersionsInDescendingOrder()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ILogger logger = Substitute.For <ILogger>();

            string calculationId = "1";

            Calculation expectedCalculation = new Calculation()
            {
                Id   = "1",
                Name = "Specs Calculation",
                FundingPeriodName        = "2018/19",
                SpecificationId          = "3",
                PublishStatus            = PublishStatus.Draft,
                LastModifiedBy           = new Reference("1", "Matt Vallily"),
                SourceCode               = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
                Version                  = 10,
                CalculationSpecification = new Reference("1", "Test Spec")
            };

            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Calculation>(System.Net.HttpStatusCode.OK, expectedCalculation));

            Clients.SpecsClient.Models.CalculationCurrentVersion specCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id             = "1",
                Name           = "Test spec",
                Description    = "Test description",
                AllocationLine = new Reference("1", "Test Allocation")
            };

            specsClient
            .GetCalculationById(expectedCalculation.SpecificationId, calculationId)
            .Returns(new ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.OK, specCalculation));

            List <CalculationVersion> calculationVersions = new List <CalculationVersion>();

            DateTime startCalcTime = DateTime.UtcNow.AddDays(-1);

            for (int i = 1; i < 11; i++)
            {
                calculationVersions.Add(new CalculationVersion()
                {
                    Status        = "Draft",
                    Version       = i.ToString(),
                    DecimalPlaces = 4,
                    Date          = startCalcTime.AddHours(i),
                    Author        = new Reference("1", "Matt Vallily"),
                    SourceCode    = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
                });
            }

            calcsClient
            .GetAllVersionsByCalculationId(calculationId)
            .Returns(new ApiResponse <IEnumerable <CalculationVersion> >(System.Net.HttpStatusCode.OK, calculationVersions));

            ComparePageModel comparePageModel = new ComparePageModel(specsClient, calcsClient, mapper);

            // Act
            IActionResult result = await comparePageModel.OnGet(calculationId);

            // Assert
            result.Should().NotBeNull();

            comparePageModel.Calculations.Should().HaveCount(10);

            comparePageModel.Calculations.Select(f => int.Parse(f.Version)).Should().BeInDescendingOrder();
        }
        public async Task OnGet_WhenCalculationExists_ThenCalculationReturned()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            ILogger logger = Substitute.For <ILogger>();

            string calculationId = "1";

            Calculation expectedCalculation = new Calculation()
            {
                Id   = "1",
                Name = "Specs Calculation",
                FundingPeriodName        = "2018/19",
                SpecificationId          = "3",
                PublishStatus            = PublishStatus.Draft,
                LastModifiedBy           = new Reference("1", "Matt Vallily"),
                SourceCode               = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
                Version                  = 4,
                CalculationSpecification = new Reference("1", "Test Spec")
            };

            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Calculation>(System.Net.HttpStatusCode.OK, expectedCalculation));

            Clients.SpecsClient.Models.CalculationCurrentVersion specCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id             = "1",
                Name           = "Test spec",
                Description    = "Test description",
                AllocationLine = new Reference("1", "Test Allocation")
            };

            specsClient
            .GetCalculationById(expectedCalculation.SpecificationId, calculationId)
            .Returns(new ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.OK, specCalculation));

            CalculationVersion calcsVersion1 = new CalculationVersion()
            {
                Status        = "Draft",
                Version       = "1",
                DecimalPlaces = 4,
                Date          = new DateTime(2018, 1, 1, 12, 34, 45, 03),
                Author        = new Reference("1", "Matt Vallily"),
                SourceCode    = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
            };

            CalculationVersion calcsVersion2 = new CalculationVersion()
            {
                Status        = "Draft",
                Version       = "2",
                DecimalPlaces = 4,
                Date          = new DateTime(2018, 1, 2, 12, 34, 45, 03),
                Author        = new Reference("1", "Matt Vallily"),
                SourceCode    = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
            };

            CalculationVersion calcsVersion3 = new CalculationVersion()
            {
                Status        = "Draft",
                Version       = "3",
                DecimalPlaces = 4,
                Date          = new DateTime(2018, 1, 3, 12, 34, 45, 03),
                Author        = new Reference("1", "Matt Vallily"),
                SourceCode    = "Public Function GetProductResult(rid As String) As Decimal 'change to As String if text product     Dim result As Decimal = 0 'change to As String if text product     Dim P04_Learners As Decimal = products.1819_Additional_Funding.P04_Learner_Numbers     Dim P03_Rate As Decimal = products.1819_Additional_Funding.P03_Maths_Top_Up_Rate     result = P03_Rate * P04_learners     Return result End Function",
            };

            IEnumerable <CalculationVersion> calculationVersion = new List <CalculationVersion>()
            {
                calcsVersion1,
                calcsVersion2,
                calcsVersion3
            };

            calcsClient
            .GetAllVersionsByCalculationId(calculationId)
            .Returns(new ApiResponse <IEnumerable <CalculationVersion> >(System.Net.HttpStatusCode.OK, calculationVersion));

            ComparePageModel comparePageModel = new ComparePageModel(specsClient, calcsClient, mapper);

            // Act
            IActionResult result = await comparePageModel.OnGet(calculationId);

            // Assert
            result.Should().NotBeNull();

            comparePageModel.Calculation.Should().NotBeNull();

            comparePageModel.Calculation.Description.Should().Be(specCalculation.Description);

            comparePageModel.Calculation.Name.Should().Be(expectedCalculation.Name);

            comparePageModel.Calculations.Select(f => f.Version).Should().BeInDescendingOrder();

            comparePageModel.Calculations.Should().HaveCount(3);

            ViewModels.Calculations.CalculationVersionViewModel firstCalculation = comparePageModel.Calculations.First();

            firstCalculation.Version.Should().Be(calcsVersion3.Version);
        }
        public async Task OnGet_WhenCalculationExistsThenCalculationReturned()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();
            IMapper mapper = MappingHelper.CreateFrontEndMapper();

            const string calculationId     = "5";
            const string specificationId   = "specId";
            const string specificationName = "Spec Name";

            Calculation calcsCalculation = new Calculation()
            {
                Id = calculationId,
                CalculationSpecification = new Reference(calculationId, "Test Calculation Specification"),
                SpecificationId          = specificationId,
                SourceCode = "Test Source Code"
            };

            Clients.SpecsClient.Models.CalculationCurrentVersion specsCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id          = calculationId,
                Name        = "Specs Calculation",
                Description = "Spec Description",
            };

            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Calculation>(System.Net.HttpStatusCode.OK, calcsCalculation));

            specsClient
            .GetCalculationById(calcsCalculation.SpecificationId, calculationId)
            .Returns(new ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.OK, specsCalculation));

            Clients.SpecsClient.Models.SpecificationSummary specificationSummary = new Clients.SpecsClient.Models.SpecificationSummary()
            {
                Id   = specificationId,
                Name = specificationName
            };

            specsClient
            .GetSpecificationSummary(Arg.Is(specificationId))
            .Returns(new ApiResponse <Clients.SpecsClient.Models.SpecificationSummary>(System.Net.HttpStatusCode.OK, specificationSummary));

            EditCalculationPageModel pageModel = CreatePageModel(specsClient: specsClient, calcsClient: calcsClient, mapper: mapper);

            // Act
            IActionResult result = await pageModel.OnGet(calculationId);

            // Assert
            result.Should().NotBeNull();
            result.Should().BeOfType <PageResult>();

            pageModel.Calculation.Should().NotBeNull();
            pageModel.Calculation.Name.Should().Be(calcsCalculation.Name);
            pageModel.Calculation.Description.Should().Be(specsCalculation.Description);
            pageModel.SpecificationId.Should().Be(calcsCalculation.SpecificationId);
            pageModel.EditModel.SourceCode.Should().Be(calcsCalculation.SourceCode);
            pageModel.SpecificationName.Should().Be(specificationName);

            await calcsClient
            .Received(1)
            .GetCalculationById(Arg.Is(calculationId));

            await specsClient
            .Received(1)
            .GetSpecificationSummary(Arg.Is(specificationId));

            await specsClient
            .Received(1)
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId));
        }
Esempio n. 13
0
        public async Task EditCalculationPageModel_OnGetAsync_WhenCalculationFound_ThenEditFormIsDisplayed()
        {
            // Arrange
            const string specificationId = "spec1";
            const string calculationId   = "calculationId";

            CalculationCurrentVersion calculation = new CalculationCurrentVersion()
            {
                Id              = calculationId,
                Name            = "Calculation Name",
                AllocationLine  = new Reference("al1", "Allocation Line"),
                CalculationType = CalculationSpecificationType.Funding,
                Description     = "Calculation Description",
                IsPublic        = false,
                PolicyId        = "policyId",
                PolicyName      = "Policy Name"
            };

            List <CalculationCurrentVersion> baselineCalculations = new List <CalculationCurrentVersion>();

            baselineCalculations.Add(new CalculationCurrentVersion()
            {
                AllocationLine = new Reference("AL1", "Allocation Line 1"),
            });

            ApiResponse <IEnumerable <CalculationCurrentVersion> > baselineCalculationsResponse = new ApiResponse <IEnumerable <CalculationCurrentVersion> >(HttpStatusCode.OK, baselineCalculations);

            Specification specification = CreateSpecification(specificationId);

            ISpecsApiClient specsClient = CreateSpecsClient();

            specsClient
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId))
            .Returns(new ApiResponse <CalculationCurrentVersion>(HttpStatusCode.OK, calculation));

            specsClient
            .GetSpecification(Arg.Is(specificationId))
            .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, specification));

            specsClient
            .GetBaselineCalculationsBySpecificationId(Arg.Is(specificationId))
            .Returns(baselineCalculationsResponse);

            EditCalculationPageModel pageModel = CreatePageModel(specsClient);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId, calculationId);

            // Assert
            result
            .Should()
            .BeOfType <PageResult>()
            .Which
            .Should()
            .NotBeNull();

            pageModel
            .EditCalculationViewModel
            .Should()
            .BeEquivalentTo <EditCalculationViewModel>(new EditCalculationViewModel()
            {
                Name             = "Calculation Name",
                AllocationLineId = "al1",
                CalculationType  = "Funding",
                Description      = "Calculation Description",
                IsPublic         = false,
                PolicyId         = "policyId",
            });

            pageModel
            .Specification
            .Should()
            .BeEquivalentTo(new SpecificationViewModel()
            {
                Id             = specificationId,
                Name           = "Specification Name",
                FundingStreams = new List <ReferenceViewModel>()
                {
                    new ReferenceViewModel("fsId", "Funding Stream 1"),
                    new ReferenceViewModel("fs2Id", "Funding Stream 2"),
                },
            },
                            c => c.Excluding(m => m.Policies));

            pageModel
            .Policies
            .Should()
            .BeEquivalentTo(new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Policy 1",
                    Value    = "p1",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Policies",
                        Disabled = false,
                    },
                },
                new SelectListItem()
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Sub Policy 1",
                    Value    = "sub1",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Subpolicies",
                        Disabled = false,
                    },
                },
                new SelectListItem()
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Sub Policy 2",
                    Value    = "sub2",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Subpolicies",
                        Disabled = false,
                    },
                },
                new SelectListItem
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Policy 2",
                    Value    = "p2",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Policies",
                        Disabled = false,
                    },
                },
                new SelectListItem
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Policy 3",
                    Value    = "p3",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Policies",
                        Disabled = false,
                    },
                },
                new SelectListItem()
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Sub Policy 3",
                    Value    = "sub3",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Subpolicies",
                        Disabled = false,
                    },
                },
                new SelectListItem
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Policy 4",
                    Value    = "p4",
                    Group    = new SelectListGroup()
                    {
                        Name     = "Policies",
                        Disabled = false,
                    },
                }
            });

            pageModel
            .AllocationLines
            .Should()
            .BeEquivalentTo(new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Disabled = false,
                    Selected = true,
                    Text     = "Funding Stream - Allocation Line 1",
                    Value    = "al1",
                },
                new SelectListItem
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Funding Stream - Allocation Line 2",
                    Value    = "al2",
                },
                new SelectListItem
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Funding Stream 2 - Allocation Line 1",
                    Value    = "al3",
                },
                new SelectListItem
                {
                    Disabled = false,
                    Selected = false,
                    Text     = "Funding Stream 2 - Allocation Line 2",
                    Value    = "al4",
                }
            });

            pageModel
            .HideAllocationLinesForBaselinesJson
            .Should()
            .Be("[\"AL1\"]");

            pageModel
            .IsAuthorizedToEdit
            .Should().BeTrue();
        }
Esempio n. 14
0
        public async Task <IActionResult> OnGet(IEnumerable <int> versions, string calculationId)
        {
            if (string.IsNullOrWhiteSpace(calculationId))
            {
                return(new BadRequestObjectResult(ErrorMessages.CalculationIdNullOrEmpty));
            }

            Guard.ArgumentNotNull(versions, nameof(versions));
            if (versions.Count() != 2)
            {
                return(new BadRequestObjectResult("Two versions not requested"));
            }

            ApiResponse <Calculation> calculationResponse = await _calcClient.GetCalculationById(calculationId);

            if (calculationResponse == null || calculationResponse.StatusCode == HttpStatusCode.NotFound)
            {
                return(new NotFoundObjectResult(ErrorMessages.CalculationNotFoundInCalcsService));
            }

            Calculation calculation = calculationResponse.Content;

            CalculationName       = calculation.Name;
            CalculationPeriodName = calculation.FundingPeriodName;
            CalculationId         = calculation.Id;

            ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion> specCalculation = await _specsClient.GetCalculationById(calculation.SpecificationId, calculation.CalculationSpecification.Id);

            if (specCalculation == null || specCalculation.StatusCode == HttpStatusCode.NotFound)
            {
                return(new NotFoundObjectResult(ErrorMessages.CalculationNotFoundInSpecsService));
            }

            CalculationDescription = specCalculation.Content.Description;

            ApiResponse <IEnumerable <CalculationVersion> > calculationVersionsResponse = await _calcClient.GetMultipleVersionsByCalculationId(versions, calculationId);

            if (calculationVersionsResponse == null || calculationVersionsResponse.StatusCode != HttpStatusCode.OK)
            {
                throw new InvalidOperationException($"Unable to retreive selected versions of calculations. Status Code = {calculationVersionsResponse?.StatusCode}");
            }

            if (calculationVersionsResponse.StatusCode == HttpStatusCode.OK)
            {
                IEnumerable <CalculationVersion> calculationVersions = calculationVersionsResponse.Content;

                if (calculationVersions.IsNullOrEmpty())
                {
                    throw new InvalidOperationException($"Unable to retrieve calculationVersion model from the response. Calculation version value = {calculationVersions.ToString()}");
                }
                else
                {
                    if (calculationVersions.Count() < 2)
                    {
                        throw new InvalidOperationException($"There are less than two previous versions available. Calculation version count ={calculationVersions.Count()}");
                    }

                    List <CalculationVersion> calculationVersionsList = calculationVersions.OrderBy(c => c.Version).ToList();

                    LeftCalcualationDiffModel = _mapper.Map <CalculationVersionViewModel>(calculationVersionsList[0]);
                    RightCalculationDiffModel = _mapper.Map <CalculationVersionViewModel>(calculationVersionsList[1]);
                }
            }

            return(Page());
        }
Esempio n. 15
0
        public async Task EditCalculationPageModel_OnGetAsync_WhenUserDoesNotHaveEditSpecificationPermission_ThenReturnOkWithAuthorizedToEditFlagSetToFalse()
        {
            // Arrange
            const string specificationId = "spec1";
            const string calculationId   = "calculationId";

            CalculationCurrentVersion calculation = new CalculationCurrentVersion()
            {
                Id              = calculationId,
                Name            = "Calculation Name",
                AllocationLine  = new Reference("al1", "Allocation Line"),
                CalculationType = CalculationSpecificationType.Funding,
                Description     = "Calculation Description",
                IsPublic        = false,
                PolicyId        = "policyId",
                PolicyName      = "Policy Name"
            };

            Specification specification = CreateSpecification(specificationId);

            ISpecsApiClient specsClient = CreateSpecsClient();

            specsClient
            .GetCalculationById(Arg.Is(specificationId), Arg.Is(calculationId))
            .Returns(new ApiResponse <CalculationCurrentVersion>(HttpStatusCode.OK, calculation));

            specsClient
            .GetSpecification(Arg.Is(specificationId))
            .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, specification));

            List <FundingStream> fundingStreams = new List <FundingStream>();

            fundingStreams.Add(new FundingStream
            {
                Id = "fs1",
                AllocationLines = new List <AllocationLine>()
                {
                    new AllocationLine()
                    {
                        Id   = "al1",
                        Name = "Allocation Line 1",
                    }
                }
            });

            specsClient
            .GetBaselineCalculationsBySpecificationId(Arg.Is(specification.Id))
            .Returns(new ApiResponse <IEnumerable <CalculationCurrentVersion> >(HttpStatusCode.OK, Enumerable.Empty <CalculationCurrentVersion>()));

            ApiResponse <IEnumerable <FundingStream> > fundingStreamResponse = new ApiResponse <IEnumerable <FundingStream> >(HttpStatusCode.OK, fundingStreams);

            specsClient
            .GetFundingStreamsForSpecification(Arg.Is(specification.Id))
            .Returns(fundingStreamResponse);


            IAuthorizationHelper authorizationHelper = Substitute.For <IAuthorizationHelper>();

            authorizationHelper
            .DoesUserHavePermission(Arg.Any <ClaimsPrincipal>(), Arg.Any <ISpecificationAuthorizationEntity>(), Arg.Is(SpecificationActionTypes.CanEditSpecification))
            .Returns(false);

            EditCalculationPageModel pageModel = CreatePageModel(specsClient, authorizationHelper: authorizationHelper);

            // Act
            IActionResult result = await pageModel.OnGetAsync(specificationId, calculationId);

            // Assert
            result
            .Should()
            .BeOfType <PageResult>()
            .Which
            .Should()
            .NotBeNull();

            pageModel
            .IsAuthorizedToEdit
            .Should()
            .BeFalse();
        }
        public async Task <IActionResult> OnGet(string calculationId)
        {
            if (string.IsNullOrWhiteSpace(calculationId))
            {
                return(new BadRequestObjectResult(ErrorMessages.CalculationIdNullOrEmpty));
            }

            ViewData["GreyBackground"] = ShouldNewEditCalculationPageBeEnabled.ToString();

            ApiResponse <Calculation> calculation = await _calcClient.GetCalculationById(calculationId);

            if (calculation == null || calculation.StatusCode != HttpStatusCode.OK)
            {
                return(new NotFoundObjectResult(ErrorMessages.CalculationNotFoundInCalcsService));
            }

            this.DoesUserHavePermissionToApproveOrEdit = (await _authorizationHelper.DoesUserHavePermission(User, calculation.Content, SpecificationActionTypes.CanEditCalculations)).ToString().ToLowerInvariant();

            ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion> specCalculation = await _specsClient.GetCalculationById(calculation.Content.SpecificationId, calculation.Content.CalculationSpecification.Id);

            if (specCalculation == null || specCalculation.StatusCode == HttpStatusCode.NotFound)
            {
                return(new NotFoundObjectResult(ErrorMessages.CalculationNotFoundInSpecsService));
            }

            Calculation             = _mapper.Map <CalculationViewModel>(calculation.Content);
            Calculation.Description = specCalculation.Content.Description;
            SpecificationId         = calculation.Content.SpecificationId;
            EditModel = _mapper.Map <CalculationEditViewModel>(calculation.Content);

            ApiResponse <Clients.SpecsClient.Models.SpecificationSummary> specificationResponse = await _specsClient.GetSpecificationSummary(SpecificationId);

            if (specificationResponse != null && specificationResponse.StatusCode == HttpStatusCode.OK)
            {
                SpecificationName = specificationResponse.Content.Name;
            }
            else
            {
                SpecificationName = "Unknown";
            }

            if (ShouldNewEditCalculationPageBeEnabled)
            {
                ApiResponse <bool> hasCalculationResponse = await _resultsApiClient.HasCalculationResults(Calculation.Id);

                if (hasCalculationResponse != null && hasCalculationResponse.StatusCode == HttpStatusCode.OK)
                {
                    CalculationHasResults = hasCalculationResponse.Content;
                }
            }
            return(Page());
        }
Esempio n. 17
0
        public async Task <IActionResult> OnGet(string calculationId)
        {
            if (string.IsNullOrWhiteSpace(calculationId))
            {
                return(new BadRequestObjectResult(ErrorMessages.CalculationIdNullOrEmpty));
            }

            ApiResponse <Calculation> calculationResponse = await _calcClient.GetCalculationById(calculationId);

            if (calculationResponse == null)
            {
                return(new StatusCodeResult(500));
            }

            Calculation calculation = calculationResponse.Content;

            if (calculation == null)
            {
                return(new NotFoundObjectResult(ErrorMessages.CalculationNotFoundInCalcsService));
            }

            ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion> specCalculation = await _specsClient.GetCalculationById(calculation.SpecificationId, calculation.CalculationSpecification.Id);

            if (specCalculation == null || specCalculation.StatusCode == System.Net.HttpStatusCode.NotFound)
            {
                return(new NotFoundObjectResult(ErrorMessages.CalculationNotFoundInSpecsService));
            }

            ApiResponse <IEnumerable <CalculationVersion> > calculationAllVersionsResponse = await _calcClient.GetAllVersionsByCalculationId(calculationId);

            if (calculationAllVersionsResponse == null)
            {
                return(new StatusCodeResult(500));
            }

            List <CalculationVersionViewModel> calculationVersions = new List <CalculationVersionViewModel>();

            foreach (CalculationVersion calculationVersion in calculationAllVersionsResponse.Content.OrderByDescending(c => c.Version, new VersionStringComparer()))
            {
                calculationVersions.Add(_mapper.Map <CalculationVersionViewModel>(calculationVersion));
            }

            Calculations = calculationVersions.AsEnumerable();

            Calculation             = _mapper.Map <CalculationViewModel>(calculation);
            Calculation.Description = specCalculation.Content.Description;

            return(Page());
        }
        public async Task OnGet_WhenCalculationExistdCalculationTypeIsFundingAndShouldNewEditCalculationPageBeEnabledIsTurnedOnAndResultFound_ThenCalculationDisplayTypeIsFundingSetsHasCalculationResultToTrue()
        {
            // Arrange
            ICalculationsApiClient calcsClient = Substitute.For <ICalculationsApiClient>();
            ISpecsApiClient        specsClient = Substitute.For <ISpecsApiClient>();

            IMapper        mapper        = MappingHelper.CreateFrontEndMapper();
            IFeatureToggle featureToggle = CreateFeatureToggle();

            featureToggle
            .IsNewEditCalculationPageEnabled()
            .Returns(true);

            string calculationId = "5";

            Calculation calcsCalculation = new Calculation()
            {
                Id = calculationId,
                CalculationSpecification = new Reference(calculationId, "Test Calculation Specification"),
                SpecificationId          = "54",
                SourceCode      = "Test Source Code",
                CalculationType = Clients.SpecsClient.Models.CalculationSpecificationType.Funding
            };

            Clients.SpecsClient.Models.CalculationCurrentVersion specsCalculation = new Clients.SpecsClient.Models.CalculationCurrentVersion()
            {
                Id          = calculationId,
                Name        = "Specs Calculation",
                Description = "Spec Description",
            };

            calcsClient
            .GetCalculationById(calculationId)
            .Returns(new ApiResponse <Calculation>(System.Net.HttpStatusCode.OK, calcsCalculation));

            specsClient
            .GetCalculationById(calcsCalculation.SpecificationId, calculationId)
            .Returns(new ApiResponse <Clients.SpecsClient.Models.CalculationCurrentVersion>(System.Net.HttpStatusCode.OK, specsCalculation));

            ApiResponse <bool> hasCalcsResponse = new ApiResponse <bool>(HttpStatusCode.OK, true);

            IResultsApiClient resultsApiClient = CreateResultsApiClient();

            resultsApiClient
            .HasCalculationResults(Arg.Is(calcsCalculation.Id))
            .Returns(hasCalcsResponse);

            EditCalculationPageModel pageModel = CreatePageModel(specsClient: specsClient, calcsClient: calcsClient, mapper: mapper, features: featureToggle, resultsApiClient: resultsApiClient);

            // Act
            IActionResult result = await pageModel.OnGet(calculationId);

            // Assert
            result.Should().NotBeNull();
            result.Should().BeOfType <PageResult>();

            pageModel.Calculation.Should().NotBeNull();
            pageModel.Calculation.Name.Should().Be(calcsCalculation.Name);
            pageModel.Calculation.Description.Should().Be(specsCalculation.Description);
            pageModel.SpecificationId.Should().Be(calcsCalculation.SpecificationId);
            pageModel.EditModel.SourceCode.Should().Be(calcsCalculation.SourceCode);
            pageModel.Calculation.CalculationType.Should().Be(CalculationSpecificationTypeViewModel.Funding);
            pageModel.CalculationHasResults.Should().BeTrue();

            string shouldShowGreyBackground = pageModel.ViewData["GreyBackground"].ToString();

            shouldShowGreyBackground
            .Should()
            .Be("True");
        }