Esempio n. 1
0
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'
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 9
0
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()