Ejemplo n.º 1
0
        public async Task TestDroneAtendePedidoQuandoDroneExiste()
        {
            var droneService = new DroneService(_coordinateService,
                                                _pedidoDroneRepository,
                                                _droneRepository,
                                                _pedidoRepository);
            var pedidoService = new PedidoService(droneService, _coordinateService);

            _coordinateService.GetKmDistance(Arg.Any <Point>(), Arg.Any <Point>())
            .Returns(10);
            _pedidoDroneRepository.RetornaPedidosEmAberto().Returns(SetupTests.GetPedidoDrones(StatusEnvio.AGUARDANDO));
            _droneRepository.RetornaDroneStatus(Arg.Any <int>())
            .Returns(SetupTests.GetDroneStatusDto());
            var drone = await pedidoService.DroneAtendePedido(SetupTests.GetPedido());

            Assert.True(drone != null);
        }
        /// <summary>
        /// Retorna os drones que podem ser utilizados para a entrega
        /// </summary>
        /// <param name="distance">Distancia entre o ponto de entrega e o endereço adicionado</param>
        /// <param name="pedido"></param>
        /// <returns></returns>
        public async Task <DroneStatusDto> GetAvailiableDroneAsync(double distance, Pedido pedido)
        {
            var drones = (await _pedidoDroneRepository.RetornaPedidosEmAberto())
                         .Select(d => new
            {
                distance = _coordinateService.GetKmDistance(d.Pedido.GetPoint(), pedido.GetPoint()),
                droneId  = d.DroneId
            }).OrderBy(p => p.distance);



            if (drones != null)
            {
                foreach (var drone in drones)
                {
                    var resultado = await _droneRepository.RetornaDroneStatus(drone.droneId).ConfigureAwait(false);

                    if (ConsegueCarregar(resultado, drone.distance, distance, pedido))
                    {
                        return(resultado);
                    }
                    else
                    {
                        var distanciaPedido = resultado.SomaDistancia + distance + drone.distance;
                        await _pedidoDroneRepository.UpdatePedidoDrone(resultado, distanciaPedido)
                        .ConfigureAwait(false);
                    }
                }
                return(null);
            }
            else
            {
                await FinalizaPedidosAsync();

                var drone = _droneRepository.RetornaDrone();
                return(new DroneStatusDto(drone));
            }
        }