public async Task Then_The_GlobalRules_Are_Checked_And_An_Error_Returned_If_Not_Valid(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IMediator> mockMediator,
            [Frozen] Mock <IFundingRulesService> rulesService,
            CacheReservationEmployerCommandValidator validator)
        {
            SetupAccountLegalEntityAsNonLevy(mockMediator);
            rulesService.Setup(x => x.GetFundingRules()).ReturnsAsync(new GetFundingRulesApiResponse
            {
                GlobalRules = new List <GlobalRule>
                {
                    new GlobalRule
                    {
                        Restriction = AccountRestriction.NonLevy,
                        RuleType    = GlobalRuleType.FundingPaused,
                        ActiveFrom  = DateTime.UtcNow.AddMonths(-1)
                    }
                }
            });

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
            result.FailedGlobalRuleValidation.Should().BeTrue();
        }
        public async Task And_NonLevy_And_Is_Valid(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IFundingRulesService> rulesService,
            [Frozen] Mock <IMediator> mockMediator,
            CacheReservationEmployerCommandValidator validator)
        {
            ConfigureRulesServiceWithNoGlobalRules(rulesService);
            SetupAccountLegalEntityAsNonLevy(mockMediator);

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
        }
        public async Task And_All_Properties_Ok_Then_Valid(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IMediator> mockMediator,
            [Frozen] Mock <IFundingRulesService> rulesService,
            CacheReservationEmployerCommandValidator validator)
        {
            ConfigureRulesServiceWithNoGlobalRules(rulesService);
            SetupAccountLegalEntityAsEoi(mockMediator);

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
            result.FailedRuleValidation.Should().BeFalse();
        }
        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_AccountId_Less_Than_One_Then_Invalid(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IFundingRulesService> rulesService,
            CacheReservationEmployerCommandValidator validator)
        {
            ConfigureRulesServiceWithNoGlobalRules(rulesService);
            command.AccountId = default(long);

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeFalse();
            result.ValidationDictionary.Count.Should().Be(1);
            result.ValidationDictionary
            .Should().ContainKey(nameof(CacheReservationEmployerCommand.AccountId))
            .WhichValue.Should().Be($"{nameof(CacheReservationEmployerCommand.AccountId)} has not been supplied");
        }
        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);
        }
        public async Task And_No_Id_Then_Invalid(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IMediator> mockMediator,
            [Frozen] Mock <IFundingRulesService> rulesService,
            CacheReservationEmployerCommandValidator validator)
        {
            SetupAccountLegalEntityAsNonLevy(mockMediator);
            ConfigureRulesServiceWithNoGlobalRules(rulesService);
            command.Id = Guid.Empty;

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeFalse();
            result.ValidationDictionary.Count.Should().Be(1);
            result.ValidationDictionary
            .Should().ContainKey(nameof(CacheReservationEmployerCommand.Id))
            .WhichValue.Should().Be($"{nameof(CacheReservationEmployerCommand.Id)} has not been supplied");
        }
        public async Task And_NonLevy_And_Not_Eoi_Then_Not_Valid(
            CacheReservationEmployerCommand command,
            GetLegalEntitiesResponse getLegalEntitiesResponse,
            [Frozen] Mock <IFundingRulesService> rulesService,
            [Frozen] Mock <IMediator> mockMediator,
            CacheReservationEmployerCommandValidator validator)
        {
            ConfigureRulesServiceWithNoGlobalRules(rulesService);
            foreach (var accountLegalEntity in getLegalEntitiesResponse.AccountLegalEntities)
            {
                accountLegalEntity.IsLevy        = false;
                accountLegalEntity.AgreementType = AgreementType.Levy;
            }
            mockMediator
            .Setup(mediator => mediator.Send(It.IsAny <GetLegalEntitiesQuery>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(getLegalEntitiesResponse);

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
            result.FailedEoiCheck.Should().BeTrue();
        }
        public async Task Then_The_Account_Is_Checked_Against_The_AccountRules_And_An_Error_Returned_If_Not_Valid(
            CacheReservationEmployerCommand command,
            [Frozen] Mock <IMediator> mockMediator,
            [Frozen] Mock <IFundingRulesService> rulesService,
            CacheReservationEmployerCommandValidator validator)
        {
            SetupAccountLegalEntityAsNonLevy(mockMediator);
            rulesService.Setup(x => x.GetAccountFundingRules(command.AccountId)).ReturnsAsync(
                new GetAccountFundingRulesApiResponse
            {
                GlobalRules = new List <GlobalRule> {
                    new GlobalRule
                    {
                        Restriction = AccountRestriction.Account,
                        RuleType    = GlobalRuleType.ReservationLimit
                    }
                }
            });

            var result = await validator.ValidateAsync(command);

            result.IsValid().Should().BeTrue();
            result.FailedRuleValidation.Should().BeTrue();
        }