diff options
| author | Robert | 2017-08-16 06:57:07 +0200 |
|---|---|---|
| committer | Robert | 2017-08-16 06:57:07 +0200 |
| commit | f4863d7ea2e580ee1eb5f5cf498c07441e3ccff3 (patch) | |
| tree | 67b7355d8cdb95c3cc8afb1aa0157b65e8e020b5 | |
| parent | 373a4089173795d011ebd6adf7382b2a5e40a51b (diff) | |
| download | chouette-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.rb | 6 | ||||
| -rw-r--r-- | app/models/chouette/stop_point.rb | 8 | ||||
| -rw-r--r-- | spec/models/chouette/route/route_duplication_spec.rb | 44 | ||||
| -rw-r--r-- | spec/models/chouette/stop_point_spec.rb | 11 |
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 |
