def setup_database(): """ we create two realtime_updates with the same vj but for different date and return a vj for navitia """ with app.app_context(): vj1 = model.VehicleJourney({'trip': {'id': 'vj:1'}}, date(2015, 11, 4)) vj2 = model.VehicleJourney({'trip': {'id': 'vj:2'}}, date(2015, 11, 4)) vj3 = model.VehicleJourney({'trip': {'id': 'vj:3'}}, date(2015, 11, 4)) tu1 = model.TripUpdate(vj1, contributor='realtime.ire') tu2 = model.TripUpdate(vj2, contributor='realtime.ire') tu3 = model.TripUpdate(vj3, contributor='realtime.timeo') rtu1 = model.RealTimeUpdate(None, 'ire') rtu1.created_at = datetime(2015, 11, 4, 6, 32) rtu1.trip_updates.append(tu1) model.db.session.add(rtu1) rtu2 = model.RealTimeUpdate(None, 'ire') rtu2.created_at = datetime(2015, 11, 4, 7, 32) rtu2.trip_updates.append(tu2) model.db.session.add(rtu2) rtu3 = model.RealTimeUpdate(None, 'ire') rtu3.created_at = datetime(2015, 11, 4, 7, 42) rtu3.trip_updates.append(tu3) model.db.session.add(rtu3) model.db.session.commit()
def test_cots_train_trip_removal(mock_navitia_fixture): """ test the import of cots_train_6113_trip_removal.json """ input_train_trip_removed = get_fixture_data( 'cots_train_6113_trip_removal.json') with app.app_context(): rt_update = model.RealTimeUpdate(input_train_trip_removed, connector='cots', contributor='realtime.cots') trip_updates = KirinModelBuilder(dumb_nav_wrapper()).build(rt_update) rt_update.trip_updates = trip_updates db.session.add(rt_update) db.session.commit() assert len(trip_updates) == 1 trip_up = trip_updates[0] assert trip_up.vj.navitia_trip_id == 'trip:OCETGV-87686006-87751008-2:25768' assert trip_up.vj_id == trip_up.vj.id assert trip_up.status == 'delete' # full trip removal : no stop_time to precise assert len(trip_up.stop_time_updates) == 0 # verify trip_update effect: assert trip_up.effect == 'NO_SERVICE'
def _make_rt_update(data): """ Create an RealTimeUpdate object for the query and persist it """ rt_update = model.RealTimeUpdate(data, connector='ire') model.db.session.add(rt_update) model.db.session.commit() return rt_update
def make_rt_update(data, connector, contributor, status='OK'): """ Create an RealTimeUpdate object for the query and persist it """ rt_update = model.RealTimeUpdate(data, connector=connector, contributor=contributor, status=status) model.db.session.add(rt_update) model.db.session.commit() return rt_update
def make_rt_update(raw_data: Any, contributor_id: str, status: str = "pending") -> RealTimeUpdate: """ Create an RealTimeUpdate object for the query and persist it """ rt_update = model.RealTimeUpdate(str(raw_data), contributor_id=contributor_id, status=status) new_relic.record_custom_parameter("real_time_update_id", rt_update.id) db_commit(rt_update) return rt_update
def make_rt_update(raw_data, connector_type, contributor_id, status="OK"): """ Create an RealTimeUpdate object for the query and persist it """ rt_update = model.RealTimeUpdate( raw_data, connector_type=connector_type, contributor_id=contributor_id, status=status ) new_relic.record_custom_parameter("real_time_update_id", rt_update.id) model.db.session.add(rt_update) model.db.session.commit() return rt_update
def test_cots_train_delayed(mock_navitia_fixture): """ test the import of cots_train_96231_delayed.json """ input_train_delayed = get_fixture_data('cots_train_96231_delayed.json') with app.app_context(): rt_update = model.RealTimeUpdate(input_train_delayed, connector='cots', contributor='realtime.cots') trip_updates = KirinModelBuilder(dumb_nav_wrapper()).build(rt_update) # we associate the trip_update manually for sqlalchemy to make the links rt_update.trip_updates = trip_updates db.session.add(rt_update) db.session.commit() assert len(trip_updates) == 1 trip_up = trip_updates[0] assert trip_up.vj.navitia_trip_id == 'trip:OCETrainTER-87212027-85000109-3:11859' assert trip_up.vj_id == trip_up.vj.id assert trip_up.status == 'update' assert trip_up.effect == 'SIGNIFICANT_DELAYS' # 5 stop times must have been created assert len(trip_up.stop_time_updates) == 6 # first impacted stop time should be 'gare de Sélestat' st = trip_up.stop_time_updates[1] assert st.id assert st.stop_id == 'stop_point:OCE:SP:TrainTER-87214056' # the COTS data has no listeHoraireProjeteArrivee, so the status is 'none' assert st.arrival is None # not computed yet assert st.arrival_delay is None assert st.arrival_status == 'none' assert st.departure is None assert st.departure_delay == timedelta(minutes=15) assert st.departure_status == 'update' assert st.message == 'Affluence exceptionnelle de voyageurs' # second impacted should be 'gare de Colmar' st = trip_up.stop_time_updates[2] assert st.id assert st.stop_id == 'stop_point:OCE:SP:TrainTER-87182014' assert st.arrival is None assert st.arrival_delay == timedelta(minutes=15) assert st.arrival_status == 'update' assert st.departure is None assert st.departure_delay == timedelta(minutes=15) assert st.departure_status == 'update' assert st.message == 'Affluence exceptionnelle de voyageurs' # last should be 'gare de Basel-SBB' st = trip_up.stop_time_updates[-1] assert st.id assert st.stop_id == 'stop_point:OCE:SP:TrainTER-85000109' assert st.arrival is None assert st.arrival_delay == timedelta(minutes=15) assert st.arrival_status == 'update' # no departure since it's the last (thus the departure will be before the arrival) assert st.departure is None assert st.departure_delay is None assert st.departure_status == 'none' assert st.message == 'Affluence exceptionnelle de voyageurs'
def test_get_action_on_trip_add(mock_navitia_fixture): """ Test the function _get_action_on_trip with different type of flux cots returns: 1. Fist trip add(AJOUTEE)-> FIRST_TIME_ADDED 2. Add followed by update (PERTURBEE) -> PREVIOUSLY_ADDED 3. Delete followed by add -> FIRST_TIME_ADDED """ with app.app_context(): # Test for the first add: should be FIRST_TIME_ADDED input_trip_add = get_fixture_data('cots_train_151515_added_trip.json') json_data = json.loads(input_trip_add) dict_version = model_maker.get_value(json_data, 'nouvelleVersion') train_numbers = model_maker.get_value(dict_version, 'numeroCourse') pdps = model_maker._retrieve_interesting_pdp( model_maker.get_value(dict_version, 'listePointDeParcours')) action_on_trip = model_maker._get_action_on_trip( train_numbers, dict_version, pdps) assert action_on_trip == ActionOnTrip.FIRST_TIME_ADDED.name # Test for add followed by update should be PREVIOUSLY_ADDED rt_update = model.RealTimeUpdate(input_trip_add, connector='cots', contributor='realtime.cots') trip_updates = KirinModelBuilder(dumb_nav_wrapper()).build(rt_update) _, log_dict = handle(rt_update, trip_updates, 'realtime.cots', is_new_complete=True) input_update_added_trip = get_fixture_data( 'cots_train_151515_added_trip_with_delay.json') json_data = json.loads(input_update_added_trip) dict_version = model_maker.get_value(json_data, 'nouvelleVersion') train_numbers = model_maker.get_value(dict_version, 'numeroCourse') pdps = model_maker._retrieve_interesting_pdp( model_maker.get_value(dict_version, 'listePointDeParcours')) action_on_trip = model_maker._get_action_on_trip( train_numbers, dict_version, pdps) assert action_on_trip == ActionOnTrip.PREVIOUSLY_ADDED.name # Clean database for further test tables = [str(table) for table in db.metadata.sorted_tables] db.session.execute('TRUNCATE {} CASCADE;'.format(', '.join(tables))) db.session.commit() # Delete the recently added trip followed by add: should be FIRST_TIME_ADDED rt_update = model.RealTimeUpdate(input_trip_add, connector='cots', contributor='realtime.cots') trip_updates = KirinModelBuilder(dumb_nav_wrapper()).build(rt_update) _, log_dict = handle(rt_update, trip_updates, 'realtime.cots', is_new_complete=True) input_trip_delete = get_fixture_data( 'cots_train_151515_deleted_trip_with_delay_and_stop_time_added.json' ) rt_update = model.RealTimeUpdate(input_trip_delete, connector='cots', contributor='realtime.cots') trip_updates = KirinModelBuilder(dumb_nav_wrapper()).build(rt_update) _, log_dict = handle(rt_update, trip_updates, 'realtime.cots', is_new_complete=True) input_added_trip = get_fixture_data( 'cots_train_151515_added_trip.json') json_data = json.loads(input_added_trip) dict_version = model_maker.get_value(json_data, 'nouvelleVersion') train_numbers = model_maker.get_value(dict_version, 'numeroCourse') pdps = model_maker._retrieve_interesting_pdp( model_maker.get_value(dict_version, 'listePointDeParcours')) action_on_trip = model_maker._get_action_on_trip( train_numbers, dict_version, pdps) assert action_on_trip == ActionOnTrip.FIRST_TIME_ADDED.name
def setup_database(): """ we create two realtime_updates with the same vj but for different date and return a vj for navitia """ with app.app_context(): vj1 = model.VehicleJourney( { 'trip': { 'id': 'vj:1' }, 'stop_times': [{ 'utc_arrival_time': time(9, 0), 'stop_point': { 'stop_area': { 'timezone': 'Europe/Paris' } } }] }, utc.localize(datetime(2015, 11, 4, 8, 0, 0)), utc.localize(datetime(2015, 11, 4, 10, 0, 0))) vj2 = model.VehicleJourney( { 'trip': { 'id': 'vj:2' }, 'stop_times': [{ 'utc_arrival_time': time(9, 0), 'stop_point': { 'stop_area': { 'timezone': 'Europe/Paris' } } }] }, utc.localize(datetime(2015, 11, 4, 8, 0, 0)), utc.localize(datetime(2015, 11, 4, 10, 0, 0))) vj3 = model.VehicleJourney( { 'trip': { 'id': 'vj:3' }, 'stop_times': [{ 'utc_arrival_time': time(9, 0), 'stop_point': { 'stop_area': { 'timezone': 'Europe/Paris' } } }] }, utc.localize(datetime(2015, 11, 4, 8, 0, 0)), utc.localize(datetime(2015, 11, 4, 10, 0, 0))) tu1 = model.TripUpdate(vj1, contributor='realtime.cots') tu2 = model.TripUpdate(vj2, contributor='realtime.cots') tu3 = model.TripUpdate(vj3, contributor='realtime.sherbrooke') rtu1 = model.RealTimeUpdate(None, 'cots', 'realtime.cots') rtu1.created_at = datetime(2015, 11, 4, 6, 32) rtu1.trip_updates.append(tu1) model.db.session.add(rtu1) rtu2 = model.RealTimeUpdate(None, 'cots', contributor='realtime.cots') rtu2.created_at = datetime(2015, 11, 4, 7, 32) rtu2.trip_updates.append(tu2) model.db.session.add(rtu2) rtu3 = model.RealTimeUpdate(None, 'gtfs-rt', contributor='realtime.sherbrooke') rtu3.created_at = datetime(2015, 11, 4, 7, 42) rtu3.trip_updates.append(tu3) model.db.session.add(rtu3) rtu4 = model.RealTimeUpdate( None, connector='gtfs-rt', contributor='realtime.sherbrooke', status='KO', error='No new information destinated to navitia for this gtfs-rt') rtu4.created_at = datetime(2015, 11, 4, 7, 52) model.db.session.add(rtu4) model.db.session.commit()