public async Task ThenMatchingPaymentsShouldBeReturned(
            [Frozen] Mock <IPaymentRepository> repository,
            [Frozen] Mock <IMapper> autoMapper,
            Application.Payments.GetPaymentsQuery.GetPaymentsQueryHandler sut,
            GetPaymentsQueryRequest request, PageOfResults <PaymentEntity> paymentEntities, PageOfResults <Payment> expectedResults
            )
        {
            // Arrange
            request.Period = new Data.CollectionPeriod
            {
                Id           = "1920-R12",
                AcademicYear = 1920,
                Period       = 12
            };

            repository.Setup(x => x.GetPayments(request.PageNumber, request.PageSize, request.EmployerAccountId, 1920,
                                                12, request.Ukprn)).ReturnsAsync(paymentEntities);

            autoMapper.Setup(x => x.Map <PageOfResults <Payment> >(paymentEntities)).Returns(expectedResults);

            // Act
            var actualResult = await sut.Handle(request).ConfigureAwait(false);

            // Assert
            actualResult.IsValid.Should().BeTrue();
            actualResult.Result.Should().BeSameAs(expectedResults);
        }
Ejemplo n.º 2
0
        public async Task AndThereAreMultiplePagesOfInformationThenTheTransfersAreCreated()
        {
            var transfersPage1 = new PageOfResults <AccountTransfer>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 3,
                Items = new[] { new AccountTransfer(), new AccountTransfer(), new AccountTransfer() }
            };
            var transfersPage2 = new PageOfResults <AccountTransfer>
            {
                PageNumber         = 2,
                TotalNumberOfPages = 3,
                Items = new[] { new AccountTransfer(), new AccountTransfer() }
            };
            var transfersPage3 = new PageOfResults <AccountTransfer>
            {
                PageNumber         = 3,
                TotalNumberOfPages = 3,
                Items = new[] { new AccountTransfer(), new AccountTransfer(), new AccountTransfer() }
            };

            _providerEventService.Setup(x => x.GetTransfers(_command.PeriodEndId, 1)).ReturnsAsync(transfersPage1);
            _providerEventService.Setup(x => x.GetTransfers(_command.PeriodEndId, 2)).ReturnsAsync(transfersPage2);
            _providerEventService.Setup(x => x.GetTransfers(_command.PeriodEndId, 3)).ReturnsAsync(transfersPage3);

            await _handler.Handle(_command);

            _transferRepository.Verify(x => x.SaveTransfers(It.IsAny <IEnumerable <AccountTransfer> >()), Times.Exactly(3));

            _transferRepository.Verify(x => x.SaveTransfers(transfersPage1.Items), Times.Once);
            _transferRepository.Verify(x => x.SaveTransfers(transfersPage2.Items), Times.Once);
            _transferRepository.Verify(x => x.SaveTransfers(transfersPage3.Items), Times.Once);
        }
Ejemplo n.º 3
0
        public async Task ThenItShouldReturnTransfersFromRepo()
        {
            // Arrange
            var request  = new GetTransfersQueryRequest();
            var response = new GetTransfersQueryResponse
            {
                IsValid = true,
                Result  = new PageOfResults <AccountTransfer>
                {
                    Items = new AccountTransfer[0]
                }
            };

            var entities = new PageOfResults <TransferEntity>();

            _mockTransferRepository.Setup(x => x.GetTransfers(request.PageNumber, request.PageSize, request.SenderAccountId, null, null)).ReturnsAsync(entities);
            _mockMapper.Setup(x => x.Map <PageOfResults <AccountTransfer> >(entities)).Returns(response.Result);

            // Act
            var actualResult = await _getTransfersQueryHandler.Handle(request).ConfigureAwait(false);

            // Assert
            Assert.IsTrue(actualResult.IsValid);
            Assert.AreSame(response.Result, actualResult.Result);
        }
Ejemplo n.º 4
0
        private void SetupSubmissionEventsTwoCallsSecondCallReturnsEmptyPage(long sinceEventId)
        {
            var submissionEventsPageCall1 = new PageOfResults <SubmissionEvent>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 2,
                Items = new[] { new SubmissionEvent {
                                    Id = sinceEventId + 1, ApprenticeshipId = apprenticeshipId1, EPAOrgId = EpaOrgId1
                                },
                                new SubmissionEvent {
                                    Id = sinceEventId + 2, ApprenticeshipId = apprenticeshipId2, EPAOrgId = EpaOrgId2
                                } }
            };

            _paymentEvents.Setup(x => x.GetSubmissionEvents(sinceEventId, null, 0L, 1)).ReturnsAsync(submissionEventsPageCall1);

            var submissionEventsPageCall2 = new PageOfResults <SubmissionEvent>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 0,
                Items = new SubmissionEvent[0]
            };

            _paymentEvents.Setup(x => x.GetSubmissionEvents(sinceEventId + 2, null, 0L, 1)).ReturnsAsync(submissionEventsPageCall2);
        }
Ejemplo n.º 5
0
        private List <AccountTransfer> ConfigureTransfers(string periodEnd, int numberOfTransfers, int repeatPages = 1, bool skipPayments = false)
        {
            var allTransfers = new List <AccountTransfer>();

            for (var k = 1; k <= repeatPages; k++)
            {
                var transfers = new List <AccountTransfer>();
                for (var i = 1; i <= numberOfTransfers; i++)
                {
                    transfers.Add(new TransferBuilder().WithPeriod(periodEnd).Build());
                }

                var transfersResult = new PageOfResults <AccountTransfer>
                {
                    Items              = transfers.ToArray(),
                    PageNumber         = k,
                    TotalNumberOfPages = repeatPages
                };

                EventsApi.SetupGet($"api/transfers?page={k}&periodId={periodEnd}", transfersResult);
                allTransfers.AddRange(transfers);
            }

            if (!skipPayments)
            {
                EventsApi.SetupGet($"api/payments?page=1&periodId={periodEnd}&employerAccountId={null}&ukprn={null}", new PageOfResults <Payment> {
                    PageNumber = 0, TotalNumberOfPages = 0
                });
            }

            return(allTransfers);
        }
        /// <summary>
        /// Projects each element of this PaginatedResults into a new form.
        /// </summary>
        public PaginatedResults <TTo> Project <TTo>(Func <T, TTo> mapper)
        {
            if (mapper == null)
            {
                throw new ArgumentNullException(nameof(mapper));
            }

            return(new PaginatedResults <TTo>(PageOfResults.Select(mapper).ToArray(), (int)TotalResults, Pagination));
        }
Ejemplo n.º 7
0
        public async Task TestMethod1()
        {
            const string apiBaseUrl  = "https://beta-payments.apprenticeships.sfa.bis.gov.uk/";
            string       clientToken = File.ReadAllText(@"C:\tokens\PaymentsEventsApi_PROD.txt");

            //use https://stackoverflow.com/questions/10667012/getting-downloads-folder-in-c?
            const string outputPath = @"C:\Users\phil\Downloads\";

            var config = new PaymentsEventsApiConfiguration {
                ApiBaseUrl = apiBaseUrl, ClientToken = clientToken
            };

            var client = new PaymentsEventsApiClient(config);

            //todo: could provide employeraccountid & prn to reduce volumes!

            //var sinceEventId = 1747413 - 1;

            //try azure db with and withoug mars
            //do web sites write to datalockstatus?
            //point to live? nah, db set up pain
            //recheck logs for exceptions - search by apprenticeshipid? when error occured?

            //could bring in SelectManyAsync
            //var datalockEvents = Data.SinceEventIds().SelectMany(async since => await client.GetDataLockEvents(since));

            var pageStartIds = Data.SinceEventIds(Data.Ids);

            Console.WriteLine("Page start ids:");
            Console.WriteLine(string.Join(",", pageStartIds.Select(i => i.ToString())));

            List <DataLockEvent> datalockEvents = new List <DataLockEvent>();

            foreach (var since in pageStartIds)
            {
                //                var page = await Retries.CallWithRetryAsync<PageOfResults<DataLockEvent>>(c => client.GetDataLockEvents(since));
                Console.WriteLine($"Fetching page @ {since}");
                var page = await Retries.CallWithRetryAsync(() => client.GetDataLockEvents(since));

                datalockEvents = datalockEvents.Concat(page.Items).Where(id => Data.Ids.Contains(id.Id)).ToList();
            }

            var path = outputPath + "1_payment_event.json";

            Console.WriteLine($"Generating {path}");

            var newPage = new PageOfResults <DataLockEvent> {
                Items = datalockEvents.ToArray(), PageNumber = 1, TotalNumberOfPages = 1
            };

            var pageJson = JsonConvert.SerializeObject(newPage);

            File.WriteAllText(path, pageJson);
        }
Ejemplo n.º 8
0
        public void PageOfResultsWithItemsIsValidList()
        {
            var pg = new PageOfResults <int>(new int[] { 1, 2, 3, 4, 5 }.ToList(), 1, 10);

            Assert.AreEqual(5, pg.Count, "count of page items not 5");
            Assert.AreEqual(5, pg.PageItemCount, "PageItemCount not 5");
            Assert.AreEqual(1, pg.Stats.CurrPageNumber, "stats page is not 1");
            Assert.AreEqual(10, pg.Stats.NumPages, "stats page count is not 10");
            Assert.IsFalse(pg.Stats.HasPrevPage, "stats has prev is true");
            Assert.IsTrue(pg.Stats.HasNextPage, "stats has next is false");
            Assert.IsTrue(pg.Stats.HasMultiplePages, "stats has multiple is false");
        }
Ejemplo n.º 9
0
 private async Task SaveTransfers(PageOfResults <AccountTransfer> transfers, string periodEndId)
 {
     try
     {
         await _transferRepository.SaveTransfers(transfers.Items);
     }
     catch (Exception ex)
     {
         _logger.Error(ex, $"Exception thrown saving Transfers for period end {periodEndId}");
         throw;
     }
 }
 private async Task SavePayments(PageOfResults <Payment> payments, string periodEndId)
 {
     try
     {
         await _paymentRepository.SavePayments(payments.Items);
     }
     catch (Exception ex)
     {
         _logger.Error(ex, $"Exception thrown saving payments for period end {periodEndId}");
         throw;
     }
 }
Ejemplo n.º 11
0
        public async Task ThenThePaymentsAreReturned()
        {
            var period     = "ABC123";
            var pageNumber = 3;

            var expectedResponse = new PageOfResults <Payment>();

            EventsApi.Setup(x => x.GetPayments(period, null, pageNumber, null)).ReturnsAsync(expectedResponse);

            var response = await Service.GetPayments(period, pageNumber);

            response.Should().BeSameAs(expectedResponse);
        }
Ejemplo n.º 12
0
        private void SetupSubmissionEventsPageWithSingleEventWithNullApprenticeshipId(long sinceEventId)
        {
            var submissionEventsPage = new PageOfResults <SubmissionEvent>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new[] { new SubmissionEvent {
                                    Id = sinceEventId + 1, ApprenticeshipId = null, EPAOrgId = EpaOrgId1
                                } }
            };

            _paymentEvents.Setup(x => x.GetSubmissionEvents(sinceEventId, null, 0L, 1)).ReturnsAsync(submissionEventsPage);
        }
Ejemplo n.º 13
0
 private static PageOfResults <DataLockEvent> CreateV2Event(PageOfResults <DataLockEvent> source)
 {
     return(new PageOfResults <DataLockEvent>
     {
         PageNumber = source.PageNumber,
         TotalNumberOfPages = source.TotalNumberOfPages,
         Items = source.Items.Select(e => new DataLockEvent
         {
             Id = e.Id,
             Status = e.Status,
             Errors = new[]
             {
                 new DataLockEventError
                 {
                     ErrorCode = e.Errors[0].ErrorCode,
                     SystemDescription = e.Errors[0].SystemDescription
                 }
             },
             Periods = new[]
             {
                 new DataLockEventPeriod
                 {
                     ApprenticeshipVersion = e.Periods[0].ApprenticeshipVersion,
                     Period = new NamedCalendarPeriod
                     {
                         Id = e.Periods[0].Period.Id,
                         Month = e.Periods[0].Period.Month,
                         Year = e.Periods[0].Period.Year
                     },
                     IsPayable = e.Periods[0].IsPayable
                 }
             },
             Apprenticeships = new[]
             {
                 new DataLockEventApprenticeship
                 {
                     Version = e.Apprenticeships[0].Version,
                     StartDate = e.Apprenticeships[0].StartDate,
                     StandardCode = e.Apprenticeships[0].StandardCode,
                     ProgrammeType = e.Apprenticeships[0].ProgrammeType,
                     FrameworkCode = e.Apprenticeships[0].FrameworkCode,
                     PathwayCode = e.Apprenticeships[0].PathwayCode,
                     NegotiatedPrice = e.Apprenticeships[0].NegotiatedPrice,
                     EffectiveDate = e.Apprenticeships[0].EffectiveDate
                 }
             }
         }).ToArray()
     });
 }
Ejemplo n.º 14
0
        protected PageOfResults <T> PageResults <T>(List <T> entities, int pageNumber, int pageSize) where T : IAmAPageableEntity
        {
            var returnValue = new PageOfResults <T>
            {
                PageNumber         = pageNumber,
                TotalNumberOfPages = 0,
                Items = entities.ToArray(),
            };

            if (entities.Any())
            {
                returnValue.TotalNumberOfPages = NumberOfPages(entities.First().TotalCount, pageSize);
            }
            return(returnValue);
        }
        private void ConfigureDataLockEvents(int sinceEventId, int numberOfDataLockEvents)
        {
            var dataLockEvents = new List <DataLockEvent>();

            for (var i = 1; i <= numberOfDataLockEvents; i++)
            {
                dataLockEvents.Add(new DataLockEventBuilder().WithId(i).WithMultipleErrors(2).Build());
            }
            var dataLockEventsResult = new PageOfResults <DataLockEvent> {
                Items = dataLockEvents.ToArray(), PageNumber = 1, TotalNumberOfPages = 1
            };

            EventsApi.SetupGet($"api/datalock?page=1", dataLockEventsResult);
            EventsApi.SetupGet($"api/datalock?page=1&sinceEventId={sinceEventId}", dataLockEventsResult);
        }
Ejemplo n.º 16
0
        public async Task AndThereIsASinglePageOfInformationThenTheTransfersAreCreated()
        {
            var transfers = new PageOfResults <AccountTransfer>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new[] { new AccountTransfer(), new AccountTransfer(), new AccountTransfer() }
            };

            _providerEventService.Setup(x => x.GetTransfers(_command.PeriodEndId, 1)).ReturnsAsync(transfers);

            await _handler.Handle(_command);

            _transferRepository.Verify(x => x.SaveTransfers(transfers.Items), Times.Once());
        }
Ejemplo n.º 17
0
        public async Task AndThereIsASinglePageOfInformationThenThePaymentsAreCreated()
        {
            var payments = new PageOfResults <Payment>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new[] { new Payment(), new Payment(), new Payment() }
            };

            _providerEventService.Setup(x => x.GetPayments(_command.PeriodEndId, 1)).ReturnsAsync(payments);

            await _handler.Handle(_command);

            _paymentRepository.Verify(x => x.SavePayments(payments.Items), Times.Once());
        }
        protected PageOfResults <T> AddPagingInformation <T>(List <T> entities, int pageNumber, int pageSize, int count)
        {
            var returnValue = new PageOfResults <T>
            {
                PageNumber         = pageNumber,
                TotalNumberOfPages = 0,
                Items = entities.ToArray(),
            };

            if (entities.Any())
            {
                returnValue.TotalNumberOfPages = NumberOfPages(count, pageSize);
            }

            return(returnValue);
        }
Ejemplo n.º 19
0
        private void ConfigurePayments(string periodEnd, int numberOfPayments)
        {
            var payments = new List <Payment>();

            for (var i = 1; i <= numberOfPayments; i++)
            {
                payments.Add(new PaymentBuilder().WithId(periodEnd + i).WithPeriod(periodEnd).Build());
            }
            var paymentsResult = new PageOfResults <Payment> {
                Items = payments.ToArray(), PageNumber = 1, TotalNumberOfPages = 1
            };

            EventsApi.SetupGet($"api/payments?page=1&periodId={periodEnd}&employerAccountId={null}&ukprn={null}", paymentsResult);
            EventsApi.SetupGet($"api/transfers?page=1&periodId={periodEnd}", new PageOfResults <Payment> {
                PageNumber = 0, TotalNumberOfPages = 0
            });
        }
Ejemplo n.º 20
0
        public async Task AndSubmissionEventContainsUnknownApprenticeshipThenValidApprenticeshipsAreStillUpdatedAndInvalidApprenticeshipIsLogged()
        {
            const long sinceEventId = 0L;

            SetupOrganisationSummaries();

            var submissionEventsPage = new PageOfResults <SubmissionEvent>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new[]
                {
                    new SubmissionEvent {
                        Id = sinceEventId + 1, ApprenticeshipId = apprenticeshipId1, EPAOrgId = EpaOrgId1
                    },
                    new SubmissionEvent {
                        Id = sinceEventId + 2, ApprenticeshipId = unknownApprenticeshipId, EPAOrgId = EpaOrgId1
                    },
                    new SubmissionEvent {
                        Id = sinceEventId + 3, ApprenticeshipId = apprenticeshipId2, EPAOrgId = EpaOrgId2
                    }
                }
            };

            _paymentEvents.Setup(x => x.GetSubmissionEvents(sinceEventId, null, 0L, 1)).ReturnsAsync(submissionEventsPage);

            _apprenticeshipRepository.Setup(x => x.UpdateApprenticeshipEpa(unknownApprenticeshipId, EpaOrgId1))
            .Throws <ArgumentOutOfRangeException>();

            // act
            await _addEpaToApprenticeships.Update();

            // assert

            // check valid apprenticeships before and after unknown apprenticeship are updated
            _apprenticeshipRepository.Verify(x => x.UpdateApprenticeshipEpa(apprenticeshipId1, EpaOrgId1), Times.Once());
            _apprenticeshipRepository.Verify(x => x.UpdateApprenticeshipEpa(apprenticeshipId2, EpaOrgId2), Times.Once());

            _log.Verify(x => x.Error(It.IsAny <ArgumentOutOfRangeException>(), It.Is <string>(
                                         message => CheckUnknownApprenticeshipLogMessage(message))), Times.Once);

            _jobProgressRepository.Verify(x => x.Set_AddEpaToApprenticeships_LastSubmissionEventId(sinceEventId + 3), Times.Once);
        }
        internal static PageOfResults <Provider.Events.Api.Types.Payment> GetPayment()
        {
            var por = new PageOfResults <Provider.Events.Api.Types.Payment>();

            por.PageNumber         = 1;
            por.TotalNumberOfPages = 1;
            por.Items = new List <Provider.Events.Api.Types.Payment>
            {
                new Provider.Events.Api.Types.Payment
                {
                    Id = "f97840b3-d3bf-429c-bc3c-8a877f4f26f8",
                    ApprenticeshipId  = 11002,
                    EmployerAccountId = "MJK9XV",
                    CollectionPeriod  = new NamedCalendarPeriod
                    {
                        Id    = "1617-r10",
                        Year  = 2017,
                        Month = 5
                    },
                    EarningDetails = new List <Earning>
                    {
                        new Earning
                        {
                            ActualEndDate      = DateTime.Parse("2017-03-01"),
                            CompletionAmount   = 5000,
                            RequiredPaymentId  = Guid.Parse("f97840b3-d3bf-429c-bc3c-8a877f4f26f8"),
                            CompletionStatus   = 1,
                            MonthlyInstallment = 300,
                            TotalInstallments  = 24,
                            StartDate          = DateTime.Parse("2018-01-01"),
                            PlannedEndDate     = DateTime.Parse("2020-01-01"),
                            EndpointAssessorId = "EOId-1"
                        }
                    },
                    ContractType    = ContractType.ContractWithSfa,
                    FundingSource   = Provider.Events.Api.Types.FundingSource.Levy,
                    TransactionType = TransactionType.Balancing
                }
            }
            .ToArray();

            return(por);
        }
Ejemplo n.º 22
0
        public void AndSavingATransferFailsThenTheExceptionIsLogged()
        {
            var expectedException = new Exception();
            var failingTransfer   = new AccountTransfer {
                TransferId = 1
            };
            var transfers = new PageOfResults <AccountTransfer>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new[] { new AccountTransfer(), failingTransfer, new AccountTransfer() }
            };

            _providerEventService.Setup(x => x.GetTransfers(_command.PeriodEndId, 1)).ReturnsAsync(transfers);
            _transferRepository.Setup(x => x.SaveTransfers(transfers.Items)).Throws(expectedException);

            Assert.ThrowsAsync <Exception>(() => _handler.Handle(_command));

            _logger.Verify(x => x.Error(expectedException, $"Exception thrown saving Transfers for period end {_command.PeriodEndId}"));
        }
Ejemplo n.º 23
0
        public async Task AndSavingAPaymentFailsThenTheExceptionIsLogged()
        {
            var expectedException = new Exception();
            var failingPayment    = new Payment {
                Id = "PayID"
            };
            var payments = new PageOfResults <Payment>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new[] { new Payment(), failingPayment, new Payment() }
            };

            _providerEventService.Setup(x => x.GetPayments(_command.PeriodEndId, 1)).ReturnsAsync(payments);
            _paymentRepository.Setup(x => x.SavePayments(payments.Items)).Throws(expectedException);

            Assert.ThrowsAsync <Exception>(() => _handler.Handle(_command));

            _logger.Verify(x => x.Error(expectedException, $"Exception thrown saving payments for period end {_command.PeriodEndId}"));
        }
        private static string SendPayments(Faker <Payment> paymentFaker, int count = 10)
        {
            var payments = new List <Payment>();

            for (var i = 0; i < count; i++)
            {
                var payment = paymentFaker.Generate();
                payments.Add(payment);
            }


            var page = new PageOfResults <Payment>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = payments.ToArray()
            };

            return(JsonConvert.SerializeObject(page));
        }
Ejemplo n.º 25
0
        public void Arrange()
        {
            _eventService = new Mock <IProviderEventService>();
            _logger       = new Mock <ILog>();

            var dataLock = new DataLockEvent {
                Id = 1
            };
            var _expectedDataLocks = new PageOfResults <DataLockEvent>
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1,
                Items = new DataLockEvent[1] {
                    dataLock
                }
            };


            _eventService.Setup(x => x.GetUnprocessedDataLocks()).ReturnsAsync(_expectedDataLocks);

            _collector = new DataLockEventCollector(_eventService.Object, _logger.Object, new DataConfiguration {
                DataLocksEnabled = true
            });
        }
Ejemplo n.º 26
0
        public void PageOfResultsWithNullItemsIsEmptyList()
        {
            var pg = new PageOfResults <int>(null, 1, 10);

            Assert.AreEqual(0, pg.Count);
        }
Ejemplo n.º 27
0
 public void PageOfResultsWithPageNumMoreThanNumPagesRaisesException()
 {
     var pg = new PageOfResults <int>(null, 11, 10);
 }
Ejemplo n.º 28
0
 public void PageOfResultsWithZeroNumPagesRaisesException()
 {
     var pg = new PageOfResults <int>(null, 1, 0);
 }
Ejemplo n.º 29
0
 public void PageOfResultsWithNegativeNumPagesRaisesException()
 {
     var pg = new PageOfResults <int>(null, 1, -1);
 }
Ejemplo n.º 30
0
 public void PageOfResultsWithZeroPageNumRaisesException()
 {
     var pg = new PageOfResults <int>(null, 0, 10);
 }