Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Kraken] Fix aging problem when both kirin & chaos are active #3909

Merged
merged 8 commits into from
Jan 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions source/ed/build_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,10 @@ struct builder {
navitia::georef::Way* add_way(const std::string& name, const std::string& way_type, const bool visible = true);

const navitia::type::Data& get_data() { return *data.get(); }

const navitia::type::MetaVehicleJourney* get_meta_vj(const std::string& meta_vj_uri) const {
return data->pt_data->meta_vjs.get_mut(meta_vj_uri);
}
};

} // namespace ed
10 changes: 5 additions & 5 deletions source/jormungandr/tests/departure_board_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ def check_stop_schedule(response, reference):

for (resp_dt, ref_st) in zip_longest(resp['date_times'], ref.date_times):
assert get_not_null(resp_dt, 'date_time') == ref_st.dt
assert get_not_null(resp_dt, 'links')[0]['id'] == ref_st.vj
assert get_not_null(resp_dt, 'links')[0]['id'].find(ref_st.vj) == 0


def check_departures(response, reference):
Expand Down Expand Up @@ -934,9 +934,9 @@ def check_stop_schedule_rt_sol(stop_sched):
sp='S1',
route='A:0',
date_times=[
SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:modified:0:delay_vj1'),
SchedDT(dt='20160101T100700', vj='vehicle_journey:A:vj2:modified:0:delay_vj2'),
SchedDT(dt='20160101T110700', vj='vehicle_journey:A:vj3:modified:0:delay_vj3'),
SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:RealTime:'),
SchedDT(dt='20160101T100700', vj='vehicle_journey:A:vj2:RealTime:'),
SchedDT(dt='20160101T110700', vj='vehicle_journey:A:vj3:RealTime:'),
],
),
StopSchedule(
Expand Down Expand Up @@ -1016,7 +1016,7 @@ def test_stop_schedule_realtime_limit_per_schedule(self):
StopSchedule(
sp='S1',
route='A:0',
date_times=[SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:modified:0:delay_vj1')],
date_times=[SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:RealTime:')],
),
StopSchedule(
sp='S1', route='B:1', date_times=[SchedDT(dt='20160101T113000', vj='vehicle_journey:B:vj1')]
Expand Down
89 changes: 59 additions & 30 deletions source/jormungandr/tests/kirin_realtime_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,10 +327,10 @@ def test_vj_delay(self):
assert len(vjs[0]['codes']) == 2
assert len(vjs[1]['codes']) == 2
assert vjs[0]['id'] == 'vehicle_journey:vjA'
assert vjs[1]['id'] == 'vehicle_journey:vjA:modified:0:vjA_delayed'
assert 'vehicle_journey:vjA:RealTime:' in vjs[1]['id']

vj_ids = [vj['id'] for vj in pt_response['vehicle_journeys']]
assert 'vehicle_journey:vjA:modified:0:vjA_delayed' in vj_ids
assert vjs[1]['id'] in vj_ids

def _check_train_delay_disruption(dis):
is_valid_disruption(dis, chaos_disrup=False)
Expand Down Expand Up @@ -372,7 +372,9 @@ def _check_train_delay_disruption(dis):
# In order to not disturb the test, line M which was added afterwards for shared section tests, is forbidden here
new_response = self.query_region(journey_basic_query + "&data_freshness=realtime&forbidden_uris[]=M&")
assert get_arrivals(new_response) == ['20120614T080436', '20120614T080520']
assert get_used_vj(new_response) == [[], ['vehicle_journey:vjA:modified:0:vjA_delayed']]
used_vjs = get_used_vj(new_response)
assert used_vjs[0] == []
assert "vehicle_journey:vjA:RealTime:" in used_vjs[1][0]

pt_journey = new_response['journeys'][1]

Expand Down Expand Up @@ -475,7 +477,7 @@ def _check_train_delay_disruption(dis):
assert len(vjs[0]['codes']) == 2
assert len(vjs[1]['codes']) == 2
assert vjs[0]['id'] == 'vehicle_journey:vjA'
assert vjs[1]['id'] == 'vehicle_journey:vjA:modified:0:vjA_delayed'
assert 'vehicle_journey:vjA:RealTime:' in vjs[1]['id']

pt_response = self.query_region('vehicle_journeys/vehicle_journey:vjA?_current_datetime=20120614T1337')
assert len(pt_response['disruptions']) == 1
Expand Down Expand Up @@ -562,7 +564,7 @@ def _check_train_delay_disruption(dis):
assert len(vjs[0]['codes']) == 0
assert len(vjs[1]['codes']) == 0
assert vjs[0]['id'] == 'vehicle_journey:vjB'
assert 'vehicle_journey:vjB:modified' in vjs[1]['id']
assert 'vehicle_journey:vjB:RealTime' in vjs[1]['id']

vjA = self.query_region('vehicle_journeys/vehicle_journey:vjA?_current_datetime=20120614T1337')
# we now have 2 disruption on vjA
Expand Down Expand Up @@ -651,7 +653,7 @@ def test_vj_delay_day_after(self):
assert len(pt_response['vehicle_journeys']) == (initial_nb_vehicle_journeys + 1)

vj_ids = [vj['id'] for vj in pt_response['vehicle_journeys']]
assert 'vehicle_journey:vjA:modified:0:96231_2015-07-28_0' in vj_ids
assert any(('vehicle_journey:vjA:RealTime:' in vj_id for vj_id in vj_ids))

# we should see the disruption
pt_response = self.query_region('vehicle_journeys/vehicle_journey:vjA?_current_datetime=20120614T1337')
Expand Down Expand Up @@ -1723,10 +1725,17 @@ def test_stop_time_with_detour_and_arrival_before_deleted_at_the_end(self):
assert response['physical_modes'][0]['name'] == 'Tramway'

# Check attributes of deleted stop_time in the concerned vehicle_journey
vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
vj='vehicle_journey:vjA:modified:0:stop_time_with_detour', dt='20120614T080000'

# since the ids of impacted vjs are random uuid which cannot be know in advance... we have to request all vjs then retrieve the impacted one
vjs_query = 'vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
vjs = self.query_region(vjs_query)['vehicle_journeys']

impacted_vj = next((vj for vj in vjs if 'vehicle_journey:vjA:RealTime:' in vj['id']))
impacted_vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
vj=impacted_vj['id'], dt='20120614T080000'
)
response = self.query_region(vj_query)
response = self.query_region(impacted_vj_query)

assert has_the_disruption(response, 'stop_time_with_detour')
assert len(response['vehicle_journeys']) == 1
assert len(response['vehicle_journeys'][0]['stop_times']) == 3
Expand Down Expand Up @@ -1768,13 +1777,13 @@ def test_add_new_trip(self):
response = self.query_region(ptobj_query)
assert 'pt_objects' not in response

# Check that no vehicle_journey exists on the future realtime-trip
vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
vj='vehicle_journey:additional-trip:modified:0:new_trip', dt='20120614T080000'
)
response, status = self.query_region(vj_query, check=False)
assert status == 404
assert 'vehicle_journeys' not in response
# since the ids of impacted vjs are random uuid which cannot be know in advance... we have to request all vjs then retrieve the impacted one
vjs_query = 'vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
vjs = self.query_region(vjs_query)['vehicle_journeys']

impacted_vj = next((vj for vj in vjs if 'vehicle_journey:vjA:RealTime:' in vj['id']), None)
# No vj has been impacted yet
assert impacted_vj is None

# Check that no additional line exists
line_query = 'lines/{l}?_current_datetime={dt}'.format(l='line:stopC_stopB', dt='20120614T080000')
Expand Down Expand Up @@ -1895,6 +1904,15 @@ def test_add_new_trip(self):
assert len([o for o in response['pt_objects'] if o['id'] == 'line:stopC_stopB']) == 1
assert len([o for o in response['pt_objects'] if o['id'] == 'route:stopC_stopB']) == 1

vjs_query = 'vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
vjs = self.query_region(vjs_query)['vehicle_journeys']
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:additional-trip:RealTime:' in vj['id']), None)
assert impacted_vj

vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
vj=impacted_vj['id'], dt='20120614T080000'
)

# Check that the vehicle_journey has been created
response = self.query_region(vj_query)
assert has_the_disruption(response, 'new_trip')
Expand Down Expand Up @@ -1955,6 +1973,9 @@ def test_add_new_trip(self):
assert status == 404
assert 'vehicle_journeys' not in response

network_filter_query = 'vehicle_journeys/{vj}/networks?_current_datetime={dt}'.format(
vj=impacted_vj['id'], dt='20120614T080000'
)
response = self.query_region(network_filter_query)
assert len(response['networks']) == 1
assert response['networks'][0]['name'] == 'additional service'
Expand Down Expand Up @@ -2165,19 +2186,22 @@ def test_ptref_on_added_trip(self):
resp = self.query_region("lines/line:stopC_stopB/routes")
assert resp["routes"][0]["id"] == "route:stopC_stopB"
resp = self.query_region("lines/line:stopC_stopB/vehicle_journeys")
assert resp["vehicle_journeys"][0]["id"] == "vehicle_journey:additional-trip:modified:0:new_trip"
assert "vehicle_journey:additional-trip:RealTime:" in resp["vehicle_journeys"][0]["id"]
# Name and headsign are empty
assert resp["vehicle_journeys"][0]["name"] == ""
assert resp["vehicle_journeys"][0]["headsign"] == ""

# We should be able to get the line from vehicle_journey recently added
resp = self.query_region("vehicle_journeys/vehicle_journey:additional-trip:modified:0:new_trip/lines")
vjs_query = 'trips/additional-trip/vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
vjs = self.query_region(vjs_query)['vehicle_journeys']
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:additional-trip:RealTime:' in vj['id']), None)
assert impacted_vj

resp = self.query_region("vehicle_journeys/{vj_id}/lines".format(vj_id=impacted_vj['id']))
assert resp["lines"][0]["id"] == "line:stopC_stopB"

# We should be able to get the physical_mode sent in gtfs-rt from vehicle_journey recently added
resp = self.query_region(
"vehicle_journeys/vehicle_journey:additional-trip:modified:0:new_trip/physical_modes"
)
resp = self.query_region("vehicle_journeys/{vj_id}/physical_modes".format(vj_id=impacted_vj['id']))
assert resp["physical_modes"][0]["id"] == "physical_mode:Bus"

# The following ptref search should work with a trip added.
Expand Down Expand Up @@ -2228,13 +2252,11 @@ def test_ptref_on_added_trip(self):
assert resp["lines"][7]["id"] == "line:stopC_stopB"

# vehicle_journey <-> company
resp = self.query_region(
"vehicle_journeys/vehicle_journey:additional-trip:modified:0:new_trip/companies"
)
resp = self.query_region("vehicle_journeys/{vj_id}/companies".format(vj_id=impacted_vj['id']))
assert resp["companies"][0]["id"] == "base_company"
resp = self.query_region("companies/base_company/vehicle_journeys")
vjs = [vj["id"] for vj in resp["vehicle_journeys"]]
assert "vehicle_journey:additional-trip:modified:0:new_trip" in vjs
assert impacted_vj['id'] in vjs

# commercial_mode <-> company
resp = self.query_region("commercial_modes/commercial_mode:additional_service/companies")
Expand Down Expand Up @@ -2440,8 +2462,12 @@ def test_update_trip_with_physical_mode(self):
assert len(pt_response['vehicle_journeys']) == (initial_nb_vehicle_journeys + 1)

# physical_mode of the newly created vehicle_journey is the base vehicle_journey physical mode (Tramway)
vjs = self.query_region('trips/vjA/vehicle_journeys')['vehicle_journeys']
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:vjA:RealTime:' in vj['id']), None)
assert impacted_vj

pt_response = self.query_region(
'vehicle_journeys/vehicle_journey:vjA:modified:0:vjA_delayed/physical_modes'
'vehicle_journeys/{vj_id}/physical_modes'.format(vj_id=impacted_vj['id'])
)
assert len(pt_response['physical_modes']) == 1
assert pt_response['physical_modes'][0]['name'] == 'Tramway'
Expand Down Expand Up @@ -2513,10 +2539,13 @@ def test_add_trip_with_headsign(self):
assert pt_journey['sections'][0]['display_informations']['headsign'] == 'trip_headsign'

# Check the vehicle_journey created by real-time
new_vj = self.query_region('vehicle_journeys/vehicle_journey:additional-trip:modified:0:new_trip')
assert len(new_vj['vehicle_journeys']) == 1
assert (new_vj['vehicle_journeys'][0]['name']) == 'trip_headsign'
assert (new_vj['vehicle_journeys'][0]['headsign']) == 'trip_headsign'
vjs = self.query_region('trips/additional-trip/vehicle_journeys')['vehicle_journeys']
new_vjs = [vj for vj in vjs if 'vehicle_journey:additional-trip:RealTime:' in vj['id']]
assert len(new_vjs) == 1

new_vj = new_vjs[0]
assert new_vj['name'] == 'trip_headsign'
assert new_vj['headsign'] == 'trip_headsign'


@dataset(MAIN_ROUTING_TEST_SETTING_NO_ADD)
Expand Down
46 changes: 38 additions & 8 deletions source/jormungandr/tests/rail_sections_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,10 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopAA-> stopBB / realtime: No disruption
r = journeys(_from='stopAA', to='stopBB', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]
d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand Down Expand Up @@ -544,7 +547,10 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopAA-> stopFF / realtime: No disruption to display
r = journeys(_from='stopAA', to='stopGG', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]
d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand All @@ -566,7 +572,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopCC-> stopFF / realtime: No disruption
r = journeys(_from='stopCC', to='stopFF', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]

d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand Down Expand Up @@ -606,7 +616,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopGG-> stopII / realtime: No disruption
r = journeys(_from='stopGG', to='stopII', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]

d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand Down Expand Up @@ -908,7 +922,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopAA-> stopBB / realtime: No disruption
r = journeys(_from='stopAA', to='stopBB', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]

d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand Down Expand Up @@ -980,7 +998,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopAA-> stopFF / realtime: No disruption to display
r = journeys(_from='stopAA', to='stopGG', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]

d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand All @@ -1002,7 +1024,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopCC-> stopFF / realtime: No disruption
r = journeys(_from='stopCC', to='stopFF', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]

d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand Down Expand Up @@ -1042,7 +1068,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
# stopGG-> stopII / realtime: No disruption
r = journeys(_from='stopGG', to='stopII', data_freshness="realtime")
assert len(r["journeys"]) == 1
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]

vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]

d = get_all_element_disruptions(r['journeys'], r)
assert not impacted_headsigns(d)
for disruption, result in scenario.items():
Expand Down
Loading