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