aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert2017-08-16 06:57:07 +0200
committerRobert2017-08-16 06:57:07 +0200
commitf4863d7ea2e580ee1eb5f5cf498c07441e3ccff3 (patch)
tree67b7355d8cdb95c3cc8afb1aa0157b65e8e020b5
parent373a4089173795d011ebd6adf7382b2a5e40a51b (diff)
downloadchouette-core-f4863d7ea2e580ee1eb5f5cf498c07441e3ccff3.tar.bz2
Refs: #4189@1h; Implementation of Chouette::Route#duplicate & Chouette::StopPoint#duplicate
Implementing, as specified: - The duplicated Route objectid is autogenerated - The duplicated StopPoint objectids are autogenerated - the duplicated Route object_version equals the source's one (UNCHANGED)
-rw-r--r--app/models/chouette/route.rb6
-rw-r--r--app/models/chouette/stop_point.rb8
-rw-r--r--spec/models/chouette/route/route_duplication_spec.rb44
-rw-r--r--spec/models/chouette/stop_point_spec.rb11
4 files changed, 35 insertions, 34 deletions
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index 0fe4472d3..3e20dc43e 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -76,11 +76,11 @@ class Chouette::Route < Chouette::TridentActiveRecord
after_commit :journey_patterns_control_route_sections
- def duplicate new_objectid
- keys_for_create = attributes.keys - %w{id created_at updated_at}
+ def duplicate
+ keys_for_create = attributes.keys - %w{id objectid created_at updated_at}
atts_for_create = attributes
.slice(*keys_for_create)
- .merge('objectid' => new_objectid, 'object_version' => object_version - 1)
+ .merge('object_version' => object_version - 1)
new_route = self.class.create!(atts_for_create)
duplicate_stop_points(for_route: new_route)
new_route
diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb
index de9a3e26f..89c492b91 100644
--- a/app/models/chouette/stop_point.rb
+++ b/app/models/chouette/stop_point.rb
@@ -40,14 +40,10 @@ module Chouette
end
def duplicate(for_route:)
- new_objectid = [
- for_route.objectid.split(':').first,
- *objectid.split(':')[1..2]
- ].join(':')
- keys_for_create = attributes.keys - %w{id created_at updated_at}
+ keys_for_create = attributes.keys - %w{id objectid created_at updated_at}
atts_for_create = attributes
.slice(*keys_for_create)
- .merge('objectid' => new_objectid, 'route_id' => for_route.id)
+ .merge('route_id' => for_route.id)
self.class.create!(atts_for_create)
end
diff --git a/spec/models/chouette/route/route_duplication_spec.rb b/spec/models/chouette/route/route_duplication_spec.rb
index 6168d1e38..f24435cf6 100644
--- a/spec/models/chouette/route/route_duplication_spec.rb
+++ b/spec/models/chouette/route/route_duplication_spec.rb
@@ -6,27 +6,43 @@ StopPoint = Chouette::StopPoint
RSpec.describe Route do
let!( :route ){ create :route }
- let( :new_objectid ){ [SecureRandom.hex, 'Route', SecureRandom.hex].join(':') }
- context 'duplicates' do
- describe 'a route' do
- it 'by creating a new one' do
- expect{ route.duplicate new_objectid }.to change{Route.count}.by(1)
- end
- it 'with the same values' do
- route.duplicate new_objectid
+ context '#duplicate' do
+ describe 'properties' do
+ it 'same attribute values' do
+ route.duplicate
expect( values_for_create(Route.last, except: %w{objectid}) ).to eq( values_for_create( route, except: %w{objectid} ) )
end
+ it 'same associated stop_areeas' do
+ expect( route.duplicate.stop_areas.pluck(:id) ).to eq(route.stop_areas.pluck(:id))
+ end
+ end
- it 'and also duplicating its stop points' do
- expect{ route.duplicate new_objectid }.to change{StopPoint.count}.by(route.stop_points.count)
+ describe 'side_effects' do
+ it {
+ expect{ route.duplicate }.to change{Route.count}.by(1)
+ }
+ it 'duplicates its stop points' do
+ expect{ route.duplicate }.to change{StopPoint.count}.by(route.stop_points.count)
end
- it 'but leaving the stop areas alone' do
- expect{ route.duplicate new_objectid }.not_to change{StopArea.count}
+ it 'does bot duplicate the stop areas' do
+ expect{ route.duplicate }.not_to change{StopArea.count}
end
- it "which are still accessible by the new route though" do
- expect( route.duplicate( new_objectid ).stop_areas.pluck(:id) ).to eq(route.stop_areas.pluck(:id))
+ end
+
+ describe 'is idempotent, concerning' do
+ let( :first_duplicate ){ route.duplicate }
+ let( :second_duplicate ){ first_duplicate.reload.duplicate }
+
+ it 'the required attributes' do
+ expect( values_for_create(first_duplicate, except: %w{objectid}) ).to eq( values_for_create( second_duplicate, except: %w{objectid} ) )
+ end
+
+ it 'the stop areas' do
+ expect( first_duplicate.stop_areas.pluck(:id) ).to eq( route.stop_areas.pluck(:id) )
+ expect( second_duplicate.stop_areas.pluck(:id) ).to eq( first_duplicate.stop_areas.pluck(:id) )
end
+
end
end
diff --git a/spec/models/chouette/stop_point_spec.rb b/spec/models/chouette/stop_point_spec.rb
index c43774085..d0314b8db 100644
--- a/spec/models/chouette/stop_point_spec.rb
+++ b/spec/models/chouette/stop_point_spec.rb
@@ -52,16 +52,5 @@ describe StopPoint, :type => :model do
it 'and old stop_area' do
expect(subject.duplicate(for_route: new_route).stop_area).to eq(subject.stop_area)
end
- it 'has an objectid, related to the new route' do
- new_stop_point = subject.duplicate(for_route: new_route)
-
- old_objectid_parts = subject.objectid.split(':')
- new_objectid_parts = new_stop_point.objectid.split(':')
- route_object_id_part = new_route.objectid.split(':').first
-
- expect(new_objectid_parts.first).to eq(route_object_id_part)
- expect(new_objectid_parts.second).to eq(old_objectid_parts.second)
- expect(new_objectid_parts.third).to eq(old_objectid_parts.third)
- end
end
end