def test_get_route_by_id(client): #Create a route coordinates1 = [{ "longitude": 2.2, "latitude": 3.5, "datetime": 34676 }, { "longitude": 6.8, "latitude": 7.4, "datetime": 47580 }] time1 = datetime.now() Ruta.create(user=USER_ID1, message=MESSAGE_ID1, date=time1, trajectory=coordinates1) ruta = { "distance_total": 46, "time": 6, "date": time1, "speed_km": 47, "speed_average": 44 } rv = client.get(f'/api/v1/{USER_ID1}/route/{MESSAGE_ID1}') assert sorted(ruta.items()) == sorted(rv.data.items()) #TO-DO: checkout that the values are correct #Undo changes in the database Ruta.delete().where(Ruta.message == MESSAGE_ID1).execute()
def test_get_route_by_id(client): #Create a route coordinates1=[{"longitude":2.2,"latitude":3.5,"datetime": 34676},{"longitude":6.8,"latitude":7.4,"datetime": 47580}] time1 = datetime.now().strftime("%a, %d %b %Y %H:%M:%S GMT") distance, time = 46, 6 Ruta.create( user= USER_ID1, message = MESSAGE_ID1, date = time1, trajectory = coordinates1, distance = distance, time = time ) ruta={"distance_total":distance,"time":time,"date": time1} rv = json.loads(client.get(f'/api/v1/{USER_ID1}/route/{MESSAGE_ID1}').data) assert sorted(ruta.items()) == sorted(rv.items()) #TO-DO: checkout that the values are correct #Undo changes in the database Ruta.delete().where(Ruta.message == MESSAGE_ID1).execute()
def test_add_entry_when_already_exists(): # add route to the database store_location(USER_ID, MESSAGE_ID, {"longitude": 1.0, "latitude": 2.0, "datetime": 0}) store_location(USER_ID, MESSAGE_ID, {"longitude": 3.0, "latitude": 4.0, "datetime": 5}) route = Ruta.select().order_by(Ruta.id.desc()).get() assert len(route.trajectory) == 2 # undo changes Ruta.delete().where(Ruta.message == MESSAGE_ID).execute()
def test_delete_route_by_id(client): #Create a route coordinates1=[{"longitude":2.2,"latitude":3.5,"datetime": 34676},{"longitude":6.8,"latitude":7.4,"datetime": 47580}] Ruta.create( user= USER_ID1, message = MESSAGE_ID1, date = datetime.now(), trajectory = coordinates1 ) client.post(f'/api/v1/{USER_ID1}/route/{MESSAGE_ID1}') assert Ruta.get_or_none(message = MESSAGE_ID1 )==None
def test_add_entry_correct(): # add route to the database store_location(USER_ID, MESSAGE_ID, {"longitude": 1.0, "latitude": 2.0,"datetime": 0}) route = Ruta.select().order_by(Ruta.id.desc()).get() assert route.trajectory[0].get("longitude") == 1.0 assert route.trajectory[0].get("latitude") == 2.0 assert route.trajectory[0].get("datetime") == 0 assert route.user == USER_ID # undo changes Ruta.delete().where(Ruta.message == MESSAGE_ID).execute()
def store_location(user_id: int, m_id: int, position_data: Dict[str, Union[float, int]]): """ Store the trayectory point and time (position_data) produced by an user (user_id) in a message (m_id) """ if ("longitude" in position_data.keys()) and ( "latitude" in position_data.keys()) and ("datetime" in position_data.keys()): correct_types = type(position_data.get("longitude")) == float correct_types = correct_types and type( position_data.get("latitude")) == float correct_types = correct_types and type( position_data.get("datetime")) == int if correct_types: ruta = Ruta.get_or_none(message=m_id) if ruta: ruta.trajectory.append(position_data) if len(ruta.trajectory) >= 2: current_position = tuple([ position_data.get("longitude"), position_data.get("latitude") ]) previous_position = tuple([ ruta.trajectory[-2].get("longitude"), ruta.trajectory[-2].get("latitude") ]) ruta.distance += haversine(previous_position, current_position) ruta.time += position_data.get( "datetime") - ruta.trajectory[-2].get("datetime") ruta.save() else: Ruta.create( user=user_id, message=m_id, date=datetime.now(), trajectory=[position_data], time=0, distance=0.0, ) else: raise InvalidEntry("Invalid type for position_data") else: raise InvalidEntry("latitude or longitude not in the keys")
def test_add_distance_and_time_when_adding_entry(): store_location(USER_ID, MESSAGE_ID, {"longitude": 1.0, "latitude": 2.0, "datetime": 0}) store_location(USER_ID, MESSAGE_ID, {"longitude": 3.0, "latitude": 4.0, "datetime": 5}) store_location(USER_ID, MESSAGE_ID, {"longitude": 7.0, "latitude": 9.0, "datetime": 10}) route = Ruta.select().order_by(Ruta.id.desc()).get() pos1 = (1.0, 2.0) pos2 = (3.0, 4.0) pos3 = (7.0, 9.0) assert isclose(route.distance, haversine(pos1,pos2)+haversine(pos2,pos3), abs_tol=0.1) assert route.time == 10 # undo changes Ruta.delete().where(Ruta.message == MESSAGE_ID).execute()
def test_get_routes(client): #Create some routes coordinates1 = [{ "longitude": 2.2, "latitude": 3.5, "datetime": 34676 }, { "longitude": 6.8, "latitude": 7.4, "datetime": 47580 }] coordinates2 = [{"longitude": 4.7, "latitude": 1.9, "datetime": 30000}] time1 = datetime.now() Ruta.create(user=USER_ID1, message=MESSAGE_ID1, date=time1, trajectory=coordinates1) time2 = datetime.now() Ruta.create(user=USER_ID1, message=MESSAGE_ID2, date=time2, trajectory=coordinates2) rutas = [{ "user": USER_ID1, "message": MESSAGE_ID1, "date": time1, "trajectory": coordinates1 }, { "user": USER_ID1, "message": MESSAGE_ID2, "date": time2, "trajectory": coordinates2 }] rv = client.get(f'/api/v1/{USER_ID1}/my-routes') assert sorted(rutas.items()) == sorted(rv.data.items()) #Undo changes in the database Ruta.delete().where(Ruta.message == MESSAGE_ID1).execute() Ruta.delete().where(Ruta.message == MESSAGE_ID2).execute()
def get_route_by_id(user_id, route_id): """ Retrieve a route by it's id. Here we take user_id to ensure that not anyone can access the route_id. At least you need to know the user_id """ if request.method == 'GET': r = Ruta.get_or_none(message=route_id) if r != None: return jsonify({ "distance_total": r.distance, "time": r.time, "date": r.date, }) else: return jsonify({}) elif request.method == 'POST': ruta = Ruta.get_or_none(message=route_id) if (ruta != None) and (ruta.user == user_id): Ruta.delete().where(Ruta.message == route_id).execute() return "Deleted" return "Doesn't exist"
def get_routes(user_id): """ list all the routes available for an user_id. The result should be a json with basic information """ user_routes = Ruta.select().where(Ruta.user == user_id) routes = [] for route in user_routes: routes.append({ "user": user_id, "message": route.message, "date": route.date, "trajectory": route.trajectory }) return jsonify(routes)