diff options
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 40 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 45 |
2 files changed, 60 insertions, 25 deletions
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 0aab9d0ed..a4a363348 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -56,21 +56,28 @@ module Chouette at_stops end + def create_or_find_vjas_from_state vjas + return vehicle_journey_at_stops.find(vjas['id']) if vjas['id'] + stop_point = Chouette::StopPoint.find_by(objectid: vjas['stop_point_objectid']) + stop = vehicle_journey_at_stops.create(stop_point: stop_point) + vjas['id'] = stop.id + vjas['new_record'] = true + stop + end + def update_vjas_from_state state state.each do |vjas| next if vjas["dummy"] - stop = vehicle_journey_at_stops.find(vjas['id']) if vjas['id'] - if stop - params = {}.tap do |el| - ['arrival_time', 'departure_time'].each do |field| - time = "#{vjas[field]['hour']}:#{vjas[field]['minute']}" - el[field.to_sym] = Time.parse("2000-01-01 #{time}:00 UTC") - end + params = {}.tap do |el| + ['arrival_time', 'departure_time'].each do |field| + time = "#{vjas[field]['hour']}:#{vjas[field]['minute']}" + el[field.to_sym] = Time.parse("2000-01-01 #{time}:00 UTC") end - stop.update_attributes(params) - vjas.delete('errors') - vjas['errors'] = stop.errors if stop.errors.any? end + stop = create_or_find_vjas_from_state(vjas) + stop.update_attributes(params) + vjas.delete('errors') + vjas['errors'] = stop.errors if stop.errors.any? end end @@ -85,13 +92,22 @@ module Chouette vj.update_attributes(state_permited_attributes(item)) item['errors'] = vj.errors if vj.errors.any? end + + # Delete ids of new object from state if we had to rollback if state.any? {|item| item['errors']} - state.map {|item| item.delete('objectid') if item['new_record']} + state.map do |item| + item.delete('objectid') if item['new_record'] + item['vehicle_journey_at_stops'].map {|vjas| vjas.delete('id') if vjas['new_record'] } + end raise ::ActiveRecord::Rollback end end - state.map {|item| item.delete('new_record')} + # Remove new_record flag && deleted item from state if transaction has been saved + state.map do |item| + item.delete('new_record') + item['vehicle_journey_at_stops'].map {|vjas| vjas.delete('new_record') } + end state.delete_if {|item| item['deletable']} end diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index fab9cd5e8..c922731a7 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -1,23 +1,28 @@ require 'spec_helper' describe Chouette::VehicleJourney, :type => :model do 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| + at_stop[att.to_s] = vjas.send(att) unless vjas.send(att).nil? + end + + [:arrival_time, :departure_time].map do |att| + at_stop[att.to_s] = { + 'hour' => vjas.send(att).strftime('%H'), + 'minute' => vjas.send(att).strftime('%M'), + } + end + at_stop + end + def vehicle_journey_to_state vj vj.attributes.slice('objectid', 'published_journey_name', 'journey_pattern_id', 'company_id').tap do |item| item['vehicle_journey_at_stops'] = [] - vj.vehicle_journey_at_stops.each do |vs| - at_stops = {'stop_area_object_id' => vs.stop_point.stop_area.objectid } - [:id, :connecting_service_id, :boarding_alighting_possibility].map do |att| - at_stops[att.to_s] = vs.send(att) unless vs.send(att).nil? - end - - [:arrival_time, :departure_time].map do |att| - at_stops[att.to_s] = { - 'hour' => vs.send(att).strftime('%H'), - 'minute' => vs.send(att).strftime('%M'), - } - end - item['vehicle_journey_at_stops'] << at_stops + vj.vehicle_journey_at_stops.each do |vjas| + item['vehicle_journey_at_stops'] << vehicle_journey_at_stop_to_state(vjas) end end end @@ -40,6 +45,20 @@ describe Chouette::VehicleJourney, :type => :model do expect(vj.published_journey_name).to eq 'dummy' end + it 'should save vehicle_journey_at_stops of newly created vj' do + new_vj = build(:vehicle_journey, objectid: nil, published_journey_name: 'dummy', route: route, journey_pattern: journey_pattern) + new_vj.vehicle_journey_at_stops << build(:vehicle_journey_at_stop, + :vehicle_journey => new_vj, + :stop_point => create(:stop_point), + :arrival_time => '2000-01-01 01:00:00 UTC', + :departure_time => '2000-01-01 03:00:00 UTC') + + collection << vehicle_journey_to_state(new_vj) + expect { + Chouette::VehicleJourney.state_update(route, collection) + }.to change {Chouette::VehicleJourneyAtStop.count}.by(1) + end + it 'should update vj journey_pattern' do state['journey_pattern'] = create(:journey_pattern).attributes.slice('id', 'name', 'objectid') Chouette::VehicleJourney.state_update(route, collection) |
