Example #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();
        }
        public async Task Test_EndJob_Success_True_Should_Be_Completed_With_EndTime()
        {
            // arrange
            var job = new JobFaker().Generate("default,InProgress");

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

            var message = new TestEndJobMessage()
            {
                JobId   = job.JobId,
                EndTime = DateTimeOffset.Now,
                Success = true
            };

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

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

            actual.Should().NotBeNull();
            actual.Status.Should().Be(Status.Completed, because: "job status updated");
            actual.EndTime.Should().BeCloseTo(message.EndTime, because: "job end time updated");
        }
Example #3
0
        public async Task Test_StartJob_AlreadyInProgress_Should_noop()
        {
            // arrange
            var job = new JobFaker().Generate("default,InProgress");

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

            var message = new TestStartJobMessage
            {
                JobId     = job.JobId,
                StartTime = DateTimeOffset.Now.AddDays(99)
            };

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

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

            actual.Should().NotBeNull();
            actual.Status.Should().Be(job.Status);
            actual.StartTime.Should().BeCloseTo(job.StartTime.Value, because: "job start time should not have changed");
        }
Example #4
0
        public async Task Test_GetJob_InProgress_Should_ReturnModel()
        {
            // arrange
            var job = new JobFaker().Generate("default,InProgress");

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

            // act
            var actual = await _service.GetJob(job.JobId);

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

            var model = actual.Payload;

            model.JobId.Should().Be(job.JobId);
            model.CorrelationId.Should().Be(job.CorrelationId);
            model.Type.Should().Be(job.Type);
            model.Namespace.Should().Be(job.Namespace);
            model.Status.Should().Be(Status.InProgress);
            model.StartTime.Should().Be(job.StartTime);
            model.EndTime.Should().BeNull();
        }
        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();
        }
Example #6
0
        public async Task Test_StartJob_Should_Be_InProgress_With_StartTime()
        {
            // arrange
            var job = new JobFaker().Generate("default,Pending");

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

            var message = new TestStartJobMessage
            {
                JobId     = job.JobId,
                StartTime = DateTimeOffset.Now
            };

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

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

            actual.Should().NotBeNull();
            actual.Status.Should().Be(Status.InProgress, because: "job status updated");
            actual.StartTime.Should().BeCloseTo(message.StartTime, because: "job start time updated");
        }
        public async Task Test_CreateTask_Should_SendMessage_And_ReturnOk()
        {
            // arrange
            var job = new JobFaker().Generate("default,Pending");

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

            var form = new CreateSubtaskForm()
            {
                JobId  = job.JobId,
                TaskId = NewId.NextGuid(),
                Name   = "test-createtask-ok"
            };

            _mockSendEndpointProvider
            .SetupMessage <CreateSubtask>(new
            {
                JobId  = form.JobId,
                TaskId = form.TaskId,
                Name   = form.Name
            });

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

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

            _mocks.Verify();
        }
        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_StartSubtask_NotFound_Should_noop()
        {
            // arrange
            var job  = new JobFaker().Generate("default,InProgress");
            var task = new SubtaskFaker().SetJob(job).Generate("defaults,Pending");

            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    = Guid.NewGuid(), /* task does not exist */
                StartTime = DateTimeOffset.Now
            };

            // 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().Be(task.StartTime, because: "task start time should not have changed");
        }
Example #10
0
        public async Task Test_JobSearchQuery_FindByTypeAndNamespace_Should_ReturnMatching()
        {
            // arrange
            var jobs = new JobFaker().Generate(100);

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

            var expected = jobs[39];
            var search   = new JobSearchCriteria()
            {
                Type = expected.Type, Namespace = expected.Namespace
            };
            var paging = new PagingCriteria()
            {
                Page = 1, Size = 25
            };

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

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(1);
            results.TotalPages.Should().Be(1);
            results.Data.Should().HaveCount(1);
            results.Data.Should().OnlyContain(x => x.Type == expected.Type && x.Namespace == expected.Namespace);
        }
Example #11
0
        public async Task Test_JobSearchQuery_FindByCorrelationId_None_Should_ReturnEmpty()
        {
            // arrange
            var correlationId = Guid.NewGuid();
            var bulkJobs      = new JobFaker().Generate(100);

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

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

            // act
            var results = await new JobSearchQuery(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();
        }
Example #12
0
        public async Task Test_StartJob_Should_SendMessage()
        {
            // arrange
            var job       = new JobFaker().Generate("default,Pending");
            var startTime = DateTimeOffset.UtcNow;

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

            _mockSendEndpointProvider
            .SetupMessage <StartJob>(new
            {
                JobId     = job.JobId,
                StartTime = startTime
            });

            // act
            var result = await _service.StartJob(job.JobId, startTime);

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

            _mocks.Verify();
        }
Example #13
0
        public async Task Test_ListJobs_Find_ByCorrelationId_Should_ReturnPagedList()
        {
            // arrange
            var correlationId = Guid.NewGuid();
            var bulkJobs      = new JobFaker().Generate(100);
            var relatedJobs   = new JobFaker().SetCorrelationId(correlationId).Generate(10);

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

            await context.Setup(x => x.Jobs, relatedJobs);

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

            // act
            var result = await _service.ListJobs(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 => relatedJobs.Select(j => j.JobId).Contains(x.JobId));
        }
Example #14
0
        public async Task Test_EndJob_Should_SendMessage()
        {
            // arrange
            var job       = new JobFaker().Generate("default,InProgress");
            var endTime   = DateTimeOffset.UtcNow;
            var isSuccess = true;

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

            _mockSendEndpointProvider
            .SetupMessage <EndJob>(new
            {
                JobId   = job.JobId,
                EndTime = endTime,
                Success = isSuccess
            });

            // act
            var result = await _service.EndJob(job.JobId, endTime, isSuccess);

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

            _mocks.Verify();
        }
Example #15
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);
        }
Example #16
0
        public async Task Test_ListJobs_FindAll_Should_ReturnPagedList()
        {
            // arrange
            var jobs = new JobFaker()
                       .Generate(100);

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

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

            // act
            var result = await _service.ListJobs(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_CreateSubtask_Empty_TaskId_Should_noop()
        {
            // arrange
            var job = new JobFaker().Generate();

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

            var message = new TestCreateSubtaskMessage()
            {
                JobId  = job.JobId,
                TaskId = Guid.Empty,
                Name   = "test-create-subtask-empty-taskid"
            };

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

            // assert
            var actual = DbContextFactory.Instance
                         .CreateDbContext <PortAuthorityDbContext>()
                         .Tasks.ToList();

            actual.Should().BeNullOrEmpty("no tasks created without a valid parent job id");
        }
        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_CreateSubtask_Should_PersistNewJob()
        {
            // arrange
            var job = new JobFaker().Generate();

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

            var message = new TestCreateSubtaskMessage()
            {
                JobId  = job.JobId,
                TaskId = NewId.NextGuid(),
                Name   = "test-create-subtask",
                Meta   = new Dictionary <string, object>()
                {
                    { "foo", "bar" },
                    { "baz", 1 },
                    { "zap", DateTime.UtcNow }
                }
            };

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

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

            actual.Should().NotBeNull();
            actual.TaskId.Should().Be(message.TaskId);
            actual.Name.Should().Be(message.Name);
            actual.Meta.Should().BeEquivalentTo(message.Meta);
        }
        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");
        }
Example #21
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);
        }
Example #22
0
        public async Task Test_JobSearchQuery_FindByCorrelationId_Should_ReturnMatching()
        {
            // arrange
            var correlationId = Guid.NewGuid();
            var bulkJobs      = new JobFaker().Generate(100);
            var relatedJobs   = new JobFaker().SetCorrelationId(correlationId).Generate(13);

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

            await dbContext.Setup(x => x.Jobs, relatedJobs);

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

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

            // assert
            results.Should().NotBeNull();
            results.Page.Should().Be(1);
            results.Size.Should().Be(25);
            results.TotalItems.Should().Be(13);
            results.TotalPages.Should().Be(1);
            results.Data.Should().HaveCount(13);
            results.Data.Should().OnlyContain(x => relatedJobs.Select(j => j.JobId).Contains(x.JobId));
        }
Example #23
0
        public async Task Test_EndJob_NotFound_Should_noop()
        {
            // arrange
            var job = new JobFaker().Generate("default,InProgress");

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

            var message = new TestEndJobMessage()
            {
                JobId   = Guid.NewGuid(), /* job does not exist */
                EndTime = DateTimeOffset.Now.AddDays(99),
                Success = false
            };

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

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

            actual.Should().NotBeNull();
            actual.Status.Should().Be(job.Status);
            actual.StartTime.Should().BeCloseTo(job.StartTime.Value, because: "job start time should not have changed");
            actual.EndTime.Should().BeNull("bad job id, end time not set");
        }
Example #24
0
        public async Task Test_FindJob_ByGuid_Should_Match()
        {
            // arrange
            var jobs = new JobFaker().Generate(10);

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

            // act
            var expected = jobs[3]; /* random selection by fair dice roll */
            var actual   = dbContext.Jobs.FirstOrDefault(x => x.JobId == expected.JobId);

            // assert
            actual.Should().NotBeNull();
            actual.Should().BeEquivalentTo(expected);
        }
        public async Task Test_CreateSubtaskConsumer_Should_ConsumeMessage_And_CreateJob()
        {
            // arrange
            var consumerHarness = Consumer <CreateSubtaskConsumer>();

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

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

            var message = new TestCreateSubtaskMessage()
            {
                JobId  = job.JobId,
                TaskId = NewId.NextGuid(),
                Name   = "test-create-subtask",
                Meta   = new Dictionary <string, object>()
                {
                    { "foo", "bar" },
                    { "baz", 1 },
                    { "zap", DateTime.UtcNow }
                }
            };

            await Harness.Start();

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

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

                var actual = GetDbContext().Tasks.SingleOrDefault(t => t.TaskId == message.TaskId);

                actual.Should().NotBeNull();
                actual.TaskId.Should().Be(message.TaskId);
                actual.Name.Should().Be(message.Name);
                actual.Meta.Should().BeEquivalentTo(message.Meta);
            }
            finally
            {
                await Harness.Stop();
            }
        }
Example #26
0
        public async Task Test_AddJob_Should_Persist()
        {
            // arrange
            var job = new JobFaker().Generate();

            // act
            await using var dbContext = GetDbContext();
            await dbContext.Jobs.AddAsync(job);

            await dbContext.SaveChangesAsync();

            // assert
            await using var actualDbContext = GetDbContext();
            var actual = actualDbContext.Jobs.Find(job.Id);

            actual.Should().BeEquivalentTo(job);
        }
        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();
            }
        }
Example #28
0
        public async Task Test_StartJobConsumer_Should_Consume_With_Status_ImProgress()
        {
            // arrange
            var consumerHarness = Consumer <StartJobConsumer>();

            var job = new JobFaker().Generate("default,Pending");

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

            var message = new TestStartJobMessage()
            {
                JobId     = job.JobId,
                StartTime = DateTimeOffset.Now
            };

            await Harness.Start();

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

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

                await using var actualDbContext = GetDbContext();
                var actual = actualDbContext.Jobs.SingleOrDefault(j => j.JobId == message.JobId);

                actual.Should().NotBeNull();
                actual.JobId.Should().Be(message.JobId);
                actual.Status.Should().Be(Status.InProgress, "job status updated");
                actual.StartTime.Should().BeCloseTo(message.StartTime, because: "job start time updated");
            }
            finally
            {
                await Harness.Stop();
            }
        }
        public async Task Test_CreateSubtask_Invalid_ParentJobId_Should_Throw_InvalidOperationException()
        {
            // arrange
            var job = new JobFaker().Generate();

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

            var message = new TestCreateSubtaskMessage()
            {
                JobId  = Guid.NewGuid(),
                TaskId = NewId.NextGuid(),
                Name   = "test-create-subtask-invalid-jobid"
            };

            // act
            Func <Task> act = async() => { await _consumer.Consume(new TestConsumeContext <CreateSubtask>(message)); };

            // assert
            await act.Should().ThrowAsync <InvalidOperationException>();
        }
Example #30
0
        public async Task Test_UpdateJob_Should_Persist()
        {
            // arrange
            var job = new JobFaker().Generate("default,Pending");

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

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

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

            await dbContext.SaveChangesAsync();

            // assert
            await using var actualDbContext = GetDbContext();
            var actual = actualDbContext.Jobs.Find(job.Id);

            actual.Should().BeEquivalentTo(updated);
        }