aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXinhui2017-06-01 17:11:35 +0200
committerXinhui2017-06-01 17:11:46 +0200
commit81da8717b726e98d40e3ebf5a2a56d3a9703d8c6 (patch)
tree0e213489f6e5b29210cca8179d8119e25cd6cda1
parent2c2988b6ba0cf36254fdec4696da14f7103fa503 (diff)
downloadchouette-core-81da8717b726e98d40e3ebf5a2a56d3a9703d8c6.tar.bz2
Wip validate vjas departure_time must be before next stop arrival_time
Refs #3418
-rw-r--r--app/models/chouette/vehicle_journey.rb13
-rw-r--r--spec/factories/chouette_vehicle_journey.rb9
-rw-r--r--spec/models/chouette/vehicle_journey_spec.rb31
3 files changed, 43 insertions, 10 deletions
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index 61d62378f..24de88015 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -28,13 +28,24 @@ module Chouette
has_and_belongs_to_many :time_tables, :class_name => 'Chouette::TimeTable', :foreign_key => "vehicle_journey_id", :association_foreign_key => "time_table_id"
has_many :stop_points, -> { order("stop_points.position") }, :through => :vehicle_journey_at_stops
- validates :vehicle_journey_at_stops,
+ validates :vehicle_journey_at_stops, :vjas_departure_time_must_be_before_next_stop_arrival_time,
vehicle_journey_at_stops_are_in_increasing_time_order: true
validates_presence_of :number
before_validation :set_default_values,
:calculate_vehicle_journey_at_stop_day_offset
+ def vjas_departure_time_must_be_before_next_stop_arrival_time
+ vehicle_journey_at_stops.each_with_index do |current_stop, index|
+ next_stop = vehicle_journey_at_stops[index + 1]
+ next unless next_stop
+
+ if next_stop[:arrival_time] <= current_stop[:departure_time]
+ current_stop.errors.add(:departure_time, 'departure time must be before next stop arrival time')
+ end
+ end
+ end
+
def set_default_values
if number.nil?
self.number = 0
diff --git a/spec/factories/chouette_vehicle_journey.rb b/spec/factories/chouette_vehicle_journey.rb
index 452909f23..e7ecb79ac 100644
--- a/spec/factories/chouette_vehicle_journey.rb
+++ b/spec/factories/chouette_vehicle_journey.rb
@@ -18,11 +18,16 @@ FactoryGirl.define do
after(:create) do |vehicle_journey, evaluator|
vehicle_journey.journey_pattern.stop_points.each_with_index do |stop_point, index|
+ prev_stop = vehicle_journey.vehicle_journey_at_stops[index - 1]
+
+ arrival_time = prev_stop ? prev_stop[:departure_time] + 1.minute : evaluator.stop_arrival_time
+ departure_time = prev_stop ? arrival_time + 1.minute : evaluator.stop_departure_time
+
vehicle_journey.vehicle_journey_at_stops << create(:vehicle_journey_at_stop,
:vehicle_journey => vehicle_journey,
:stop_point => stop_point,
- :arrival_time => "2000-01-01 #{evaluator.stop_arrival_time} UTC",
- :departure_time => "2000-01-01 #{evaluator.stop_departure_time} UTC")
+ :arrival_time => "2000-01-01 #{arrival_time} UTC",
+ :departure_time => "2000-01-01 #{departure_time} UTC")
end
end
diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb
index 6518e101f..f96c687f4 100644
--- a/spec/models/chouette/vehicle_journey_spec.rb
+++ b/spec/models/chouette/vehicle_journey_spec.rb
@@ -1,7 +1,28 @@
require 'spec_helper'
+
describe Chouette::VehicleJourney, :type => :model do
- describe "state_update" do
+ describe "vjas_departure_time_must_be_before_next_stop_arrival_time" do
+ let(:vehicle_journey) { create :vehicle_journey }
+ let(:vjas) { vehicle_journey.vehicle_journey_at_stops }
+
+ it 'should add errors a stop departure_time is greater then next stop arrival time' do
+ vjas[0][:departure_time] = vjas[1][:arrival_time] + 1.hour
+ vehicle_journey.validate
+
+ expect(vjas[0].errors[:departure_time]).not_to be_blank
+ expect(vehicle_journey).not_to be_valid
+ end
+ it 'should not add errors when departure_time is less then next stop arrival time' do
+ vehicle_journey.validate
+ vjas.each do |stop|
+ expect(stop.errors).to be_empty
+ end
+ expect(vehicle_journey).to be_valid
+ end
+ end
+
+ describe "state_update" do
def vehicle_journey_at_stop_to_state vjas
at_stop = {'stop_area_object_id' => vjas.stop_point.stop_area.objectid }
[:id, :connecting_service_id, :boarding_alighting_possibility].map do |att|
@@ -136,16 +157,12 @@ describe Chouette::VehicleJourney, :type => :model do
it 'should return errors when validation failed' do
state['published_journey_name'] = 'edited_name'
- # Exceeds_gap departure time validation failed
- prev = state['vehicle_journey_at_stops'].last(2).first
- last = state['vehicle_journey_at_stops'].last
- prev['departure_time']['hour'] = '01'
- last['departure_time']['hour'] = '23'
+ state['vehicle_journey_at_stops'].last['departure_time']['hour'] = '23'
expect {
Chouette::VehicleJourney.state_update(route, collection)
}.not_to change(vehicle_journey, :published_journey_name)
- expect(state['errors'][:vehicle_journey_at_stops].size).to eq 1
+ expect(state['vehicle_journey_at_stops'].last['errors']).not_to be_empty
end
it 'should delete vj with deletable set to true from state' do