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