Exemple #1
0
        public void Planning_Too_Much_MaintenanceJobs_In_Parallel_Should_Throw_Exception()
        {
            // arrange
            var initializingEvents = new Event[] {
                new WorkshopPlanningCreatedEventBuilder().WithDate(DateTime.Today).Build()
            };
            WorkshopPlanning sut = new WorkshopPlanning(initializingEvents);

            VehicleBuilder vehicleBuilder = new VehicleBuilder();
            PlanMaintenanceJobCommandBuilder commandBuilder = new PlanMaintenanceJobCommandBuilder()
                                                              .WithVehicleBuilder(vehicleBuilder);

            PlanMaintenanceJob command1 = commandBuilder.Build();

            vehicleBuilder.WithLicenseNumber(Guid.NewGuid().ToString());
            PlanMaintenanceJob command2 = commandBuilder.Build();

            vehicleBuilder.WithLicenseNumber(Guid.NewGuid().ToString());
            PlanMaintenanceJob command3 = commandBuilder.Build();

            vehicleBuilder.WithLicenseNumber(Guid.NewGuid().ToString());
            PlanMaintenanceJob command4 = commandBuilder.Build();

            // act
            sut.PlanMaintenanceJob(command1);
            sut.PlanMaintenanceJob(command2);
            sut.PlanMaintenanceJob(command3);
            var thrownException = Assert.Throws <BusinessRuleViolationException>(() => {
                sut.PlanMaintenanceJob(command4); // 4th parallel job
            });

            // assert
            Assert.Equal("Maintenancejob overlaps with more than 3 other jobs.",
                         thrownException.Message);
        }
Exemple #2
0
        public void Plan_MaintenanceJob_That_Spans_Two_Days_Should_Throw_Exception()
        {
            // arrange
            DateTime date = DateTime.Today;
            var      initializingEvents = new Event[] {
                new WorkshopPlanningCreatedEventBuilder().WithDate(date).Build()
            };
            WorkshopPlanning sut = new WorkshopPlanning(date, initializingEvents);

            MaintenanceJobBuilder maintenanceJobBuilder = new MaintenanceJobBuilder();

            maintenanceJobBuilder
            .WithStartTime(DateTime.Today.AddHours(-2));     // to make the job span 2 days
            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .WithMaintenanceJobBuilder(maintenanceJobBuilder)
                                         .Build();

            // act
            var thrownException =
                Assert.Throws <BusinessRuleViolationException>(() => sut.PlanMaintenanceJob(command));

            // assert
            Assert.Equal("Start-time and end-time of a Maintenance Job must be within a 1 day.",
                         thrownException.Message);
        }
        public async void Given_A_Non_Existing_Job_The_Handler_Should_Return_Null()
        {
            // arrange
            DateTime           date = DateTime.Today;
            string             workshopPlanningId = date.ToString("yyy-MM-dd");
            PlanMaintenanceJob command            = new PlanMaintenanceJobCommandBuilder()
                                                    .Build();

            Mock <IMessagePublisher> messagePublisherMock = new Mock <IMessagePublisher>();
            Mock <IEventSourceRepository <WorkshopPlanning> > repoMock =
                new Mock <IEventSourceRepository <WorkshopPlanning> >();

            repoMock
            .Setup(m => m.GetByIdAsync(It.Is <string>(p => p == workshopPlanningId)))
            .Returns(Task.FromResult <WorkshopPlanning>(null));

            repoMock
            .Setup(m => m.SaveAsync(
                       It.Is <string>(p => p == workshopPlanningId),
                       It.Is <int>(p => p == 0),
                       It.Is <int>(p => p == 2),
                       It.Is <IEnumerable <Event> >(p =>
                                                    p.First().MessageType == "WorkshopPlanningCreated" &&
                                                    p.Last().MessageType == "MaintenanceJobPlanned")
                       ))
            .Returns(Task.CompletedTask);

            messagePublisherMock
            .Setup(m => m.PublishMessageAsync(
                       It.Is <string>(p => p == "WorkshopPlanningCreated"),
                       It.IsAny <object>(),
                       ""))
            .Returns(Task.CompletedTask);

            messagePublisherMock
            .Setup(m => m.PublishMessageAsync(
                       It.Is <string>(p => p == "MaintenanceJobPlanned"),
                       It.IsAny <object>(),
                       ""))
            .Returns(Task.CompletedTask);

            PlanMaintenanceJobCommandHandler sut =
                new PlanMaintenanceJobCommandHandler(messagePublisherMock.Object, repoMock.Object);

            // act
            WorkshopPlanning result = await sut.HandleCommandAsync(date, command);

            // assert
            messagePublisherMock.VerifyAll();
            messagePublisherMock.VerifyNoOtherCalls();
            repoMock.VerifyAll();
            repoMock.VerifyNoOtherCalls();
            Assert.IsAssignableFrom <WorkshopPlanning>(result);
        }
        public async void Given_A_Non_Existing_Job_The_Handler_Should_Return_Null()
        {
            // arrange
            DateTime           date    = DateTime.Today;
            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .Build();

            Mock <IMessagePublisher>           messagePublisherMock = new Mock <IMessagePublisher>(MockBehavior.Strict);
            Mock <IWorkshopPlanningRepository> repoMock             = new Mock <IWorkshopPlanningRepository>(MockBehavior.Strict);

            repoMock
            .Setup(m => m.GetWorkshopPlanningAsync(It.Is <DateTime>(p => p == date)))
            .Returns(Task.FromResult <WorkshopPlanning>(null));

            repoMock
            .Setup(m => m.SaveWorkshopPlanningAsync(
                       It.Is <string>(p => p == date.ToString("yyyy-MM-dd")),
                       It.Is <int>(p => p == 0),
                       It.Is <int>(p => p == 2),
                       It.Is <List <Event> >(p =>
                                             p[0].MessageType == "WorkshopPlanningCreated" &&
                                             p[1].MessageType == "MaintenanceJobPlanned")
                       ))
            .Returns(Task.CompletedTask);

            messagePublisherMock
            .Setup(m => m.PublishMessageAsync(
                       It.Is <string>(p => p == "WorkshopPlanningCreated"),
                       It.IsAny <object>(),
                       ""))
            .Returns(Task.CompletedTask);

            messagePublisherMock
            .Setup(m => m.PublishMessageAsync(
                       It.Is <string>(p => p == "MaintenanceJobPlanned"),
                       It.IsAny <object>(),
                       ""))
            .Returns(Task.CompletedTask);

            PlanMaintenanceJobCommandHandler sut =
                new PlanMaintenanceJobCommandHandler(messagePublisherMock.Object, repoMock.Object);

            // act
            WorkshopPlanning result = await sut.HandleCommandAsync(date, command);

            // assert
            messagePublisherMock.VerifyAll();
            repoMock.VerifyAll();
            Assert.IsAssignableFrom <WorkshopPlanning>(result);
        }
        public async void Given_An_Existing_Job_The_Handler_Should_Handle_The_Command()
        {
            // arrange
            DateTime date = DateTime.Today;
            string   workshopPlanningId = date.ToString("yyy-MM-dd");
            var      initializingEvents = new Event[] {
                new WorkshopPlanningCreatedEventBuilder().WithDate(date).Build()
            };
            WorkshopPlanning planning = new WorkshopPlanning(date, initializingEvents);

            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .Build();

            Mock <IMessagePublisher> messagePublisherMock = new Mock <IMessagePublisher>();
            Mock <IEventSourceRepository <WorkshopPlanning> > repoMock =
                new Mock <IEventSourceRepository <WorkshopPlanning> >();

            repoMock
            .Setup(m => m.GetByIdAsync(It.Is <string>(p => p == workshopPlanningId)))
            .Returns(Task.FromResult(planning));

            repoMock
            .Setup(m => m.SaveAsync(
                       It.Is <string>(p => p == planning.Id),
                       It.Is <int>(p => p == 1),
                       It.Is <int>(p => p == 2),
                       It.IsAny <List <Event> >()
                       ))
            .Returns(Task.CompletedTask);

            messagePublisherMock
            .Setup(m => m.PublishMessageAsync(
                       It.Is <string>(p => p == "MaintenanceJobPlanned"),
                       It.IsAny <object>(),
                       ""))
            .Returns(Task.CompletedTask);

            PlanMaintenanceJobCommandHandler sut =
                new PlanMaintenanceJobCommandHandler(messagePublisherMock.Object, repoMock.Object);

            // act
            WorkshopPlanning result = await sut.HandleCommandAsync(date, command);

            // assert
            messagePublisherMock.VerifyAll();
            messagePublisherMock.VerifyNoOtherCalls();
            repoMock.VerifyAll();
            repoMock.VerifyNoOtherCalls();
            Assert.IsAssignableFrom <WorkshopPlanning>(result);
        }
Exemple #6
0
        public async void Given_An_Existing_Job_The_Handler_Should_Handle_The_Command()
        {
            // arrange
            DateTime date = DateTime.Today;
            var      initializingEvents = new Event[] {
                new WorkshopPlanningCreated(Guid.NewGuid(), date)
            };
            WorkshopPlanning planning = new WorkshopPlanning(initializingEvents);

            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .Build();

            Mock <IMessagePublisher>           messagePublisherMock = new Mock <IMessagePublisher>(MockBehavior.Strict);
            Mock <IWorkshopPlanningRepository> repoMock             = new Mock <IWorkshopPlanningRepository>(MockBehavior.Strict);

            repoMock
            .Setup(m => m.GetWorkshopPlanningAsync(It.Is <DateTime>(p => p == date)))
            .Returns(Task.FromResult(planning));

            repoMock
            .Setup(m => m.SaveWorkshopPlanningAsync(
                       It.Is <string>(p => p == planning.Id),
                       It.Is <int>(p => p == 1),
                       It.Is <int>(p => p == 2),
                       It.IsAny <List <Event> >()
                       ))
            .Returns(Task.CompletedTask);

            messagePublisherMock
            .Setup(m => m.PublishMessageAsync(
                       It.Is <string>(p => p == "MaintenanceJobPlanned"),
                       It.IsAny <object>(),
                       ""))
            .Returns(Task.CompletedTask);

            PlanMaintenanceJobCommandHandler sut =
                new PlanMaintenanceJobCommandHandler(messagePublisherMock.Object, repoMock.Object);

            // act
            WorkshopPlanning result = await sut.HandleCommandAsync(date, command);

            // assert
            messagePublisherMock.VerifyAll();
            repoMock.VerifyAll();
            Assert.IsAssignableFrom <WorkshopPlanning>(result);
        }
Exemple #7
0
        public void Plan_Two_MaintenanceJobs_In_Parallel_For_The_Same_Vehicle_Should_Throw_Exception()
        {
            // arrange
            var initializingEvents = new Event[] {
                new WorkshopPlanningCreatedEventBuilder().Build()
            };
            WorkshopPlanning   sut     = new WorkshopPlanning(initializingEvents);
            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .Build();

            // act
            sut.PlanMaintenanceJob(command);
            var thrownException = Assert.Throws <BusinessRuleViolationException>(() => {
                sut.PlanMaintenanceJob(command); // parallel job for same vehicle
            });

            // assert
            Assert.Equal("Only 1 maintenance job can be executed on a vehicle during a certain time-slot.",
                         thrownException.Message);
        }
Exemple #8
0
        public void Plan_MaintenanceJob_Should_Add_A_New_MaintenanceJob()
        {
            // arrange
            DateTime date = DateTime.Today;
            string   workshopPlanningId = date.ToString("yyyy-MM-dd");
            var      initializingEvents = new Event[] {
                new WorkshopPlanningCreatedEventBuilder().WithDate(date).Build()
            };
            WorkshopPlanning sut = new WorkshopPlanning(date, initializingEvents);

            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .Build();

            // act
            sut.PlanMaintenanceJob(command);
            IEnumerable <Event> events = sut.GetEvents();

            // assert
            Assert.NotNull(sut);
            Assert.NotNull(sut.Id);
            Assert.Equal(workshopPlanningId, sut.Id);
            Assert.Equal(1, sut.OriginalVersion);
            Assert.Equal(2, sut.Version);
            Assert.Collection(sut.Jobs,
                              item0 =>
            {
                Assert.Equal(command.JobId, item0.Id);
                Assert.Equal(command.StartTime, item0.StartTime);
                Assert.Equal(command.EndTime, item0.EndTime);
                Assert.Equal(command.CustomerInfo.Id, item0.Customer.Id);
                Assert.Equal(command.CustomerInfo.Name, item0.Customer.Name);
                Assert.Equal(command.CustomerInfo.TelephoneNumber, item0.Customer.TelephoneNumber);
                Assert.Equal(command.VehicleInfo.LicenseNumber, item0.Vehicle.Id);
                Assert.Equal(command.VehicleInfo.Brand, item0.Vehicle.Brand);
                Assert.Equal(command.VehicleInfo.Type, item0.Vehicle.Type);
                Assert.Equal(command.CustomerInfo.Id, item0.Vehicle.OwnerId);
                Assert.Equal(command.Description, item0.Description);
            }
                              );
            Assert.Collection(events, item0 => Assert.IsAssignableFrom <MaintenanceJobPlanned>(item0));
        }
Exemple #9
0
        public void Plan_MaintenanceJob_Should_Add_A_New_MaintenanceJob()
        {
            // arrange
            DateTime date = DateTime.Today;
            var      initializingEvents = new Event[] {
                new WorkshopPlanningCreated(Guid.NewGuid(), date)
            };
            WorkshopPlanning sut = new WorkshopPlanning(initializingEvents);

            PlanMaintenanceJob command = new PlanMaintenanceJobCommandBuilder()
                                         .Build();

            // act
            List <Event> events = new List <Event>(sut.PlanMaintenanceJob(command));

            // assert
            Assert.NotNull(sut);
            Assert.NotNull(sut.Id);
            Assert.Equal(date, sut.Date);
            Assert.Equal(1, sut.OriginalVersion);
            Assert.Equal(2, sut.Version);
            Assert.Collection(sut.Jobs,
                              item0 => {
                Assert.Equal(command.JobId, item0.Id);
                Assert.Equal(command.StartTime, item0.StartTime);
                Assert.Equal(command.EndTime, item0.EndTime);
                Assert.Equal(command.CustomerInfo.Id, item0.Customer.CustomerId);
                Assert.Equal(command.CustomerInfo.Name, item0.Customer.Name);
                Assert.Equal(command.CustomerInfo.TelephoneNumber, item0.Customer.TelephoneNumber);
                Assert.Equal(command.VehicleInfo.LicenseNumber, item0.Vehicle.LicenseNumber);
                Assert.Equal(command.VehicleInfo.Brand, item0.Vehicle.Brand);
                Assert.Equal(command.VehicleInfo.Type, item0.Vehicle.Type);
                Assert.Equal(command.CustomerInfo.Id, item0.Vehicle.OwnerId);
                Assert.Equal(command.Description, item0.Description);
            }
                              );
            Assert.Collection(events, item0 => Assert.IsAssignableFrom <MaintenanceJobPlanned>(item0));
        }