public async Task And_Provider_Has_No_Create_Permission_Then_NoPermissions_View_Is_Shown_With_The_Back_Link_Going_To_Cohort_Details(
            ReservationsRouteModel routeModel,
            SelectReservationViewModel viewModel,
            GetTrustedEmployersResponse employersResponse,
            string cohortDetailsUrl,
            [Frozen] Mock <IExternalUrlHelper> mockUrlHelper,
            [Frozen] Mock <IMediator> mockMediator,
            SelectReservationsController controller)
        {
            var matchedEmployer = employersResponse.Employers.First();

            routeModel.AccountLegalEntityPublicHashedId = matchedEmployer.AccountLegalEntityPublicHashedId;
            viewModel.SelectedReservationId             = Guid.Parse(Guid.Empty.ToString().Replace("0", "9"));
            routeModel.Id = Guid.Empty;
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.IsAny <GetTrustedEmployersQuery>(),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(employersResponse);
            mockMediator.Setup(x => x.Send(It.IsAny <CacheReservationEmployerCommand>(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(new ProviderNotAuthorisedException(viewModel.AccountId, routeModel.UkPrn.Value));
            mockUrlHelper
            .Setup(helper => helper.GenerateCohortDetailsUrl(routeModel.UkPrn, routeModel.EmployerAccountId,
                                                             routeModel.CohortReference, false, It.IsAny <string>()))
            .Returns(cohortDetailsUrl);

            //Act
            var result = await controller.PostSelectReservation(routeModel, viewModel) as ViewResult;

            //Assert
            result.ViewName.Should().Be("NoPermissions");
            result.Model.Should().Be(cohortDetailsUrl);
        }
        public async Task And_GlobalRule_Is_In_Place_Then_The_Funding_Paused_View_Is_Shown_For_Provider(
            ReservationsRouteModel routeModel,
            SelectReservationViewModel viewModel,
            GetTrustedEmployersResponse employersResponse,
            string cohortDetailsUrl,
            [Frozen] Mock <IExternalUrlHelper> mockUrlHelper,
            [Frozen] Mock <IMediator> mockMediator,
            SelectReservationsController controller)
        {
            var matchedEmployer = employersResponse.Employers.First();

            routeModel.AccountLegalEntityPublicHashedId = matchedEmployer.AccountLegalEntityPublicHashedId;
            viewModel.SelectedReservationId             = Guid.Parse(Guid.Empty.ToString().Replace("0", "9"));
            routeModel.Id = Guid.Empty;
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.IsAny <GetTrustedEmployersQuery>(),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(employersResponse);
            mockMediator.Setup(x => x.Send(It.IsAny <CacheReservationEmployerCommand>(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(new GlobalReservationRuleException(viewModel.AccountId));

            //Act
            var result = await controller.PostSelectReservation(routeModel, viewModel) as ViewResult;

            //Assert
            result.ViewName.Should().Be("ProviderFundingPaused");
        }
Exemple #3
0
        public async Task And_Has_Ukprn_Then_Gets_List_Of_Reservations_For_All_Trusted_Employer_Accounts(
            ReservationsRouteModel routeModel,
            GetTrustedEmployersResponse getTrustedEmployersResponse,
            GetReservationsResult getReservationsResult,
            [Frozen] Mock <IMediator> mockMediator,
            ManageReservationsController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getTrustedEmployersResponse);
            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetReservationsQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getReservationsResult);

            await controller.Manage(routeModel);

            mockMediator.Verify(mediator =>
                                mediator.Send(
                                    It.Is <GetTrustedEmployersQuery>(query => query.UkPrn == routeModel.UkPrn),
                                    It.IsAny <CancellationToken>()),
                                Times.Once);

            foreach (var employer in getTrustedEmployersResponse.Employers)
            {
                mockMediator.Verify(mediator =>
                                    mediator.Send(
                                        It.Is <GetReservationsQuery>(query => query.AccountId == employer.AccountId),
                                        It.IsAny <CancellationToken>()),
                                    Times.Once);
            }
        }
        public async Task Add_Apprentice_Url_UkPrn_Will_Be_Populated_From_RouteModel_Reservation(
            ReservationsRouteModel routeModel,
            GetTrustedEmployersResponse getTrustedEmployersResponse,
            Reservation reservation,
            string hashedId,
            string expectedUrl,
            [Frozen] Mock <IEncodingService> mockEncodingService,
            [Frozen] Mock <IMediator> mockMediator,
            [Frozen] Mock <IExternalUrlHelper> mockUrlHelper,
            ManageReservationsController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getTrustedEmployersResponse);

            reservation.ProviderId = null;
            reservation.IsExpired  = false;

            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetReservationsQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new GetReservationsResult
            {
                Reservations = new [] { reservation }
            });

            mockEncodingService
            .Setup(service => service.Encode(It.IsAny <long>(), EncodingType.PublicAccountLegalEntityId))
            .Returns(hashedId);

            mockUrlHelper.Setup(h => h.GenerateAddApprenticeUrl(
                                    reservation.Id,
                                    hashedId,
                                    reservation.Course.Id,
                                    routeModel.UkPrn,
                                    reservation.StartDate,
                                    routeModel.CohortReference,
                                    routeModel.EmployerAccountId,
                                    false,
                                    "",
                                    ""))
            .Returns(expectedUrl);

            var result = await controller.EmployerManage(routeModel) as ViewResult;

            var viewModel = result?.Model as ManageViewModel;

            viewModel.Should().NotBeNull();

            Assert.IsTrue(viewModel.Reservations.All(c => c.ApprenticeUrl.Equals(expectedUrl)));
        }
        public async Task And_Has_UkPrn_And_New_Reservation_Then_Redirects_To_ProviderApprenticeshipTraining_And_The_Cached_Reservation_Is_Created(
            ReservationsRouteModel routeModel,
            SelectReservationViewModel viewModel,
            GetTrustedEmployersResponse employersResponse,
            [Frozen] Mock <IMediator> mockMediator,
            SelectReservationsController controller)
        {
            var matchedEmployer = employersResponse.Employers.First();

            routeModel.AccountLegalEntityPublicHashedId = matchedEmployer.AccountLegalEntityPublicHashedId;
            viewModel.SelectedReservationId             = Guid.Parse(Guid.Empty.ToString().Replace("0", "9"));
            routeModel.Id = Guid.Empty;

            mockMediator.Setup(m =>
                               m.Send(It.IsAny <GetProviderCacheReservationCommandQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new GetProviderCacheReservationCommandResponse
            {
                Command = new CacheReservationEmployerCommand
                {
                    Id        = Guid.NewGuid(),
                    AccountId = matchedEmployer.AccountId,
                    AccountLegalEntityPublicHashedId = matchedEmployer.AccountLegalEntityPublicHashedId,
                    AccountLegalEntityId             = matchedEmployer.AccountLegalEntityId,
                    AccountLegalEntityName           = matchedEmployer.AccountLegalEntityName,
                    AccountName = matchedEmployer.AccountName,
                    CohortRef   = viewModel.CohortReference,
                    UkPrn       = routeModel.UkPrn.Value
                }
            });


            var result = await controller.PostSelectReservation(routeModel, viewModel) as RedirectToRouteResult;

            result?.RouteName.Should().NotBeNull();
            result.RouteName.Should().Be(RouteNames.ProviderApprenticeshipTrainingRuleCheck);
            result.RouteValues["ukPrn"].Should().Be(routeModel.UkPrn);
            result.RouteValues["id"].Should().NotBe(Guid.Empty);
            mockMediator.Verify(x =>
                                x.Send(It.Is <CacheReservationEmployerCommand>(
                                           c =>
                                           c.CohortRef.Equals(viewModel.CohortReference) &&
                                           c.AccountId.Equals(matchedEmployer.AccountId) &&
                                           c.AccountLegalEntityName.Equals(matchedEmployer.AccountLegalEntityName) &&
                                           c.AccountLegalEntityPublicHashedId.Equals(matchedEmployer.AccountLegalEntityPublicHashedId) &&
                                           c.AccountName.Equals(matchedEmployer.AccountName) &&
                                           c.UkPrn.Equals(routeModel.UkPrn) &&
                                           !c.Id.Equals(Guid.Empty) &&
                                           c.AccountLegalEntityId.Equals(matchedEmployer.AccountLegalEntityId))
                                       , It.IsAny <CancellationToken>()), Times.Once);
        }
Exemple #6
0
        public async Task And_Has_Ukprn_Then_Returns_List_Of_Reservations_For_All_Trusted_Employer_Accounts(
            [Frozen] ReservationsRouteModel routeModel,
            GetTrustedEmployersResponse getTrustedEmployersResponse,
            [ReservationsFromThisProvider] GetReservationsResult getReservationsResult1,
            [ReservationsFromThisProvider] GetReservationsResult getReservationsResult2,
            [ReservationsFromThisProvider] GetReservationsResult getReservationsResult3,
            string hashedId,
            string homeLink,
            [Frozen] ReservationsWebConfiguration config,
            [Frozen] Mock <IExternalUrlHelper> externalUrlHelper,
            [Frozen] Mock <IEncodingService> mockEncodingService,
            [Frozen] Mock <IMediator> mockMediator,
            ManageReservationsController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getTrustedEmployersResponse);
            mockMediator
            .SetupSequence(mediator =>
                           mediator.Send(It.IsAny <GetReservationsQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getReservationsResult1)
            .ReturnsAsync(getReservationsResult2)
            .ReturnsAsync(getReservationsResult3);
            mockEncodingService
            .Setup(service => service.Encode(It.IsAny <long>(), EncodingType.PublicAccountLegalEntityId))
            .Returns(hashedId);
            externalUrlHelper
            .Setup(x => x.GenerateDashboardUrl(routeModel.EmployerAccountId)).Returns(homeLink);

            var expectedReservations = new List <ReservationViewModel>();

            expectedReservations.AddRange(getReservationsResult1.Reservations.Select(reservation =>
                                                                                     new ReservationViewModel(reservation, config.ApprenticeUrl, routeModel.UkPrn)));
            expectedReservations.AddRange(getReservationsResult2.Reservations.Select(reservation =>
                                                                                     new ReservationViewModel(reservation, config.ApprenticeUrl, routeModel.UkPrn)));
            expectedReservations.AddRange(getReservationsResult3.Reservations.Select(reservation =>
                                                                                     new ReservationViewModel(reservation, config.ApprenticeUrl, routeModel.UkPrn)));

            var result = await controller.Manage(routeModel) as ViewResult;

            result.Should().NotBeNull();
            result.ViewName.Should().Be(ViewNames.ProviderManage);
            var viewModel = result.Model as ManageViewModel;

            viewModel.Should().NotBeNull();
            viewModel.BackLink.Should().Be(homeLink);
            viewModel.Reservations.Should().BeEquivalentTo(expectedReservations,
                                                           options => options.ExcludingMissingMembers().ExcludingFields().Excluding(c => c.ApprenticeUrl));
        }
        public async Task And_Provider_Is_Not_Trusted_For_Account_Legal_Entity_Then_Mark_As_Not_Authorised(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IMediator> mediator,
            [Frozen] GetTrustedEmployersResponse response,
            CacheReservationEmployerCommandValidator validator)
        {
            SetupAccountLegalEntityAsNonLevy(mediator);
            command.IsEmptyCohortFromSelect = false;
            mediator.Setup(m => m.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(response);

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
            result.FailedAuthorisationValidation.Should().BeTrue();
        }
        public async Task And_Provider_Is_Supplied_For_Empty_Cohort_Then_It_Is_Not_Validated_For_Account_Legal_Entity(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IMediator> mediator,
            [Frozen] GetTrustedEmployersResponse response,
            CacheReservationEmployerCommandValidator validator)
        {
            SetupAccountLegalEntityAsEoi(mediator);
            command.IsEmptyCohortFromSelect = true;
            mediator.Setup(m => m.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(response);

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
            result.FailedAuthorisationValidation.Should().BeFalse();
            mediator.Verify(x => x.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()), Times.Never);
        }
Exemple #9
0
        public async Task And_Has_Ukprn_And_Reservation_From_Different_Provider_Then_Not_Deletable(
            [Frozen] ReservationsRouteModel routeModel,
            GetTrustedEmployersResponse getTrustedEmployersResponse,
            GetReservationsResult getReservationResultDifferentProvider,
            [ReservationsFromThisProvider] GetReservationsResult getReservationsResult1,
            [ReservationsFromThisProvider] GetReservationsResult getReservationsResult2,
            string hashedId,
            [Frozen] Mock <IEncodingService> mockEncodingService,
            [Frozen] Mock <IMediator> mockMediator,
            ManageReservationsController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetTrustedEmployersQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getTrustedEmployersResponse);
            mockMediator
            .SetupSequence(mediator =>
                           mediator.Send(It.IsAny <GetReservationsQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getReservationsResult1)
            .ReturnsAsync(getReservationsResult2)
            .ReturnsAsync(getReservationResultDifferentProvider);
            mockEncodingService
            .Setup(service => service.Encode(It.IsAny <long>(), EncodingType.PublicAccountLegalEntityId))
            .Returns(hashedId);

            var result = await controller.Manage(routeModel) as ViewResult;

            var viewModel = result.Model as ManageViewModel;
            var nonDeletableReservationIds = getReservationResultDifferentProvider.Reservations
                                             .Select(reservation => reservation.Id);

            viewModel.Reservations
            .Where(model => nonDeletableReservationIds.Contains(model.Id))
            .Select(model => model.CanProviderDeleteReservation)
            .Should().AllBeEquivalentTo(false);
            viewModel.Reservations
            .Where(model => !nonDeletableReservationIds.Contains(model.Id))
            .Select(model => model.CanProviderDeleteReservation)
            .Should().AllBeEquivalentTo(true);
        }
        public void Arrange()
        {
            _mediator  = new Mock <IMediator>();
            _validator = new Mock <IValidator <GetProviderCacheReservationCommandQuery> >();
            _query     = new GetProviderCacheReservationCommandQuery
            {
                UkPrn = 12,
                AccountLegalEntityPublicHashedId = "ABC123",
                CohortRef = "1234"
            };

            _handler = new GetProviderCacheReservationCommandQueryHandler(_mediator.Object, _validator.Object);

            _expectedEmployer = new AccountLegalEntity
            {
                AccountId = 1,
                AccountLegalEntityPublicHashedId = _query.AccountLegalEntityPublicHashedId,
                AccountLegalEntityName           = "Test Employer",
                AccountLegalEntityId             = 123,
                AccountName           = "Test Account",
                AccountPublicHashedId = "DEF123"
            };

            _expectedAccountLegalEntity = new AccountLegalEntity
            {
                AccountId = 1,
                AccountLegalEntityPublicHashedId = _query.AccountLegalEntityPublicHashedId,
                AccountLegalEntityName           = "Test Employer",
                AccountLegalEntityId             = 123,
                LegalEntityId    = 456,
                ReservationLimit = 3
            };

            _expectedCohort = new Cohort()
            {
                CohortId             = 123,
                AccountLegalEntityId = _expectedAccountLegalEntity.AccountLegalEntityId,
                LegalEntityName      = _expectedAccountLegalEntity.AccountLegalEntityName,
                ProviderName         = "Test Provider",
                IsFundedByTransfer   = false,
                WithParty            = CohortParty.Provider
            };

            _getTrustedEmployersResponse = new GetTrustedEmployersResponse
            {
                Employers = new [] { _expectedEmployer }
            };

            _getAccountLegalEntityResponse = new GetAccountLegalEntityResult
            {
                LegalEntity = _expectedAccountLegalEntity
            };

            _mediator.Setup(mediator => mediator.Send(
                                It.IsAny <GetTrustedEmployersQuery>(),
                                It.IsAny <CancellationToken>()))
            .ReturnsAsync(_getTrustedEmployersResponse);

            _mediator.Setup(mediator => mediator.Send(
                                It.IsAny <GetAccountLegalEntityQuery>(),
                                It.IsAny <CancellationToken>()))
            .ReturnsAsync(_getAccountLegalEntityResponse);

            _mediator.Setup(m => m.Send(
                                It.IsAny <GetCohortQuery>(),
                                It.IsAny <CancellationToken>()))
            .ReturnsAsync(new GetCohortResponse {
                Cohort = _expectedCohort
            });

            _validator.Setup(v => v.ValidateAsync(_query))
            .ReturnsAsync(new ValidationResult {
                ValidationDictionary = new Dictionary <string, string>()
            });
        }