aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/merge.rb42
-rw-r--r--spec/factories/chouette_vehicle_journey.rb1
-rw-r--r--spec/models/merge_spec.rb70
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