diff options
| -rw-r--r-- | app/models/clean_up.rb | 25 | ||||
| -rw-r--r-- | spec/models/clean_up_spec.rb | 64 |
2 files changed, 83 insertions, 6 deletions
diff --git a/app/models/clean_up.rb b/app/models/clean_up.rb index 0f73e07b2..9cf2389c9 100644 --- a/app/models/clean_up.rb +++ b/app/models/clean_up.rb @@ -16,6 +16,8 @@ class CleanUp < ApplicationModel where(referential_id: referential.id) end + attr_accessor :methods + def end_date_must_be_greater_that_begin_date if self.end_date && self.date_type == 'between' && self.begin_date >= self.end_date errors.add(:base, I18n.t('activerecord.errors.models.clean_up.invalid_period')) @@ -43,17 +45,22 @@ class CleanUp < ApplicationModel end end - destroy_vehicle_journeys_outside_referential + destroy_routes_outside_referential # Disabled for the moment. See #5372 # destroy_time_tables_outside_referential - destroy_vehicle_journeys - destroy_journey_patterns - destroy_routes + # Run caller-specified cleanup methods + run_methods end end end + def run_methods + return if methods.nil? + + methods.each { |method| send(method) } + end + def destroy_time_tables_between time_tables = Chouette::TimeTable.where('end_date < ? AND start_date > ?', self.end_date, self.begin_date) self.destroy_time_tables(time_tables) @@ -100,9 +107,9 @@ class CleanUp < ApplicationModel destroy_time_tables(time_tables) end - def destroy_vehicle_journeys_outside_referential + def destroy_routes_outside_referential line_ids = referential.metadatas.pluck(:line_ids).flatten.uniq - Chouette::VehicleJourney.joins(:route).where(["routes.line_id not in (?)", line_ids]).destroy_all + Chouette::Route.where(['line_id not in (?)', line_ids]).destroy_all end def destroy_vehicle_journeys @@ -117,6 +124,12 @@ class CleanUp < ApplicationModel Chouette::Route.where("id not in (select distinct route_id from journey_patterns)").destroy_all end + def destroy_empty + destroy_vehicle_journeys + destroy_journey_patterns + destroy_routes + end + def overlapping_periods self.end_date = self.begin_date if self.date_type != 'between' Chouette::TimeTablePeriod.where('(period_start, period_end) OVERLAPS (?, ?)', self.begin_date, self.end_date) diff --git a/spec/models/clean_up_spec.rb b/spec/models/clean_up_spec.rb index afd2d8721..f39ca2f2b 100644 --- a/spec/models/clean_up_spec.rb +++ b/spec/models/clean_up_spec.rb @@ -264,4 +264,68 @@ RSpec.describe CleanUp, :type => :model do } end end + + describe "#destroy_routes_outside_referential" do + let(:line_referential) { create(:line_referential) } + let(:line) { create(:line, line_referential: line_referential) } + let(:metadata) { create(:referential_metadata, lines: [line]) } + let(:referential) { create(:workbench_referential, metadatas: [metadata]) } + let(:cleaner) { create(:clean_up, referential: referential) } + + it "destroys routes not in the the referential" do + route = create(:route) + + cleaner.destroy_routes_outside_referential + + expect(Chouette::Route.exists?(route.id)).to be false + + line.routes.each do |route| + expect(route).not_to be_destroyed + end + end + + it "cascades destruction of vehicle journeys and journey patterns" do + vehicle_journey = create(:vehicle_journey) + + cleaner.destroy_routes_outside_referential + + expect(Chouette::Route.exists?(vehicle_journey.route.id)).to be false + expect( + Chouette::JourneyPattern.exists?(vehicle_journey.journey_pattern.id) + ).to be false + expect(Chouette::VehicleJourney.exists?(vehicle_journey.id)).to be false + end + end + + describe "#destroy_empty" do + it "calls the appropriate destroy methods" do + cleaner = create(:clean_up) + + expect(cleaner).to receive(:destroy_vehicle_journeys) + expect(cleaner).to receive(:destroy_journey_patterns) + expect(cleaner).to receive(:destroy_routes) + + cleaner.destroy_empty + end + end + + describe "#run_methods" do + let(:cleaner) { create(:clean_up) } + + it "calls methods in the :methods attribute" do + cleaner = create( + :clean_up, + methods: [:destroy_routes_outside_referential] + ) + + expect(cleaner).to receive(:destroy_routes_outside_referential) + cleaner.run_methods + end + + it "doesn't do anything if :methods is nil" do + cleaner = create(:clean_up) + + expect { cleaner.run_methods }.not_to raise_error + end + end end |
