From 488237c48b6174873470d7b6ce3d1465df46ba20 Mon Sep 17 00:00:00 2001 From: Zog Date: Thu, 17 May 2018 11:18:13 +0200 Subject: Refs #6624; Update parent's checksum on deletion --- app/models/concerns/checksum_support.rb | 7 ++++++- spec/models/chouette/vehicle_journey_spec.rb | 10 ++++++++++ spec/models/route_spec.rb | 5 +++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb index fe52604bb..86bbd1d00 100644 --- a/app/models/concerns/checksum_support.rb +++ b/app/models/concerns/checksum_support.rb @@ -10,19 +10,24 @@ module ChecksumSupport end module ClassMethods + def has_checksum_children klass, opts={} parent_class = self belongs_to = opts[:relation] || self.model_name.singular has_many = opts[:relation] || self.model_name.plural Rails.logger.debug "Define callback in #{klass} to update checksums #{self.model_name} (via #{has_many}/#{belongs_to})" - klass.after_save do + + child_update_parent = Proc.new do parents = [] parents << self.send(belongs_to) if klass.reflections[belongs_to].present? parents += self.send(has_many) if klass.reflections[has_many].present? Rails.logger.debug "Request from #{klass.name} checksum updates for #{parents.count} #{parent_class} parent(s)" parents.compact.each &:update_checksum_without_callbacks! end + + klass.after_save &child_update_parent + klass.after_destroy &child_update_parent end end diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 0fc75bec9..05560f9e3 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -36,6 +36,16 @@ describe Chouette::VehicleJourney, :type => :model do expect{create(:vehicle_journey_at_stop, vehicle_journey: vehicle_journey)}.to change{vehicle_journey.checksum} end + it "changes when a vjas is deleted" do + vehicle_journey = create(:vehicle_journey) + 3.times do + create(:vehicle_journey_at_stop, vehicle_journey: vehicle_journey).run_callbacks(:commit) + end + vjas = vehicle_journey.vehicle_journey_at_stops.last + expect(vehicle_journey).to receive(:update_checksum_without_callbacks!).at_least(:once).and_call_original + expect{vjas.destroy; vjas.run_callbacks(:commit)}.to change{vehicle_journey.reload.checksum} + end + context "when custom_field_values change" do let(:vehicle_journey){ create(:vehicle_journey, custom_field_values: {custom_field.code.to_s => former_value}) } let(:custom_field){ create :custom_field, field_type: :string, code: :energy, name: :energy, resource_type: "VehicleJourney" } diff --git a/spec/models/route_spec.rb b/spec/models/route_spec.rb index 58524038b..dbf00ab0b 100644 --- a/spec/models/route_spec.rb +++ b/spec/models/route_spec.rb @@ -2,6 +2,11 @@ require 'spec_helper' RSpec.describe Chouette::Route, :type => :model do subject(:route){ create :route } + context "the checksum" do + it "should change when a stop is removed" do + expect{route.stop_points.last.destroy}.to change {route.reload.checksum} + end + end context "metadatas" do it "should be empty at first" do expect(Chouette::Route.has_metadata?).to be_truthy -- cgit v1.2.3