Exemplo n.º 1
0
        public async Task Test_SubtaskSearchQuery_FindByJobId_None_Should_ReturnEmpty()
        {
            // arrange
            var job   = new JobFaker().Generate("default,InProgress");
            var tasks = new SubtaskFaker().SetJob(job).Generate(17);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, tasks);

            var search = new SubtaskSearchCriteria()
            {
                JobId = Guid.Empty
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new SubtaskSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(0);
            results.TotalPages.Should().Be(0);
            results.Data.Should().BeNullOrEmpty();
        }
Exemplo n.º 2
0
        public async Task Test_UpdateTask_Should_Persist()
        {
            // arrange
            var task = new SubtaskFaker()
                       .SetJobId(_job.Id)
                       .Generate("default,Pending");

            await using var dbContext = GetDbContext();
            await dbContext.Tasks.AddAsync(task);

            await dbContext.SaveChangesAsync();

            // act
            var updated = dbContext.Tasks.Find(task.Id);

            updated.Status    = Status.InProgress;
            updated.StartTime = DateTimeOffset.Now;

            await dbContext.SaveChangesAsync();

            // assert
            await using var actualDbContext = GetDbContext();
            var actual = actualDbContext.Tasks.Find(task.Id);

            actual.Should().BeEquivalentTo(updated);
        }
Exemplo n.º 3
0
        public async Task Test_SubtaskSearchQuery_DefaultCriteria_Should_ReturnAll()
        {
            // arrange
            var job   = new JobFaker().Generate();
            var tasks = new SubtaskFaker().SetJob(job).Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, tasks);

            var search = new SubtaskSearchCriteria()
            {
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new SubtaskSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(100);
            results.TotalPages.Should().Be(4);
            results.Data.Should().HaveCount(25);
            results.Data.Should().OnlyHaveUniqueItems(x => x.TaskId);
        }
Exemplo n.º 4
0
        public async Task Test_EndSubtask_AlreadyComplete_Should_noop()
        {
            // arrange
            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("defaults,Completed");

            await using var dbContext = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, task);

            var message = new TestEndSubtaskMessage()
            {
                TaskId  = task.TaskId,
                EndTime = DateTimeOffset.Now.AddDays(99),
                Success = true
            };

            // act
            await _consumer.Consume(new TestConsumeContext <EndSubtask>(message));

            // assert
            var actual = DbContextFactory.Instance
                         .CreateDbContext <PortAuthorityDbContext>()
                         .Jobs.SingleOrDefault(j => j.JobId == job.JobId);

            actual.Should().NotBeNull();
            actual.Status.Should().Be(job.Status, "task start time should not have changed");
            actual.StartTime.Should().BeCloseTo(job.StartTime.Value, because: "task start time should not have changed");
            actual.EndTime.Should().BeNull("task end time not set");
        }
Exemplo n.º 5
0
        public async Task Test_GetTask_InProgress_Should_ReturnModel()
        {
            // arrange
            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("default,InProgress");

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, job);

            await context.Setup(x => x.Tasks, task);

            // act
            var actual = await _service.GetTask(task.TaskId);

            // assert
            actual.Should().NotBeNull();
            actual.IsOk().Should().BeTrue();

            var model = actual.Payload;

            model.TaskId.Should().Be(task.TaskId);
            model.Name.Should().Be(task.Name);
            model.Status.Should().Be(Status.InProgress);
            model.StartTime.Should().BeCloseTo(task.StartTime.Value);
            model.EndTime.Should().BeNull();
        }
Exemplo n.º 6
0
        public async Task Test_EndTask_Should_SendMessage()
        {
            // arrange
            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("default,InProgress");

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, job);

            await context.Setup(x => x.Tasks, task);

            var endTime   = DateTimeOffset.UtcNow;
            var isSuccess = true;

            _mockSendEndpointProvider
            .SetupMessage <EndSubtask>(new
            {
                TaskId  = task.TaskId,
                EndTime = endTime,
                Success = isSuccess
            });

            // act
            var result = await _service.EndTask(task.TaskId, endTime, isSuccess);

            // assert
            result.Should().NotBeNull();
            result.IsOk().Should().BeTrue();

            _mocks.Verify();
        }
Exemplo n.º 7
0
        public async Task Test_ListTasks_FindAll_Should_ReturnPagedList()
        {
            // arrange
            var job   = new JobFaker().Generate("default,InProgress");
            var tasks = new SubtaskFaker().SetJob(job).Generate(100);

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, job);

            await context.Setup(x => x.Tasks, tasks);

            var search = new SubtaskSearchCriteria()
            {
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var result = await _service.ListTasks(search, paging);

            // assert
            result.Should().NotBeNull();
            result.IsOk().Should().BeTrue();

            var payload = result.Payload;

            payload.TotalItems.Should().Be(100);
            payload.TotalPages.Should().Be(4);
            payload.Data.Should().HaveCount(25);
        }
Exemplo n.º 8
0
        public async Task Test_CreateTask_DuplicateGuid_Should_ReturnConflict()
        {
            // arrange
            var job  = new JobFaker().Generate("default,Pending");
            var task = new SubtaskFaker().SetJob(job).Generate("default,Pending");

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, job);

            await context.Setup(x => x.Tasks, task);

            var form = new CreateSubtaskForm()
            {
                JobId  = job.JobId,
                TaskId = task.TaskId,
                Name   = "test-createtask-task-id-already-exists"
            };

            // act
            var result = await _service.CreateTask(form);

            // assert
            result.Should().NotBeNull();
            result.IsConflict().Should().BeTrue();
            result.ErrorMessage.Message.Should().StartWith("Sub-task already exists");
        }
        public async Task Test_StartJob_AlreadyInProgress_Should_noop()
        {
            // arrange
            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("defaults,InProgress");

            await using var dbContext = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, task);

            var message = new TestStartSubtaskMessage
            {
                TaskId    = task.TaskId,
                StartTime = DateTimeOffset.Now.AddDays(99)
            };

            // act
            await _consumer.Consume(new TestConsumeContext <StartSubtask>(message));

            // assert
            var actual = DbContextFactory.Instance
                         .CreateDbContext <PortAuthorityDbContext>()
                         .Tasks.SingleOrDefault(t => t.TaskId == task.TaskId);

            actual.Should().NotBeNull();
            actual.Status.Should().Be(task.Status, "task status should not have changed");
            actual.StartTime.Should().BeCloseTo(task.StartTime.Value, because: "task start time should not have changed");
        }
Exemplo n.º 10
0
        public async Task Test_EndSubtask_Success_False_Should_Be_Failed_With_EndTime()
        {
            // arrange
            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("defaults,InProgress");

            await using var dbContext = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, task);

            var message = new TestEndSubtaskMessage()
            {
                TaskId  = task.TaskId,
                EndTime = DateTimeOffset.Now,
                Success = false
            };

            // act
            await _consumer.Consume(new TestConsumeContext <EndSubtask>(message));

            // assert
            var actual = DbContextFactory.Instance
                         .CreateDbContext <PortAuthorityDbContext>()
                         .Tasks.SingleOrDefault(t => t.TaskId == task.TaskId);

            actual.Should().NotBeNull();
            actual.Status.Should().Be(Status.Failed, because: "task status updated");
            actual.EndTime.Should().BeCloseTo(message.EndTime, because: "task end time updated");
        }
Exemplo n.º 11
0
        public async Task Test_SubtaskSearchQuery_TinyPageSize_Should_ReturnPagedResult()
        {
            // arrange
            var job   = new JobFaker().Generate("default,InProgress");
            var tasks = new SubtaskFaker().SetJob(job).Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, tasks);

            var search = new SubtaskSearchCriteria();
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 5
            };

            // act
            var results = await new SubtaskSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(5);
            results.TotalItems.Should().Be(100);
            results.TotalPages.Should().Be(20);
            results.Data.Should().HaveCount(5);
        }
        public async Task Test_EndSubtaskConsumer_Success_True_Should_Consume_With_Status_Completed()
        {
            // arrange
            var consumerHarness = Consumer <EndSubtaskConsumer>();

            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("default,InProgress");

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, task);

            var message = new TestEndSubtaskMessage()
            {
                TaskId  = task.TaskId,
                EndTime = DateTimeOffset.Now,
                Success = true
            };

            await Harness.Start();

            try
            {
                // act
                await Harness.InputQueueSendEndpoint.Send <EndSubtask>(message);

                // assert
                Assert.That(await Harness.Consumed.Any <EndSubtask>(), "endpoint consumed message");
                Assert.That(await consumerHarness.Consumed.Any <EndSubtask>(), "actual consumer consumed the message");
                Assert.That(await Harness.Published.Any <Fault <EndSubtask> >(), Is.False, "message handled without fault");

                await using var actualDbContext = GetDbContext();
                var actual = actualDbContext.Tasks.SingleOrDefault(t => t.TaskId == task.TaskId);

                actual.Should().NotBeNull();
                actual.TaskId.Should().Be(task.TaskId);
                actual.Status.Should().Be(Status.Completed, "task status is successful");
                actual.EndTime.Should().BeCloseTo(message.EndTime, because: "task end time updated");
            }
            finally
            {
                await Harness.Stop();
            }
        }
Exemplo n.º 13
0
        public async Task Test_AddTask_Should_Persist()
        {
            // arrange
            var task = new SubtaskFaker()
                       .SetJobId(_job.Id)
                       .Generate();

            // act
            await using var dbContext = GetDbContext();
            await dbContext.Tasks.AddAsync(task);

            await dbContext.SaveChangesAsync();

            // assert
            await using var actualDbContext = GetDbContext();
            var actual = actualDbContext.Tasks.Find(task.Id);

            actual.Should().BeEquivalentTo(task);
        }
Exemplo n.º 14
0
        public async Task Test_FindTask_ByGuid_Should_Match()
        {
            // arrange
            var tasks = new SubtaskFaker()
                        .SetJobId(_job.Id)
                        .Generate(10);

            await using var dbContext = GetDbContext();
            await dbContext.Tasks.AddRangeAsync(tasks);

            await dbContext.SaveChangesAsync();

            // act
            var expected = tasks[7]; /* random selection by fair dice roll */
            var actual   = dbContext.Tasks.FirstOrDefault(x => x.TaskId == expected.TaskId);

            // assert
            actual.Should().NotBeNull();
            actual.Should().BeEquivalentTo(expected);
        }
Exemplo n.º 15
0
        public async Task Test_UpdateJob_AddTask_Should_Persist()
        {
            // arrange
            var job   = new JobFaker().Generate();
            var tasks = new SubtaskFaker().Generate(10);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            // act
            var entity = dbContext.Jobs.Find(job.Id);

            entity.Tasks.AddRange(tasks);
            await dbContext.SaveChangesAsync();

            // assert
            await using var actualDbContext = GetDbContext();
            var actual = actualDbContext.Jobs
                         .Include(x => x.Tasks)
                         .Single(x => x.Id == job.Id);

            actual.Tasks.Should().HaveCount(10);
        }
Exemplo n.º 16
0
        public async Task Test_ListTasks_Find_ByName_Should_ReturnPagedList()
        {
            // arrange
            var job      = new JobFaker().Generate("default,InProgress");
            var fooTasks = new SubtaskFaker().SetJob(job).SetName("foo").Generate(10);
            var barTasks = new SubtaskFaker().SetJob(job).SetName("bar").Generate(10);

            await using var context = DbContextFactory.Instance.CreateDbContext <PortAuthorityDbContext>();
            await context.Setup(x => x.Jobs, job);

            await context.Setup(x => x.Tasks, fooTasks);

            await context.Setup(x => x.Tasks, barTasks);

            var search = new SubtaskSearchCriteria()
            {
                Name = "bar"
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var result = await _service.ListTasks(search, paging);

            // assert
            result.Should().NotBeNull();
            result.IsOk().Should().BeTrue();

            var payload = result.Payload;

            payload.TotalItems.Should().Be(10);
            payload.TotalPages.Should().Be(1);
            payload.Data.Should().HaveCount(10);
            payload.Data.Should().OnlyContain(x => barTasks.Select(t => t.TaskId).Contains(x.TaskId));
        }
Exemplo n.º 17
0
        public async Task Test_SubtaskSearchQuery_FindByName_Should_ReturnMatching()
        {
            // arrange
            var expectedName = "find-by-name";

            var job         = new JobFaker().Generate("default,InProgress");
            var tasks       = new SubtaskFaker().SetJob(job).Generate(100);
            var tasksToFind = new SubtaskFaker().SetJob(job).SetName(expectedName).Generate(4);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, tasks);

            await dbContext.Setup(x => x.Tasks, tasksToFind);

            var search = new SubtaskSearchCriteria()
            {
                Name = expectedName
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new SubtaskSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(4);
            results.TotalPages.Should().Be(1);
            results.Data.Should().HaveCount(4);
            results.Data.Should().OnlyContain(x => x.Name == expectedName);
        }
Exemplo n.º 18
0
        public async Task Test_SubtaskSearchQuery_FindByJobId_Should_ReturnMatching()
        {
            // arrange
            var jobA = new JobFaker().Generate("default,InProgress");
            var jobB = new JobFaker().Generate("default,InProgress");

            var aTasks = new SubtaskFaker().SetJob(jobA).Generate(100);
            var bTasks = new SubtaskFaker().SetJob(jobB).Generate(23);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, new [] { jobA, jobB });

            await dbContext.Setup(x => x.Tasks, aTasks);

            await dbContext.Setup(x => x.Tasks, bTasks);

            var search = new SubtaskSearchCriteria()
            {
                JobId = jobB.JobId
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

            // act
            var results = await new SubtaskSearchQuery(dbContext).Find(search, paging);

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(23);
            results.TotalPages.Should().Be(1);
            results.Data.Should().HaveCount(23);
            results.Data.Should().OnlyContain(x => bTasks.Select(t => t.TaskId).Contains(x.TaskId));
        }
Exemplo n.º 19
0
        public async Task Test_SubtaskSearchQuery_PageForward_Should_ReturnNewPage()
        {
            // arrange
            var job   = new JobFaker().Generate("default,InProgress");
            var tasks = new SubtaskFaker().SetJob(job).Generate(100);

            await using var dbContext = GetDbContext();
            await dbContext.Setup(x => x.Jobs, job);

            await dbContext.Setup(x => x.Tasks, tasks);

            var search = new SubtaskSearchCriteria();

            // act
            var query = new SubtaskSearchQuery(dbContext);
            var page1 = await query.Find(search, new PagingCriteria()
            {
                Page = 1, Size = 5
            });

            var page2 = await query.Find(search, new PagingCriteria()
            {
                Page = 2, Size = 5
            });

            var page3 = await query.Find(search, new PagingCriteria()
            {
                Page = 3, Size = 5
            });

            var page10 = await query.Find(search, new PagingCriteria()
            {
                Page = 10, Size = 5
            });

            // assert
            page1.Should().NotBeNull();
            page1.Page.Should().Be(1);
            page1.TotalItems.Should().Be(100);
            page1.TotalPages.Should().Be(20);
            page1.Data.Should()
            .NotContain(page2.Data)
            .And.NotContain(page3.Data)
            .And.NotContain(page10.Data);

            page2.Should().NotBeNull();
            page2.Page.Should().Be(2);
            page2.TotalItems.Should().Be(100);
            page2.TotalPages.Should().Be(20);
            page2.Data.Should()
            .NotContain(page1.Data)
            .And.NotContain(page3.Data)
            .And.NotContain(page10.Data);

            page3.Should().NotBeNull();
            page3.Page.Should().Be(3);
            page3.TotalItems.Should().Be(100);
            page3.TotalPages.Should().Be(20);
            page3.Data.Should()
            .NotContain(page1.Data)
            .And.NotContain(page2.Data)
            .And.NotContain(page10.Data);

            page10.Should().NotBeNull();
            page10.Page.Should().Be(10);
            page10.TotalItems.Should().Be(100);
            page10.TotalPages.Should().Be(20);
            page10.Data.Should()
            .NotContain(page1.Data)
            .And.NotContain(page2.Data)
            .And.NotContain(page3.Data);
        }