public async Task <IActionResult> Create(DeliveryInputModel model)
        {
            if (!this.ModelState.IsValid)
            {
                return(this.View());
            }

            var robotId = await this.deliveryService.Create(model);

            return(RedirectToAction("Details", "Delivery", new{ id = robotId }));
        }
        public async Task <string> Create(DeliveryInputModel model)
        {
            var delivery = Mapper.Map <Delivery>(model);
            var sender   = this.Context.Users
                           .Include(x => x.Robots)
                           .Include(x => x.SentRobots)
                           .Include(x => x.ReceivedRobots)
                           .First(x => x.Id == model.SenderId);
            var receiver = this.Context.Users
                           .Include(x => x.Robots)
                           .Include(x => x.SentRobots)
                           .Include(x => x.ReceivedRobots)
                           .First(x => x.UserName == model.ReceiverUsername);

            delivery.ReceiverId = receiver.Id;

            var transportType = this.transportTypeService.GetTransportTypeByName(model.TransportTypeName);

            delivery.TransportTypeId = transportType.Id;

            var robot = this.Context.Robots
                        .Include(x => x.Deliveries)
                        .Include(x => x.Assembly)
                        .ThenInclude(x => x.SubAssemblies)
                        .ThenInclude(x => x.Parts)
                        .First(x => x.Id == model.RobotId);

            robot.UserId = receiver.Id;
            robot.Deliveries.Add(delivery);

            sender.Robots.Remove(robot);
            receiver.Robots.Add(robot);

            sender.SentRobots.Add(delivery);
            receiver.ReceivedRobots.Add(delivery);

            this.Context.Deliveries.Update(delivery);
            this.Context.Robots.Update(robot);
            this.Context.Users.Update(sender);
            this.Context.Users.Update(receiver);
            await this.Context.SaveChangesAsync();

            return(delivery.Id);
        }
        public void CreateDelivery_Should_Succeed()
        {
            var sender = new User()
            {
                Id       = "1",
                Name     = "Ivan Ivanov",
                UserName = "******"
            };

            var receiver = new User()
            {
                Id       = "2",
                Name     = "Gosho Goshov",
                UserName = "******"
            };

            var robot = new Robot()
            {
                Id           = "1",
                Name         = "myrobot",
                SerialNumber = "232323",
                UserId       = sender.Id
            };

            var transportType = new TransportType()
            {
                Id   = "4",
                Name = "bus"
            };

            this.userManager.CreateAsync(sender).GetAwaiter();
            this.userManager.CreateAsync(receiver).GetAwaiter();
            this.Context.Robots.Add(robot);
            this.Context.TransportTypes.Add(transportType);
            this.Context.SaveChanges();

            var deliveryInput = new DeliveryInputModel
            {
                StartingPoint     = "Stara Zagora",
                DestinationPoint  = "Plovdiv",
                Price             = 2.50m,
                RobotId           = robot.Id,
                SenderId          = sender.Id,
                ReceiverUsername  = receiver.UserName,
                TransportTypeName = transportType.Name
            };

            var result = this.deliveryService.Create(deliveryInput);

            var delivery = this.Context.Deliveries.First();

            result.Should().NotBeNull();
            delivery.Should().NotBeNull()
            .And.Subject.Should().BeEquivalentTo(new
            {
                Id              = result,
                SenderId        = sender.Id,
                ReceiverId      = receiver.Id,
                RobotId         = robot.Id,
                TransportTypeId = transportType.Id
            }, options => options.ExcludingMissingMembers());
        }