public void GetJobs_WithNoFilter_ReturnsAllResults()
        {
            // Arrange
            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(null, null, null, null, null, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(testData.Count);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(1);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .HaveCount(testData.Count);
        }
        public void GetJobs_WhenSecondPageRequested_ReturnsSecondPageOfResults()
        {
            // Arrange
            List <Job> largeTestData = new List <Job>();

            for (int i = 0; i < 100; i++)
            {
                largeTestData.Add(new Job {
                    CompletionStatus = CompletionStatus.Succeeded, Id = "job" + i, JobDefinitionId = "jobType1", Outcome = "Job Completed Successfully", RunningStatus = RunningStatus.Completed, SpecificationId = "spec123", Trigger = new Trigger {
                        EntityId = "entity1"
                    }
                });
            }

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(largeTestData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(null, null, null, null, null, false, 2);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(largeTestData.Count);
            response.CurrentPage.Should().Be(2);
            response.TotalPages.Should().Be(2);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .HaveCount(50);

            summaries
            .First()
            .JobId
            .Should()
            .Be("job50", "first job should be the 50th job");

            summaries
            .Last()
            .JobId
            .Should()
            .Be("job99", "last job should be the 100th job");
        }
        public void GetJobs_WhenAllFiltersPresent_ReturnsResultsMatchingFilter()
        {
            // Arrange
            string           specificationId  = "spec123";
            string           jobType          = "jobType1";
            string           entityId         = "entity1";
            RunningStatus    runningStatus    = RunningStatus.Completed;
            CompletionStatus completionStatus = CompletionStatus.Succeeded;

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(specificationId, jobType, entityId, runningStatus, completionStatus, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(1);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(1);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .OnlyContain(s =>
                         s.SpecificationId == specificationId &&
                         s.JobType == jobType &&
                         s.EntityId == entityId &&
                         s.RunningStatus == runningStatus &&
                         s.CompletionStatus == completionStatus);

            summaries
            .Should()
            .HaveCount(1);
        }
        public void GetJobs_CheckFieldsMapped()
        {
            // Arrange
            string entityId = "entity99";

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(null, null, entityId, null, null, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .HaveCount(1);

            JobSummary item = summaries.First();

            item.CompletionStatus.Should().Be(CompletionStatus.Succeeded);
            item.EntityId.Should().Be(entityId);
            item.InvokerUserDisplayName.Should().Be("Test User");
            item.InvokerUserId.Should().Be("testuser");
            item.JobId.Should().Be("job14");
            item.JobType.Should().Be("jobType3");
            item.ParentJobId.Should().Be("job1");
            item.RunningStatus.Should().Be(RunningStatus.Completed);
            item.SpecificationId.Should().Be("spec123");
            item.Created.Should().Be(DateTimeOffset.Parse("2018-12-20T15:15:00.000Z"));
        }
Example #5
0
        public async Task GetJobs_WhenNonExistantPageRequested_ReturnsEmptyList()
        {
            // Arrange
            List <Job> largeTestData = new List <Job>();

            for (int i = 0; i < 100; i++)
            {
                largeTestData.Add(new Job {
                    CompletionStatus = CompletionStatus.Succeeded, Id = "job" + i, JobDefinitionId = "jobType1", Outcome = "Job Completed Successfully", RunningStatus = RunningStatus.Completed, SpecificationId = "spec123", Trigger = new Trigger {
                        EntityId = "entity1"
                    }
                });
            }

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(largeTestData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = await jobService.GetJobs(null, null, null, null, null, false, 3);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(largeTestData.Count);
            response.CurrentPage.Should().Be(3);
            response.TotalPages.Should().Be(2);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .BeEmpty();
        }
        public void GetJobs_WithExcludeChildJobsOption_ReturnsOnlyParentJobs()
        {
            // Arrange
            string specId = "spec123";

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(specId, null, null, null, null, true, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(2);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(1);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .OnlyContain(s => s.SpecificationId == specId && s.ParentJobId == null);

            summaries
            .Should()
            .HaveCount(2);
        }
        public void GetJobs_WithCompletionStatusFilter_ReturnsResultsMatchingFilter()
        {
            // Arrange
            CompletionStatus completionStatus = CompletionStatus.Succeeded;

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(null, null, null, null, completionStatus, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(3);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(1);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .OnlyContain(s => s.CompletionStatus == completionStatus);

            summaries
            .Should()
            .HaveCount(3);
        }
Example #8
0
        public async Task GetJobs_WithRunningStatusFilter_ReturnsResultsMatchingFilter()
        {
            // Arrange
            RunningStatus runningStatus = RunningStatus.InProgress;

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = await jobService.GetJobs(null, null, null, runningStatus, null, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(2);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(1);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .OnlyContain(s => s.RunningStatus == runningStatus);

            summaries
            .Should()
            .HaveCount(2);
        }
Example #9
0
        public async Task GetJobs_WithSpecificationFilter_ReturnsResultsMatchingFilter()
        {
            // Arrange
            string specId = "spec123";

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = await jobService.GetJobs(specId, null, null, null, null, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(3);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(1);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .OnlyContain(s => s.SpecificationId == specId);

            summaries
            .Should()
            .HaveCount(3);
        }
        public void GetJobs_WithUnknownSpecificationFilter_ReturnsZeroResults()
        {
            // Arrange
            string specId = "unknown";

            IJobRepository jobRepository = CreateJobRepository();

            jobRepository
            .GetJobs()
            .Returns(testData.AsQueryable());

            IJobService jobService = CreateJobService(jobRepository);

            // Act
            IActionResult results = jobService.GetJobs(specId, null, null, null, null, false, 1);

            // Assert
            OkObjectResult objResult = results
                                       .Should()
                                       .BeOfType <OkObjectResult>()
                                       .Subject;

            JobQueryResponseModel response = objResult.Value
                                             .Should()
                                             .BeOfType <JobQueryResponseModel>()
                                             .Subject;

            response.TotalItems.Should().Be(0);
            response.CurrentPage.Should().Be(1);
            response.TotalPages.Should().Be(0);

            IEnumerable <JobSummary> summaries = response.Results;

            summaries
            .Should()
            .BeEmpty();
        }
Example #11
0
        public IActionResult GetJobs(string specificationId, string jobType, string entityId, RunningStatus?runningStatus, CompletionStatus?completionStatus, bool excludeChildJobs, int pageNumber)
        {
            if (pageNumber < 1)
            {
                return(new BadRequestObjectResult("Invalid page number, pages start from 1"));
            }

            IQueryable <Job> allJobs = _jobsRepositoryNonAsyncPolicy.Execute(() => _jobRepository.GetJobs());

            if (!string.IsNullOrEmpty(specificationId))
            {
                allJobs = allJobs.Where(j => j.SpecificationId == specificationId);
            }

            if (!string.IsNullOrEmpty(jobType))
            {
                allJobs = allJobs.Where(j => j.JobDefinitionId == jobType);
            }

            if (!string.IsNullOrEmpty(entityId))
            {
                allJobs = allJobs.Where(j => j.Trigger.EntityId == entityId);
            }

            if (runningStatus.HasValue)
            {
                allJobs = allJobs.Where(j => j.RunningStatus == runningStatus.Value);
            }

            if (completionStatus.HasValue)
            {
                allJobs = allJobs.Where(j => j.CompletionStatus == completionStatus.Value);
            }

            if (excludeChildJobs)
            {
                allJobs = allJobs.Where(j => j.ParentJobId == null);
            }

            int totalItems = allJobs.Count();

            // Limit the query to end of the requested page
            const int pageSize = 50;

            allJobs = allJobs.Take(pageNumber * pageSize);

            // Need to do actual page selection in memory as Cosmos doesn't support Skip or ordering by date
            IEnumerable <Job> executedJobs = allJobs.AsEnumerable().OrderByDescending(j => j.LastUpdated);

            executedJobs = executedJobs.Skip((pageNumber - 1) * pageSize).Take(pageSize);
            System.Diagnostics.Debug.WriteLine("Executed Jobs: {0}", executedJobs.Count());

            IEnumerable <JobSummary> summaries = _mapper.Map <IEnumerable <JobSummary> >(executedJobs);

            JobQueryResponseModel jobQueryResponse = new JobQueryResponseModel
            {
                Results     = summaries,
                CurrentPage = pageNumber,
                PageSize    = pageSize,
                TotalItems  = totalItems,
                TotalPages  = (int)Math.Ceiling((double)totalItems / pageSize)
            };

            return(new OkObjectResult(jobQueryResponse));
        }