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(); }
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); }
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); }
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"); }
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(); }
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(); }
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); }
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"); }
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"); }
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(); } }
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); }
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); }
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); }
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)); }
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); }
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)); }
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); }