diff options
| author | Zog | 2018-02-02 14:58:50 +0100 | 
|---|---|---|
| committer | cedricnjanga | 2018-02-06 11:11:33 -0800 | 
| commit | 40960d78ad2e5a85b4acec5d7588beb69538b61a (patch) | |
| tree | 8e2379663fe1053e8b61614d5471feb0e5937e4c | |
| parent | 123da9addd584e4fb86520cb54d8266a9869b8cf (diff) | |
| download | chouette-core-40960d78ad2e5a85b4acec5d7588beb69538b61a.tar.bz2 | |
Refs #5417; Update parents checksum when children are created or updated
| -rw-r--r-- | app/models/chouette/time_table.rb | 3 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 2 | ||||
| -rw-r--r-- | app/models/concerns/checksum_support.rb | 23 | ||||
| -rw-r--r-- | spec/models/chouette/time_table_spec.rb | 23 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 10 | 
5 files changed, 59 insertions, 2 deletions
| diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 8113457ec..7b69aefb6 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -47,6 +47,9 @@ module Chouette        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..1971061a2 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -108,6 +108,8 @@ module Chouette        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..30e201c4d 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,27 @@ end    describe 'checksum' do      it_behaves_like 'checksum support', :time_table +    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)}.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 | 
