public async Task <DroneStatusDto> GetAvailiableDroneAsync(double distance, Pedido pedido) { var drones = (await _pedidoDroneRepository.RetornaPedidosEmAbertoAsync()) .Select(d => new { distance = _coordinateService.GetKmDistance(pedido.GetPoint(), pedido.GetPoint()), droneId = d.DroneId }).OrderBy(p => p.distance); if (drones.FirstOrDefault() != null) { foreach (var drone in drones) { var pedidosDrone = await _pedidoDroneRepository.RetornarPedidosPorDrone(drone.droneId); var pesoAux = 0; foreach (var pedDrone in pedidosDrone) { var pedidoTemp = await _pedidoRepository.FindByIdAsync(pedDrone.PedidoId); pesoAux += pedidoTemp.Peso; } var resultado = _droneRepository.RetornaDroneStatus(drone.droneId); resultado.SomaPeso = pesoAux; if (ConsegueCarregar(resultado, drone.distance, distance, pedido)) { return(resultado); } else { var distanciaPedido = resultado.SomaDistancia + distance + drone.distance; await _pedidoDroneRepository.UpdatePedidoDroneAsync(resultado, distanciaPedido); } } return(null); } else { await FinalizaPedidosAsync(); var drone = _droneRepository.RetornaDrone(); return(new DroneStatusDto(drone)); } }
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.RetornaPedidosEmAbertoAsync().Returns(SetupTests.GetPedidoDrones(StatusEnvio.AGUARDANDO)); _droneRepository.RetornaDroneStatus(Arg.Any <int>()) .Returns(SetupTests.GetDroneStatusDto()); var drone = await pedidoService.DroneAtendePedido(SetupTests.GetPedido()); Assert.True(drone != null); }