public void EmptyGuidValue_TrowsInvalidEngineIdException()
        {
            var stubCommand = GetValidUpdateEngineCommand();

            stubCommand.Id = new Guid();

            Assert.Throws <InvalidEngineIdException>(() => updateEngineCommandValidator.Validate(stubCommand));
        }
예제 #2
0
        public void EmptyGuidIdValue_ThrowsInvalidManufacturerIdException()
        {
            var stubCommand = GetValidAddManufacturerCommand();

            stubCommand.Id = new Guid();

            Assert.Throws <InvalidManufacturerIdException>(() => addManufacturerValidator.Validate(stubCommand));
        }
        public void EmptyGuidIdValue_ThrowsInvalidVehicleIdException()
        {
            var stubCommand = GetValidDeleteVehicleCommand();

            stubCommand.Id = new Guid();

            Assert.Throws <InvalidVehicleIdException>(() => deleteVehicleValidator.Validate(stubCommand));
        }
        public void EmptyConsumptionReportId_ThrowsInvalidConsumptionReportId()
        {
            var stubCommand = GetValidCeleteConsumptionReportCommand();

            stubCommand.Id = new Guid();

            Assert.Throws <InvalidConsumptionReportIdException>(() => deleteConsumtionReportValidator.Validate(stubCommand));
        }
        public void FuelTypeValueOutOfEnumRange_ThrowsInvalidFuelTypeException()
        {
            var stubCommand = GetStubValidCommand();

            stubCommand.FuelType = (FuelType)3;

            Assert.Throws <FuelTypeOutOfRangeException>(() => addEngineCommandValidator.Validate(stubCommand));
        }
예제 #6
0
        public void Validate_WithNullArgs_ShouldThrowArgumentNullException()
        {
            // Arrange

            // Act
            Action action = () => _sut.Validate(CommandType.CreateNewSheet, null, null);

            // Assert
            action.Should().ThrowExactly <ArgumentNullException>();
        }
예제 #7
0
        public void CommandValid_EngineDeleted()
        {
            var engineId            = InsertEngineToDatabase();
            var deleteEngineCommand = new DeleteEngine(engineId);

            A.CallTo(() => deleteEngineValidator.Validate(deleteEngineCommand)).DoesNothing();

            deleteEngineHandler.Handle(deleteEngineCommand);
            context.SaveChanges();

            var result = context.Engine.FirstOrDefault(e => e.Id == engineId);

            A.CallTo(() => deleteEngineValidator.Validate(deleteEngineCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.Null(result);
        }
예제 #8
0
        private async ValueTask <ICommandResult> Process <TCommand>(TCommand command, CancellationToken cancellationToken = default) where TCommand : ICommand
        {
            var commandResult = new CommandResult();

            try
            {
                await _permissionValidator.Validate(command, cancellationToken).ConfigureAwait(false);

                await _validation.Validate(command, cancellationToken).ConfigureAwait(false);

                var concreteCommand = _mapper.CreateConcreteObject(command);
                var handler         = _resolveHandler.ResolveHandler <ICommandHandler <TCommand> >();
                commandResult = (CommandResult)await handler.Handle(concreteCommand).ConfigureAwait(false);

                await _eventPublisher.Publish(commandResult.Events, cancellationToken).ConfigureAwait(false);
            }
            catch (PermissionValidationException ex)
            {
                _logger.Error(ex, "Error command permission validation");
                commandResult.Exception = ex;
            }
            catch (ValidationException ex)
            {
                _logger.Error(ex, "Error command validation");
                commandResult.Exception = ex;
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Command was not successful");
                commandResult.Exception = ex;
            }

            return(commandResult);
        }
예제 #9
0
        public ActionResult <Issue> Create(CreateIssueCommand createIssueCommand)
        {
            _createIssueCommandValidator.Validate(createIssueCommand);
            var createdIssueId = _createIssueOperationService.Create(createIssueCommand);

            return(Get(createdIssueId));
        }
예제 #10
0
        public async Task <TResponse> Handle(TCommand request, CancellationToken cancellationToken, RequestHandlerDelegate <TResponse> next)
        {
            if (request == null)
            {
                throw new ArgumentNullException($"{typeof(TCommand)} is null");
            }

            if (_commandValidator == null)
            {
                return(await next());
            }

            if ((_commandValidator is CommandValidator <TCommand>) == false)
            {
                throw new ArgumentException($"{typeof(ICommandValidator<TCommand>)} is not CommandValidator");
            }

            var validationResult = _commandValidator.Validate(request);

            if (validationResult.IsValid == false)
            {
                //TODO
                throw new CommandValidationException(validationResult);
                // throw new CommandValidationException($"CommandException: {validationResult.Errors[0].ErrorMessage}");
            }

            return(await  next());
        }
예제 #11
0
        public void Handle(DeleteVehicle command)
        {
            commandValidator.Validate(command);
            var vehicleToDelete = unitOfWork.Context.Vehicle.Single(s => s.Id == command.Id);

            var consumptionReportsToDelete = unitOfWork.Context.ConsumptionReport.Where(c => c.VehicleId == vehicleToDelete.Id);

            unitOfWork.Context.ConsumptionReport.RemoveRange(consumptionReportsToDelete);

            var fuelSummaryToDelete = unitOfWork.Context.FuelSummary.Where(f => f.VehicleId == vehicleToDelete.Id).SingleOrDefault();

            if (fuelSummaryToDelete != null)
            {
                unitOfWork.Context.FuelSummary.Remove(fuelSummaryToDelete);
            }

            if (vehicleToDelete != null)
            {
                unitOfWork.Context.Vehicle.Remove(vehicleToDelete);
            }
            else
            {
                throw new VehicleNotFoundException(command.Id);
            }
        }
예제 #12
0
        public void Handle(UpdateVehicle command)
        {
            commandValidator.Validate(command);

            var vehicleToUpdate = unitOfWork.Context.Vehicle.Single(v => v.Id == command.Id);

            if (vehicleToUpdate == null)
            {
                throw new VehicleNotFoundException(command.Id);
            }

            if (command.EngineId.HasValue)
            {
                var selectedEngine = unitOfWork.Context.Engine.FirstOrDefault(e => e.Id == command.EngineId);
                if (selectedEngine == null)
                {
                    throw new EngineNotFoundException(command.EngineId.Value);
                }

                vehicleToUpdate.ProductionYear = command.ProductionYear;
                vehicleToUpdate.EngineId       = command.EngineId;
            }

            vehicleToUpdate.ProductionYear = command.ProductionYear;
        }
예제 #13
0
        public void CommandValid_VehicleDeleted()
        {
            var modelId              = InsertModelToDatabase();
            var vehicleId            = InsertVehicleToDatabase(modelId);
            var deleteVehicleCommand = new DeleteVehicle(vehicleId);

            A.CallTo(() => deleteVehicleValidator.Validate(deleteVehicleCommand)).DoesNothing();

            deleteVehicleHandler.Handle(deleteVehicleCommand);

            context.SaveChanges();
            var result = context.Vehicle.FirstOrDefault(m => m.Id == deleteVehicleCommand.Id);

            A.CallTo(() => deleteVehicleValidator.Validate(deleteVehicleCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.Null(result);
        }
        public void CommandValid_ManufacturerDeleted()
        {
            var manufacturerId         = InsertManufacturerToDatabase();
            var modelId                = InsertModelToDatabase(manufacturerId);
            var deleteModelNameCommand = new DeleteModelName(manufacturerId, modelId);

            A.CallTo(() => deleteModelNameValidator.Validate(deleteModelNameCommand)).DoesNothing();

            deleteModelNameHandler.Handle(deleteModelNameCommand);

            context.SaveChanges();
            var result = context.ModelName.FirstOrDefault(m => m.Id == deleteModelNameCommand.Id);

            A.CallTo(() => deleteModelNameValidator.Validate(deleteModelNameCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.Null(result);
        }
예제 #15
0
        public void Handle(TCommand command)
        {
            // Validate command, should throw ArgumentException if invalid
            validator.Validate(command);

            commandHandler.Handle(command);
        }
        public void Handle(string line)
        {
            var(type, args) = _parser.Parse(line, SimpleHandler.LineSeparator);
            _validator.Validate(type, args, this.CurrentSheet);
            var command = CommandFactory.Create(type, args, this.CurrentSheet);

            this.CurrentSheet = command.Execute();
        }
        public void CommandValid_ManufacturerUpdated()
        {
            var manufacturerId            = InsertManufacturerToDatabase();
            var updateManufacturerCommand = new UpdateManufacturer(manufacturerId, "UpdatedName");

            A.CallTo(() => updateManufacturerValidator.Validate(updateManufacturerCommand)).DoesNothing();

            updateManufacturerHandler.Handle(updateManufacturerCommand);

            context.SaveChanges();
            var result = context.Manufacturer.FirstOrDefault(m => m.Id == updateManufacturerCommand.Id);

            A.CallTo(() => updateManufacturerValidator.Validate(updateManufacturerCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.NotNull(result);
            Assert.Equal(result.Id, updateManufacturerCommand.Id);
            Assert.Equal(result.Name, updateManufacturerCommand.Name);
        }
        public void EmptyIdGuidValue_ThrowsInvalidCalculateFuelConsumptionIdException()
        {
            var stubCommand = GetValidCalculateFuelConsumptionCommand();
            stubCommand.Id = new Guid();

            Assert.Throws<InvalidCalculateFuelConsumptionIdException>(() => calculateFuelConsumptionValidator.Validate(stubCommand));
        }
        public void CommandValid_ModelNameAdded()
        {
            var manufacturerId      = InsertManufacturerToDatabase();
            var addModelNameCommand = new AddModelName(manufacturerId, expectedModelName);

            A.CallTo(() => addModelNameValidator.Validate(addModelNameCommand)).DoesNothing();

            addModelNameHandler.Handle(addModelNameCommand);
            context.SaveChanges();

            var result = context.ModelName.FirstOrDefault(m => m.Id == addModelNameCommand.Id);

            A.CallTo(() => addModelNameValidator.Validate(addModelNameCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.NotNull(result);
            Assert.Equal(addModelNameCommand.Id, result.Id);
            Assert.Equal(expectedModelName, result.Name);
            Assert.Equal(manufacturerId, result.ManufacturerId);
        }
예제 #20
0
        public void CommandValid_VehicleAdded()
        {
            var modelId           = InsertModelToDatabase();
            var userId            = InsertUserToDatabase();
            var addVehicleCommand = new AddVehicle(modelId, userId);

            A.CallTo(() => addVehicleValidator.Validate(addVehicleCommand)).DoesNothing();

            addVehicleHandler.Handle(addVehicleCommand);
            context.SaveChanges();

            var result = context.Vehicle.FirstOrDefault(v => v.Id == addVehicleCommand.Id);

            A.CallTo(() => addVehicleValidator.Validate(addVehicleCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.NotNull(result);
            Assert.Equal(addVehicleCommand.Id, result.Id);
            Assert.Equal(addVehicleCommand.ModelNameId, result.ModelNameId);
        }
예제 #21
0
        public void CommandValid_EngineUpdated()
        {
            var vehicleId            = InsertVehicleToDatabase();
            var engineId             = InsertEngineToDatabase();
            var updateVehicleCommand = new UpdateVehicle(vehicleId, 2010, engineId);

            A.CallTo(() => updateVehicleValidator.Validate(updateVehicleCommand)).DoesNothing();

            updateVehicleHandler.Handle(updateVehicleCommand);

            context.SaveChanges();
            var result = context.Vehicle.FirstOrDefault(v => v.Id == updateVehicleCommand.Id);

            A.CallTo(() => updateVehicleValidator.Validate(updateVehicleCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.NotNull(result);
            Assert.Equal(result.Id, updateVehicleCommand.Id);
            Assert.Equal(result.ProductionYear, updateVehicleCommand.ProductionYear);
            Assert.Equal(result.EngineId, updateVehicleCommand.EngineId);
        }
예제 #22
0
        private static bool ValidateCommand(CommandHandlerRequest request)
        {
            Contract.Requires(request != null);
            Contract.Requires(request.Configuration != null);

            ICommandValidator validator = request.Configuration.Services.GetCommandValidator();
            bool valid = validator.Validate(request);

            return(valid);
        }
예제 #23
0
        public void Handle(UpdateManufacturer command)
        {
            commandValidator.Validate(command);

            var manufacturerToUpdate = unitOfWork.Context.Manufacturer.Single(e => e.Id == command.Id);

            manufacturerToUpdate.Name = command.Name;

            unitOfWork.Context.Entry(manufacturerToUpdate).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
        }
예제 #24
0
        public void Handle(DeleteConsumptionReport command)
        {
            commandValidator.Validate(command);

            var reportToDelete = unitOfWork.Context.ConsumptionReport.Where(r => r.VehicleId == command.VehicleId).SingleOrDefault(r => r.Id == command.Id);

            if (reportToDelete == null)
            {
                throw new ConsumptionReportNotFoundException(command.VehicleId, command.Id);
            }

            var fuelSummaryToUpdate = unitOfWork.Context.FuelSummary.SingleOrDefault(f => f.VehicleId == reportToDelete.VehicleId);

            if (fuelSummaryToUpdate == null)
            {
                throw new FuelSummaryNotFoundException(reportToDelete.VehicleId);
            }

            if (reportToDelete.Units == fuelSummaryToUpdate.Units)
            {
                fuelSummaryToUpdate.DistanceDriven -= reportToDelete.Distance;
                fuelSummaryToUpdate.FuelBurned     -= reportToDelete.FuelBurned;
                fuelSummaryToUpdate.MoneySpent     -= (reportToDelete.PricePerUnit * reportToDelete.FuelBurned);

                switch (fuelSummaryToUpdate.Units)
                {
                case Units.Metric:
                    fuelSummaryToUpdate.AverageConsumption = (fuelSummaryToUpdate.FuelBurned * 100) / fuelSummaryToUpdate.DistanceDriven;
                    break;

                case Units.Imperial:
                    fuelSummaryToUpdate.AverageConsumption = fuelSummaryToUpdate.DistanceDriven / fuelSummaryToUpdate.FuelBurned;
                    break;
                }
            }
            else
            {
                if (reportToDelete.Units == Units.Imperial && fuelSummaryToUpdate.Units == Units.Metric)
                {
                    fuelSummaryToUpdate.DistanceDriven    -= reportToDelete.Distance * UnitsConverters.MilesToKilometersConst;
                    fuelSummaryToUpdate.FuelBurned        -= reportToDelete.FuelBurned * UnitsConverters.GalonsToLitresConst;
                    fuelSummaryToUpdate.AverageConsumption = (fuelSummaryToUpdate.FuelBurned * 100) / fuelSummaryToUpdate.DistanceDriven;
                }

                if (reportToDelete.Units == Units.Metric && fuelSummaryToUpdate.Units == Units.Imperial)
                {
                    fuelSummaryToUpdate.DistanceDriven    -= reportToDelete.Distance * UnitsConverters.KilometersToMilesConst;
                    fuelSummaryToUpdate.FuelBurned        -= reportToDelete.FuelBurned * UnitsConverters.LitresToGalonsConst;
                    fuelSummaryToUpdate.AverageConsumption = fuelSummaryToUpdate.DistanceDriven / fuelSummaryToUpdate.FuelBurned;
                }
            }

            unitOfWork.Context.Entry(reportToDelete).State      = Microsoft.EntityFrameworkCore.EntityState.Deleted;
            unitOfWork.Context.Entry(fuelSummaryToUpdate).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
        }
        public async Task HandleAsync(T command, CancellationToken cancellationToken)
        {
            var results = _commandValidator.Validate(command);

            if (!results.IsValid)
            {
                var failures = results.Errors.Where(f => f != null).ToList();
                throw new ValidationException(failures);
            }
            await _decoratee.HandleAsync(command, cancellationToken);
        }
        public void Handle(T command)
        {
            var results = _validator.Validate(command);

            if (!results.IsValid)
            {
                throw new ValidationException(results.Errors);
            }

            _decoratee.Handle(command);
        }
예제 #27
0
        public void CommandValid_EngineAdded()
        {
            var addEngineCommand = new AddEngine("Test", 10, 10, 4, 10, FuelType.Diesel);

            A.CallTo(() => addEngineValidator.Validate(addEngineCommand)).DoesNothing();

            addEngineHandler.Handle(addEngineCommand);

            context.SaveChanges();
            var result = context.Engine.FirstOrDefault(e => e.Id == addEngineCommand.Id);

            A.CallTo(() => addEngineValidator.Validate(addEngineCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.NotNull(result);
            Assert.Equal(result.Id, addEngineCommand.Id);
            Assert.Equal(result.Name, addEngineCommand.Name);
            Assert.Equal(result.Power, addEngineCommand.Power);
            Assert.Equal(result.Torque, addEngineCommand.Torque);
            Assert.Equal(result.Cylinders, addEngineCommand.Cylinders);
            Assert.Equal(result.Displacement, addEngineCommand.Displacement);
            Assert.Equal(result.FuelType, addEngineCommand.FuelType);
        }
예제 #28
0
        public void CommandValid_EngineUpdated()
        {
            var engineId            = InsertEngineToDatabase();
            var updateEngineCommand = new UpdateEngine(engineId, "Updated", power: 150, torque: 300, cylinders: 6, displacement: 3000);

            A.CallTo(() => updateEngineValidator.Validate(updateEngineCommand)).DoesNothing();

            updateEngineHandler.Handle(updateEngineCommand);

            context.SaveChanges();
            var result = context.Engine.FirstOrDefault(e => e.Id == updateEngineCommand.Id);

            A.CallTo(() => updateEngineValidator.Validate(updateEngineCommand)).MustHaveHappened(Repeated.Exactly.Once);
            Assert.NotNull(result);
            Assert.Equal(result.Id, updateEngineCommand.Id);
            Assert.Equal(result.Name, updateEngineCommand.Name);
            Assert.Equal(result.Power, updateEngineCommand.Power);
            Assert.Equal(result.Torque, updateEngineCommand.Torque);
            Assert.Equal(result.Cylinders, updateEngineCommand.Cylinders);
            Assert.Equal(result.Displacement, updateEngineCommand.Displacement);
        }
예제 #29
0
        public void Handle(DeleteModelName command)
        {
            commandValidator.Validate(command);
            var modelToDelete = unitOfWork.Context.ModelName.Where(m => m.ManufacturerId == command.ManufacturerId).Single(m => m.Id == command.Id);

            if (modelToDelete == null)
            {
                throw new ModelNotFoundException(command.ManufacturerId, command.Id);
            }

            unitOfWork.Context.Entry(modelToDelete).State = Microsoft.EntityFrameworkCore.EntityState.Deleted;
        }
        public void Handle(DeleteManufacturer command)
        {
            commandValidator.Validate(command);

            var manufacturerToDelete = unitOfWork.Context.Manufacturer.Single(m => m.Id == command.Id);
            var modelsToDelete       = unitOfWork.Context.ModelName.Where(m => m.ManufacturerId == manufacturerToDelete.Id);

            unitOfWork.Context.Entry(manufacturerToDelete).State = Microsoft.EntityFrameworkCore.EntityState.Deleted;
            foreach (var model in modelsToDelete)
            {
                unitOfWork.Context.Entry(model).State = Microsoft.EntityFrameworkCore.EntityState.Deleted;
            }
        }