diff options
| -rw-r--r-- | app/models/chouette/time_table.rb | 11 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 6 | ||||
| -rw-r--r-- | app/models/concerns/checksum_support.rb | 23 | ||||
| -rw-r--r-- | spec/models/chouette/time_table_spec.rb | 34 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 10 |
5 files changed, 79 insertions, 5 deletions
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 8113457ec..15b22b671 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -42,11 +42,18 @@ module Chouette def checksum_attributes [].tap do |attrs| attrs << self.int_day_types - attrs << self.dates.map(&:checksum).map(&:to_s).sort - attrs << self.periods.map(&:checksum).map(&:to_s).sort + dates = self.dates + dates += TimeTableDate.where(time_table_id: self.id) + attrs << dates.map(&:checksum).map(&:to_s).sort + periods = self.periods + periods += TimeTablePeriod.where(time_table_id: self.id) + attrs << periods.map(&:checksum).map(&:to_s).sort end end + has_checksum_children TimeTableDate + has_checksum_children TimeTablePeriod + def self.object_id_key "Timetable" end diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 6146d5be8..4a6ba3f75 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -104,10 +104,14 @@ module Chouette attrs << self.published_journey_identifier attrs << self.try(:company).try(:get_objectid).try(:local_id) attrs << self.footnotes.map(&:checksum).sort - attrs << self.vehicle_journey_at_stops.sort_by { |s| s.stop_point&.position }.map(&:checksum).sort + vjas = self.vehicle_journey_at_stops + vjas += VehicleJourneyAtStop.where(vehicle_journey_id: self.id) + attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum).sort end end + has_checksum_children VehicleJourneyAtStop + def set_default_values if number.nil? self.number = 0 diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb index ff73c87a3..a76995b0f 100644 --- a/app/models/concerns/checksum_support.rb +++ b/app/models/concerns/checksum_support.rb @@ -3,9 +3,21 @@ module ChecksumSupport SEPARATOR = '|' VALUE_FOR_NIL_ATTRIBUTE = '-' - included do + included do |into| before_save :set_current_checksum_source, :update_checksum Referential.register_model_with_checksum self + into.extend ClassMethods + end + + module ClassMethods + def has_checksum_children klass, opts={} + parent_class = self + relation = opts[:relation] || self.model_name.singular + klass.after_save do + parent = self.send(relation) + parent&.update_checksum_without_callbacks! + end + end end def checksum_attributes @@ -34,4 +46,13 @@ module ChecksumSupport update checksum: Digest::SHA256.new.hexdigest(checksum_source) end end + + def update_checksum_without_callbacks! + set_current_checksum_source + _checksum = Digest::SHA256.new.hexdigest(checksum_source) + if _checksum != self.checksum + self.checksum = _checksum + self.class.where(id: self.id).update_all(checksum: _checksum) unless self.new_record? + end + end end diff --git a/spec/models/chouette/time_table_spec.rb b/spec/models/chouette/time_table_spec.rb index 28197984e..a501f234a 100644 --- a/spec/models/chouette/time_table_spec.rb +++ b/spec/models/chouette/time_table_spec.rb @@ -926,7 +926,7 @@ end end end end - + describe "#validity_out_between?" do let(:empty_tm) {build(:time_table)} it "should be false if empty calendar" do @@ -1050,6 +1050,38 @@ end describe 'checksum' do it_behaves_like 'checksum support', :time_table + + it "handles newly built dates and periods" do + time_table = build(:time_table) + time_table.periods.build period_start: Time.now, period_end: 1.month.from_now + time_table.dates.build date: Time.now + time_table.save! + expect{time_table.update_checksum!}.to_not change{time_table.checksum} + expect(time_table.dates.count).to eq 1 + expect(time_table.periods.count).to eq 1 + end + + it "changes when a date is updated" do + time_table = create(:time_table) + expect{time_table.dates.last.update_attribute(:date, Time.now)}.to change{time_table.reload.checksum} + end + + it "changes when a date is added" do + time_table = create(:time_table) + expect(time_table).to receive(:update_checksum_without_callbacks!).at_least(:once).and_call_original + expect{create(:time_table_date, time_table: time_table, date: 1.year.ago)}.to change{time_table.checksum} + end + + it "changes when a period is updated" do + time_table = create(:time_table) + expect{time_table.periods.last.update_attribute(:period_start, Time.now)}.to change{time_table.reload.checksum} + end + + it "changes when a period is added" do + time_table = create(:time_table) + expect(time_table).to receive(:update_checksum_without_callbacks!).at_least(:once).and_call_original + expect{create(:time_table_period, time_table: time_table)}.to change{time_table.checksum} + end end describe "#excluded_days" do diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 909d6582d..76ee1e74d 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -22,6 +22,16 @@ describe Chouette::VehicleJourney, :type => :model do describe 'checksum' do it_behaves_like 'checksum support', :vehicle_journey + it "changes when a vjas is updated" do + vehicle_journey = create(:vehicle_journey) + expect{vehicle_journey.vehicle_journey_at_stops.last.update_attribute(:departure_time, Time.now)}.to change{vehicle_journey.reload.checksum} + end + + it "changes when a vjas is added" do + vehicle_journey = create(:vehicle_journey) + expect(vehicle_journey).to receive(:update_checksum_without_callbacks!).at_least(:once).and_call_original + expect{create(:vehicle_journey_at_stop, vehicle_journey: vehicle_journey)}.to change{vehicle_journey.checksum} + end end describe "#with_stop_area_ids" do |
