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-e7b6d6679e3d2911ecb4c2d0875dd016dbade70a.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 | 
