aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-05-17 13:09:22 +0200
committerGitHub2018-05-17 13:09:22 +0200
commit831d7336cdfb7678ada56f62c7588b7d3873bc8e (patch)
tree514e39dd22125b73d29646a5c636dd7df20be38f
parent27340235bf523f1d82ac9c8f709a73bfb112a06b (diff)
parentceec2e53425f8a1c726f4903d03e268386cb598e (diff)
downloadchouette-core-831d7336cdfb7678ada56f62c7588b7d3873bc8e.tar.bz2
Merge pull request #571 from af83/6854-clean-up--destroy-routes-outside-referential
Clean up destroy routes outside referential. Fixes #6854
-rw-r--r--app/models/clean_up.rb25
-rw-r--r--spec/models/clean_up_spec.rb64
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