diff options
| author | Zog | 2018-03-14 10:09:35 +0100 |
|---|---|---|
| committer | Zog | 2018-03-15 16:57:54 +0100 |
| commit | e7b6d6679e3d2911ecb4c2d0875dd016dbade70a (patch) | |
| tree | 32e5cc384e0af4d024f95d63991dcfad39c0070c | |
| parent | b2a1d762cb3e7a72f0864e70843342de2566dfdf (diff) | |
| download | chouette-core-5956-merge-purchase-windows.tar.bz2 | |
Refs #5956; Clone PurchaseWindows when merging Referentials5956-merge-purchase-windows
| -rw-r--r-- | app/models/merge.rb | 42 | ||||
| -rw-r--r-- | spec/factories/chouette_vehicle_journey.rb | 1 | ||||
| -rw-r--r-- | spec/models/merge_spec.rb | 70 |
3 files changed, 89 insertions, 24 deletions
diff --git a/app/models/merge.rb b/app/models/merge.rb index e72c794fe..ecaccd2ef 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -340,7 +340,7 @@ class Merge < ActiveRecord::Base unless existing_time_table objectid = Chouette::TimeTable.where(objectid: time_table.objectid).exists? ? nil : time_table.objectid - candidate_time_table.objectid = objectid + candidate_time_table.objectid = objectid candidate_time_table.save! @@ -359,6 +359,10 @@ class Merge < ActiveRecord::Base end end end + + + # PurchaseWindows + merge_purchase_windows new, referential end def save_current @@ -378,6 +382,42 @@ class Merge < ActiveRecord::Base end + protected + def merge_purchase_windows new, referential + referential_purchase_windows = referential.switch do + Hash[referential.purchase_windows.joins(:vehicle_journeys).pluck(:id, "vehicle_journeys.checksum").inject(Hash.new { |h,k| h[k] = [] }) do |hash, row| + id, vehicle_journey_checksum = row + hash[referential.purchase_windows.find(id)] << vehicle_journey_checksum + hash + end] + end + + new.switch do + referential_purchase_windows.each do |purchase_window, vehicle_journey_checksums| + + new_purchase_window = new.purchase_windows.find_by name: purchase_window.name + new_purchase_window ||= begin + attributes = purchase_window.attributes.merge(id: nil) + + new_purchase_window = new.purchase_windows.build attributes + new_purchase_window.intersect_periods! new.metadatas.map(&:periodes).flatten + + objectid = Chouette::PurchaseWindow.where(objectid: new_purchase_window.objectid).exists? ? nil : new_purchase_window.objectid + new_purchase_window.objectid = objectid + + new_purchase_window.save! + new_purchase_window + end + + vehicle_journey_checksums.each do |vehicle_journey_checksum| + # associate VehicleJourney + associated_vehicle_journey = new.vehicle_journeys.find_by!(checksum: vehicle_journey_checksum) + associated_vehicle_journey.purchase_windows << new_purchase_window + end + end + end + end + class MetadatasMerger attr_reader :merge_metadatas, :referential diff --git a/spec/factories/chouette_vehicle_journey.rb b/spec/factories/chouette_vehicle_journey.rb index 7d63a2e58..4363aeb06 100644 --- a/spec/factories/chouette_vehicle_journey.rb +++ b/spec/factories/chouette_vehicle_journey.rb @@ -2,6 +2,7 @@ FactoryGirl.define do factory :vehicle_journey_common, :class => Chouette::VehicleJourney do sequence(:objectid) { |n| "organisation:VehicleJourney:lineid-#{n}:LOC" } + sequence(:published_journey_name) { |n| "VehicleJourney ##{n}" } factory :vehicle_journey_empty do association :journey_pattern, :factory => :journey_pattern diff --git a/spec/models/merge_spec.rb b/spec/models/merge_spec.rb index 95181a80e..a90f8a5a1 100644 --- a/spec/models/merge_spec.rb +++ b/spec/models/merge_spec.rb @@ -2,25 +2,25 @@ require "rails_helper" RSpec.describe Merge do - it "should work" do - stop_area_referential = FactoryGirl.create :stop_area_referential - 10.times { FactoryGirl.create :stop_area, stop_area_referential: stop_area_referential } - - line_referential = FactoryGirl.create :line_referential - company = FactoryGirl.create :company, line_referential: line_referential - 10.times { FactoryGirl.create :line, line_referential: line_referential, company: company, network: nil } - - workbench = FactoryGirl.create :workbench, line_referential: line_referential, stop_area_referential: stop_area_referential - - referential_metadata = FactoryGirl.create(:referential_metadata, lines: line_referential.lines.limit(3)) - - referential = FactoryGirl.create :referential, - workbench: workbench, - organisation: workbench.organisation, - metadatas: [referential_metadata] - + let(:stop_area_referential) { create :stop_area_referential } + let(:line_referential) { create :line_referential } + let(:company) { create :company, line_referential: line_referential } + let(:workbench) { create :workbench, + line_referential: line_referential, + stop_area_referential: stop_area_referential } + let(:referential_metadata) { create(:referential_metadata, lines: line_referential.lines.limit(3)) } + let(:referential) { create :referential, + workbench: workbench, + organisation: workbench.organisation, + metadatas: [referential_metadata] + } + let(:merge) { Merge.create!(workbench: referential.workbench, referentials: [referential, referential]) } + + before(:each) do + 10.times { create :stop_area, stop_area_referential: stop_area_referential } + 10.times { create :line, line_referential: line_referential, company: company, network: nil } factor = 1 - stop_points_positions = {} + @stop_points_positions = {} referential.switch do line_referential.lines.each do |line| @@ -41,23 +41,47 @@ RSpec.describe Merge do end referential.journey_patterns.each do |journey_pattern| - stop_points_positions[journey_pattern.name] = Hash[*journey_pattern.stop_points.map{|sp| [sp.stop_area_id, sp.position]}.flatten] + @stop_points_positions[journey_pattern.name] = Hash[*journey_pattern.stop_points.map{|sp| [sp.stop_area_id, sp.position]}.flatten] factor.times do FactoryGirl.create :vehicle_journey, journey_pattern: journey_pattern, company: company end end - shared_time_table = FactoryGirl.create :time_table + @shared_time_table = FactoryGirl.create :time_table + @shared_purchase_window = FactoryGirl.create :purchase_window, referential: referential referential.vehicle_journeys.each do |vehicle_journey| - vehicle_journey.time_tables << shared_time_table + vehicle_journey.time_tables << @shared_time_table + vehicle_journey.purchase_windows << @shared_purchase_window specific_time_table = FactoryGirl.create :time_table vehicle_journey.time_tables << specific_time_table end end + end - merge = Merge.create!(workbench: referential.workbench, referentials: [referential, referential]) + it "should clone purchase_windows" do + new_referential = create :referential + vehicle_journeys = referential.switch do + Chouette::VehicleJourney.pluck(:checksum).uniq + end + new_referential.switch do + vehicle_journeys.each do |checksum| + vj = create :vehicle_journey + Chouette::VehicleJourney.where(id: vj.id).update_all checksum: checksum + end + end + merge.send :merge_purchase_windows, new_referential, referential + new_referential.switch do + new_purchase_window = Chouette::PurchaseWindow.find_by name: @shared_purchase_window.name + expect(new_purchase_window).to be_present + new_referential.vehicle_journeys.each do |vehicle_journey| + expect(vehicle_journey.purchase_windows).to eq [new_purchase_window] + end + end + end + + it "should work" do merge.merge! output = merge.output.current @@ -67,7 +91,7 @@ RSpec.describe Merge do # This should be enforced by the checksum preservation though output.journey_patterns.each do |journey_pattern| journey_pattern.stop_points.each do |sp| - expect(sp.position).to eq stop_points_positions[journey_pattern.name][sp.stop_area_id] + expect(sp.position).to eq @stop_points_positions[journey_pattern.name][sp.stop_area_id] end end |
