Skip to content

Commit 05bdfdb

Browse files
author
Patrick Qian
authored
Merge pull request #3909 from hove-io/fix_kraken_aging_problem_with_realtime
[Kraken] Fix aging problem when both kirin & chaos are active
2 parents 5abdae1 + 6bfc01c commit 05bdfdb

13 files changed

+846
-577
lines changed

source/ed/build_helper.h

+4
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,10 @@ struct builder {
409409
navitia::georef::Way* add_way(const std::string& name, const std::string& way_type, const bool visible = true);
410410

411411
const navitia::type::Data& get_data() { return *data.get(); }
412+
413+
const navitia::type::MetaVehicleJourney* get_meta_vj(const std::string& meta_vj_uri) const {
414+
return data->pt_data->meta_vjs.get_mut(meta_vj_uri);
415+
}
412416
};
413417

414418
} // namespace ed

source/jormungandr/tests/departure_board_tests.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ def check_stop_schedule(response, reference):
833833

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

838838

839839
def check_departures(response, reference):
@@ -934,9 +934,9 @@ def check_stop_schedule_rt_sol(stop_sched):
934934
sp='S1',
935935
route='A:0',
936936
date_times=[
937-
SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:modified:0:delay_vj1'),
938-
SchedDT(dt='20160101T100700', vj='vehicle_journey:A:vj2:modified:0:delay_vj2'),
939-
SchedDT(dt='20160101T110700', vj='vehicle_journey:A:vj3:modified:0:delay_vj3'),
937+
SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:RealTime:'),
938+
SchedDT(dt='20160101T100700', vj='vehicle_journey:A:vj2:RealTime:'),
939+
SchedDT(dt='20160101T110700', vj='vehicle_journey:A:vj3:RealTime:'),
940940
],
941941
),
942942
StopSchedule(
@@ -1016,7 +1016,7 @@ def test_stop_schedule_realtime_limit_per_schedule(self):
10161016
StopSchedule(
10171017
sp='S1',
10181018
route='A:0',
1019-
date_times=[SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:modified:0:delay_vj1')],
1019+
date_times=[SchedDT(dt='20160101T090700', vj='vehicle_journey:A:vj1:RealTime:')],
10201020
),
10211021
StopSchedule(
10221022
sp='S1', route='B:1', date_times=[SchedDT(dt='20160101T113000', vj='vehicle_journey:B:vj1')]

source/jormungandr/tests/kirin_realtime_tests.py

+59-30
Original file line numberDiff line numberDiff line change
@@ -327,10 +327,10 @@ def test_vj_delay(self):
327327
assert len(vjs[0]['codes']) == 2
328328
assert len(vjs[1]['codes']) == 2
329329
assert vjs[0]['id'] == 'vehicle_journey:vjA'
330-
assert vjs[1]['id'] == 'vehicle_journey:vjA:modified:0:vjA_delayed'
330+
assert 'vehicle_journey:vjA:RealTime:' in vjs[1]['id']
331331

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

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

377379
pt_journey = new_response['journeys'][1]
378380

@@ -475,7 +477,7 @@ def _check_train_delay_disruption(dis):
475477
assert len(vjs[0]['codes']) == 2
476478
assert len(vjs[1]['codes']) == 2
477479
assert vjs[0]['id'] == 'vehicle_journey:vjA'
478-
assert vjs[1]['id'] == 'vehicle_journey:vjA:modified:0:vjA_delayed'
480+
assert 'vehicle_journey:vjA:RealTime:' in vjs[1]['id']
479481

480482
pt_response = self.query_region('vehicle_journeys/vehicle_journey:vjA?_current_datetime=20120614T1337')
481483
assert len(pt_response['disruptions']) == 1
@@ -562,7 +564,7 @@ def _check_train_delay_disruption(dis):
562564
assert len(vjs[0]['codes']) == 0
563565
assert len(vjs[1]['codes']) == 0
564566
assert vjs[0]['id'] == 'vehicle_journey:vjB'
565-
assert 'vehicle_journey:vjB:modified' in vjs[1]['id']
567+
assert 'vehicle_journey:vjB:RealTime' in vjs[1]['id']
566568

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

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

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

17251727
# Check attributes of deleted stop_time in the concerned vehicle_journey
1726-
vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
1727-
vj='vehicle_journey:vjA:modified:0:stop_time_with_detour', dt='20120614T080000'
1728+
1729+
# 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
1730+
vjs_query = 'vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
1731+
vjs = self.query_region(vjs_query)['vehicle_journeys']
1732+
1733+
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:vjA:RealTime:' in vj['id']))
1734+
impacted_vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
1735+
vj=impacted_vj['id'], dt='20120614T080000'
17281736
)
1729-
response = self.query_region(vj_query)
1737+
response = self.query_region(impacted_vj_query)
1738+
17301739
assert has_the_disruption(response, 'stop_time_with_detour')
17311740
assert len(response['vehicle_journeys']) == 1
17321741
assert len(response['vehicle_journeys'][0]['stop_times']) == 3
@@ -1768,13 +1777,13 @@ def test_add_new_trip(self):
17681777
response = self.query_region(ptobj_query)
17691778
assert 'pt_objects' not in response
17701779

1771-
# Check that no vehicle_journey exists on the future realtime-trip
1772-
vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
1773-
vj='vehicle_journey:additional-trip:modified:0:new_trip', dt='20120614T080000'
1774-
)
1775-
response, status = self.query_region(vj_query, check=False)
1776-
assert status == 404
1777-
assert 'vehicle_journeys' not in response
1780+
# 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
1781+
vjs_query = 'vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
1782+
vjs = self.query_region(vjs_query)['vehicle_journeys']
1783+
1784+
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:vjA:RealTime:' in vj['id']), None)
1785+
# No vj has been impacted yet
1786+
assert impacted_vj is None
17781787

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

1907+
vjs_query = 'vehicle_journeys/?_current_datetime={dt}'.format(dt='20120614T080000')
1908+
vjs = self.query_region(vjs_query)['vehicle_journeys']
1909+
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:additional-trip:RealTime:' in vj['id']), None)
1910+
assert impacted_vj
1911+
1912+
vj_query = 'vehicle_journeys/{vj}?_current_datetime={dt}'.format(
1913+
vj=impacted_vj['id'], dt='20120614T080000'
1914+
)
1915+
18981916
# Check that the vehicle_journey has been created
18991917
response = self.query_region(vj_query)
19001918
assert has_the_disruption(response, 'new_trip')
@@ -1955,6 +1973,9 @@ def test_add_new_trip(self):
19551973
assert status == 404
19561974
assert 'vehicle_journeys' not in response
19571975

1976+
network_filter_query = 'vehicle_journeys/{vj}/networks?_current_datetime={dt}'.format(
1977+
vj=impacted_vj['id'], dt='20120614T080000'
1978+
)
19581979
response = self.query_region(network_filter_query)
19591980
assert len(response['networks']) == 1
19601981
assert response['networks'][0]['name'] == 'additional service'
@@ -2165,19 +2186,22 @@ def test_ptref_on_added_trip(self):
21652186
resp = self.query_region("lines/line:stopC_stopB/routes")
21662187
assert resp["routes"][0]["id"] == "route:stopC_stopB"
21672188
resp = self.query_region("lines/line:stopC_stopB/vehicle_journeys")
2168-
assert resp["vehicle_journeys"][0]["id"] == "vehicle_journey:additional-trip:modified:0:new_trip"
2189+
assert "vehicle_journey:additional-trip:RealTime:" in resp["vehicle_journeys"][0]["id"]
21692190
# Name and headsign are empty
21702191
assert resp["vehicle_journeys"][0]["name"] == ""
21712192
assert resp["vehicle_journeys"][0]["headsign"] == ""
21722193

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

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

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

22302254
# vehicle_journey <-> company
2231-
resp = self.query_region(
2232-
"vehicle_journeys/vehicle_journey:additional-trip:modified:0:new_trip/companies"
2233-
)
2255+
resp = self.query_region("vehicle_journeys/{vj_id}/companies".format(vj_id=impacted_vj['id']))
22342256
assert resp["companies"][0]["id"] == "base_company"
22352257
resp = self.query_region("companies/base_company/vehicle_journeys")
22362258
vjs = [vj["id"] for vj in resp["vehicle_journeys"]]
2237-
assert "vehicle_journey:additional-trip:modified:0:new_trip" in vjs
2259+
assert impacted_vj['id'] in vjs
22382260

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

24422464
# physical_mode of the newly created vehicle_journey is the base vehicle_journey physical mode (Tramway)
2465+
vjs = self.query_region('trips/vjA/vehicle_journeys')['vehicle_journeys']
2466+
impacted_vj = next((vj for vj in vjs if 'vehicle_journey:vjA:RealTime:' in vj['id']), None)
2467+
assert impacted_vj
2468+
24432469
pt_response = self.query_region(
2444-
'vehicle_journeys/vehicle_journey:vjA:modified:0:vjA_delayed/physical_modes'
2470+
'vehicle_journeys/{vj_id}/physical_modes'.format(vj_id=impacted_vj['id'])
24452471
)
24462472
assert len(pt_response['physical_modes']) == 1
24472473
assert pt_response['physical_modes'][0]['name'] == 'Tramway'
@@ -2513,10 +2539,13 @@ def test_add_trip_with_headsign(self):
25132539
assert pt_journey['sections'][0]['display_informations']['headsign'] == 'trip_headsign'
25142540

25152541
# Check the vehicle_journey created by real-time
2516-
new_vj = self.query_region('vehicle_journeys/vehicle_journey:additional-trip:modified:0:new_trip')
2517-
assert len(new_vj['vehicle_journeys']) == 1
2518-
assert (new_vj['vehicle_journeys'][0]['name']) == 'trip_headsign'
2519-
assert (new_vj['vehicle_journeys'][0]['headsign']) == 'trip_headsign'
2542+
vjs = self.query_region('trips/additional-trip/vehicle_journeys')['vehicle_journeys']
2543+
new_vjs = [vj for vj in vjs if 'vehicle_journey:additional-trip:RealTime:' in vj['id']]
2544+
assert len(new_vjs) == 1
2545+
2546+
new_vj = new_vjs[0]
2547+
assert new_vj['name'] == 'trip_headsign'
2548+
assert new_vj['headsign'] == 'trip_headsign'
25202549

25212550

25222551
@dataset(MAIN_ROUTING_TEST_SETTING_NO_ADD)

source/jormungandr/tests/rail_sections_tests.py

+38-8
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,10 @@ def journeys(_from, to, data_freshness="base_schedule"):
472472
# stopAA-> stopBB / realtime: No disruption
473473
r = journeys(_from='stopAA', to='stopBB', data_freshness="realtime")
474474
assert len(r["journeys"]) == 1
475-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]
475+
476+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
477+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
478+
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]
476479
d = get_all_element_disruptions(r['journeys'], r)
477480
assert not impacted_headsigns(d)
478481
for disruption, result in scenario.items():
@@ -544,7 +547,10 @@ def journeys(_from, to, data_freshness="base_schedule"):
544547
# stopAA-> stopFF / realtime: No disruption to display
545548
r = journeys(_from='stopAA', to='stopGG', data_freshness="realtime")
546549
assert len(r["journeys"]) == 1
547-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]
550+
551+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
552+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
553+
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]
548554
d = get_all_element_disruptions(r['journeys'], r)
549555
assert not impacted_headsigns(d)
550556
for disruption, result in scenario.items():
@@ -566,7 +572,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
566572
# stopCC-> stopFF / realtime: No disruption
567573
r = journeys(_from='stopCC', to='stopFF', data_freshness="realtime")
568574
assert len(r["journeys"]) == 1
569-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]
575+
576+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
577+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
578+
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]
579+
570580
d = get_all_element_disruptions(r['journeys'], r)
571581
assert not impacted_headsigns(d)
572582
for disruption, result in scenario.items():
@@ -606,7 +616,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
606616
# stopGG-> stopII / realtime: No disruption
607617
r = journeys(_from='stopGG', to='stopII', data_freshness="realtime")
608618
assert len(r["journeys"]) == 1
609-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:0:rail_section_on_line11']]
619+
620+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
621+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
622+
assert get_used_vj(r) == [[impacted_vjs[0]['id']]]
623+
610624
d = get_all_element_disruptions(r['journeys'], r)
611625
assert not impacted_headsigns(d)
612626
for disruption, result in scenario.items():
@@ -908,7 +922,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
908922
# stopAA-> stopBB / realtime: No disruption
909923
r = journeys(_from='stopAA', to='stopBB', data_freshness="realtime")
910924
assert len(r["journeys"]) == 1
911-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]
925+
926+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
927+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
928+
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]
929+
912930
d = get_all_element_disruptions(r['journeys'], r)
913931
assert not impacted_headsigns(d)
914932
for disruption, result in scenario.items():
@@ -980,7 +998,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
980998
# stopAA-> stopFF / realtime: No disruption to display
981999
r = journeys(_from='stopAA', to='stopGG', data_freshness="realtime")
9821000
assert len(r["journeys"]) == 1
983-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]
1001+
1002+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
1003+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
1004+
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]
1005+
9841006
d = get_all_element_disruptions(r['journeys'], r)
9851007
assert not impacted_headsigns(d)
9861008
for disruption, result in scenario.items():
@@ -1002,7 +1024,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
10021024
# stopCC-> stopFF / realtime: No disruption
10031025
r = journeys(_from='stopCC', to='stopFF', data_freshness="realtime")
10041026
assert len(r["journeys"]) == 1
1005-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]
1027+
1028+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
1029+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
1030+
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]
1031+
10061032
d = get_all_element_disruptions(r['journeys'], r)
10071033
assert not impacted_headsigns(d)
10081034
for disruption, result in scenario.items():
@@ -1042,7 +1068,11 @@ def journeys(_from, to, data_freshness="base_schedule"):
10421068
# stopGG-> stopII / realtime: No disruption
10431069
r = journeys(_from='stopGG', to='stopII', data_freshness="realtime")
10441070
assert len(r["journeys"]) == 1
1045-
assert get_used_vj(r) == [['vehicle_journey:vj:11-1:Adapted:1:rail_section_bis_on_line11']]
1071+
1072+
vjs = self.query_region('trips/vj:11-1/vehicle_journeys')['vehicle_journeys']
1073+
impacted_vjs = [vj for vj in vjs if 'vehicle_journey:vj:11-1:Adapted:' in vj['id']]
1074+
assert get_used_vj(r) == [[impacted_vjs[1]['id']]]
1075+
10461076
d = get_all_element_disruptions(r['journeys'], r)
10471077
assert not impacted_headsigns(d)
10481078
for disruption, result in scenario.items():

0 commit comments

Comments
 (0)