Пример #1
0
        public async System.Threading.Tasks.Task GetProjectedVacanciesTestAsync(Scenario scenario, int expectedNumberDisplayed)
        {
            var fakeIAVService = A.Fake <IAVService>();
            var getVacanciesDetailsFunction = new GetVacanciesDetailsFunction(fakeIAVService);

            var dummyProjectedVacancySummary = new ProjectedVacancySummary
            {
                SocCode      = "SOC123",
                AccessToken  = "Access123",
                SocMappingId = Guid.NewGuid(),
                Vacancies    = GetDummyVacanciesSummary()
            };

            A.CallTo(() => fakeIAVService.GetApprenticeshipVacancyDetailsAsync(A <string> ._)).Returns(GetDummyVacanciesDetails(A <string> ._));

            //Check for calling GetOutput before Execute
            Action test = () => { getVacanciesDetailsFunction.GetOutput(); };

            test.Should().Throw <InvalidOperationException>();

            await getVacanciesDetailsFunction.ExecuteAsync(dummyProjectedVacancySummary);

            var projectedVacancyDetails = getVacanciesDetailsFunction.GetOutput();

            projectedVacancyDetails.SocCode.Should().Be(dummyProjectedVacancySummary.SocCode);
            projectedVacancyDetails.SocMappingId.Should().Be(dummyProjectedVacancySummary.SocMappingId);
            projectedVacancyDetails.AccessToken.Should().Be(dummyProjectedVacancySummary.AccessToken);
            projectedVacancyDetails.Vacancies.Count().Should().Be(2);
        }
        /// <summary>
        /// Runs the specified my queue item.
        /// </summary>
        /// <param name="myQueueItem">My queue item.</param>
        /// <param name="mode">The mode.</param>
        public static async Task <ProjectedVacancyDetails> RunAsync(ProjectedVacancySummary myQueueItem, RunMode mode, IAsyncCollector <AuditRecord <object, object> > asyncCollector, AuditRecord <object, object> masterRecord)
        {
            var container      = ConfigureContainer(mode, asyncCollector, masterRecord);
            var getDetailsFunc = container.Resolve <IGetAvDetailsByIdsFunc>();
            await getDetailsFunc.ExecuteAsync(myQueueItem);

            return(getDetailsFunc.GetOutput());
        }
Пример #3
0
        private static void CheckResultIsAsExpected(string SocCode, ProjectedVacancySummary projectedVacancies, int expectedCount)
        {
            projectedVacancies.SocCode.Should().Be(SocCode);

            var numberOfProjectedVacanices = 0;

            if (expectedCount > 0)
            {
                foreach (ApprenticeshipVacancySummary v in projectedVacancies.Vacancies)
                {
                    numberOfProjectedVacanices++;
                    v.Title.Should().Be("Displayed");
                }
            }
            numberOfProjectedVacanices.Should().Be(expectedCount);
        }
Пример #4
0
 public static async Task Run(
     [QueueTrigger("projectedavfeedforsocmapping")]
     ProjectedVacancySummary myQueueItem,
     TraceWriter log,
     [Queue("projectedavdetails")]
     IAsyncCollector <ProjectedVacancyDetails> projectedVacancyDetails,
     [DocumentDB("AVFeedAudit", "AuditRecords", ConnectionStringSetting = "AVAuditCosmosDB")]
     IAsyncCollector <AuditRecord <object, object> > auditRecord)
 {
     try
     {
         await GetDetailsForProjectedAvFunc(myQueueItem, projectedVacancyDetails, auditRecord);
     }
     finally
     {
         log.Info($"C# Queue trigger function processed: {myQueueItem} CorrelationId = {myQueueItem.CorrelationId} SOC = {myQueueItem.SocCode}");
     }
 }
        public async Task ExecuteAsync(ProjectedVacancySummary projectedVacancySummary)
        {
            if (projectedVacancySummary == null)
            {
                throw new ApplicationException(nameof(projectedVacancySummary));
            }

            projectedVacancyDetails = new ProjectedVacancyDetails()
            {
                SocCode = projectedVacancySummary.SocCode, AccessToken = projectedVacancySummary.AccessToken, SocMappingId = projectedVacancySummary.SocMappingId
            };

            var vacancyDetailsList = new List <ApprenticeshipVacancyDetails>();

            foreach (var v in projectedVacancySummary.Vacancies)
            {
                vacancyDetailsList.Add(await avService.GetApprenticeshipVacancyDetailsAsync(v.VacancyReference.ToString()));
            }
            projectedVacancyDetails.Vacancies = vacancyDetailsList;
        }
Пример #6
0
        private static async Task AuditMapping(ProjectedVacancySummary myQueueItem, IAsyncCollector <AuditRecord <object, object> > auditRecord, DateTime startTime, ProjectedVacancyDetails getDetailsResult)
        {
            myQueueItem.AccessToken = null;
            await auditRecord.AddAsync(new AuditRecord <object, object>
            {
                CorrelationId = myQueueItem.CorrelationId,
                StartedAt     = startTime,
                EndedAt       = DateTime.Now,
                Function      = nameof(GetAVDetailsForProjectedAVFunction),
                Input         = myQueueItem,
                Output        = new
                {
                    CorrelationId  = myQueueItem.CorrelationId,
                    SocCode        = getDetailsResult.SocCode,
                    SocMappingId   = getDetailsResult.SocMappingId,
                    VacanciesCount = getDetailsResult.Vacancies.Count()
                },
            });

            int index = 1;

            foreach (var item in getDetailsResult.Vacancies)
            {
                await auditRecord.AddAsync(new AuditRecord <object, object>
                {
                    CorrelationId = myQueueItem.CorrelationId,
                    StartedAt     = startTime,
                    EndedAt       = DateTime.Now,
                    Function      = nameof(GetAVDetailsForProjectedAVFunction),
                    Input         = myQueueItem,
                    Output        = new
                    {
                        CorrelationId = myQueueItem.CorrelationId,
                        SocCode       = getDetailsResult.SocCode,
                        SocMappingId  = getDetailsResult.SocMappingId,
                        Vacancy       = item,
                        Index         = index++
                    },
                });
            }
        }
Пример #7
0
        private static async Task GetDetailsForProjectedAvFunc(ProjectedVacancySummary myQueueItem, IAsyncCollector <ProjectedVacancyDetails> projectedVacancyDetails, IAsyncCollector <AuditRecord <object, object> > auditRecord, int attempt = 1)
        {
            try
            {
                var startTime = DateTime.UtcNow;

                ConfigureLog.ConfigureNLogWithAppInsightsTarget();

                var getDetailsResult = await Startup.RunAsync(myQueueItem, RunMode.Azure, auditRecord, new AuditRecord <object, object>
                {
                    CorrelationId = myQueueItem.CorrelationId,
                    StartedAt     = startTime,
                    EndedAt       = DateTime.Now,
                    Function      = nameof(GetAVDetailsForProjectedAVFunction),
                    Input         = "",
                    Output        = ""
                }).ConfigureAwait(false);

                getDetailsResult.CorrelationId = myQueueItem.CorrelationId;
                await AuditMapping(myQueueItem, auditRecord, startTime, getDetailsResult);

                await projectedVacancyDetails.AddAsync(getDetailsResult).ConfigureAwait(false);
            }
            catch (AvApiResponseException responseException)
            {
                if (responseException.StatusCode == ((HttpStatusCode)429) && attempt < 3)
                {
                    var retryInSeconds = 60;
                    int.TryParse(Regex.Match(responseException.Message, "\\d+")?.Value, out retryInSeconds);
                    await Task.Delay(retryInSeconds * 1000);
                    await GetDetailsForProjectedAvFunc(myQueueItem, projectedVacancyDetails, auditRecord, attempt ++);
                }
                else
                {
                    throw;
                }
            }
        }
        public void Execute(MappedVacancySummary mappedVacancySummary)
        {
            if (mappedVacancySummary != null)
            {
                projectedVacanciesForSOC = new ProjectedVacancySummary
                {
                    SocCode      = mappedVacancySummary.SocCode,
                    SocMappingId = mappedVacancySummary.SocMappingId,
                    AccessToken  = mappedVacancySummary.AccessToken,
                };

                //if none were found for SOC
                if (mappedVacancySummary.Vacancies == null)
                {
                    return;
                }

                var numberProvoidersFound = mappedVacancySummary.Vacancies.Select(v => v.TrainingProviderName).Distinct().Count();

                var projection = Enumerable.Empty <ApprenticeshipVacancySummary>();
                if (numberProvoidersFound > 1)
                {
                    //have multipe providers
                    projection = mappedVacancySummary.Vacancies
                                 .GroupBy(v => v.TrainingProviderName)
                                 .Select(g => g.First())
                                 .Take(2);
                }
                else
                {
                    //just have a single or no provider
                    projection = mappedVacancySummary.Vacancies.Take(2);
                }

                projectedVacanciesForSOC.Vacancies = projection;
            }
        }
 private static async Task AuditProjections(SocMapping myQueueItem, IAsyncCollector <AuditRecord <object, object> > auditRecord, DateTime startTime, MappedVacancySummary mappedResult, ProjectedVacancySummary projectedResult)
 {
     myQueueItem.AccessToken = null;
     await auditRecord.AddAsync(new AuditRecord <object, object>
     {
         CorrelationId = myQueueItem.CorrelationId,
         StartedAt     = startTime,
         EndedAt       = DateTime.Now,
         Function      = "ProjectVacanciesAzFunction",
         Input         = new
         {
             CorrelationId  = myQueueItem.CorrelationId,
             SocCode        = mappedResult.SocCode,
             SocMappingId   = mappedResult.SocMappingId,
             VacanciesCount = mappedResult.Vacancies.Count()
         },
         Output = projectedResult,
     });
 }
 public static async Task <ProjectedVacancyDetails> RunAsync(ProjectedVacancySummary myQueueItem, RunMode mode)
 {
     return(await RunAsync(myQueueItem, mode, null, null));
 }