aboutsummaryrefslogtreecommitdiffstats
path: root/spec/models/chouette/route/route_duplication_spec.rb
blob: 47233b04e938a06faa6bafbe8844fc94b2cbf39c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
RSpec.describe Chouette::Route do

  let!( :route ){ create :route }

  context '#duplicate' do
    describe 'properties' do
      it 'same attribute values' do
        route.duplicate
        expect( values_for_create(Chouette::Route.last, except: %w{objectid name checksum checksum_source}) ).to eq( values_for_create( route, except: %w{objectid name checksum checksum_source} ) )
      end
      it 'same associated stop_areeas' do
        expect( route.duplicate.stop_areas.pluck(:id) ).to eq(route.stop_areas.pluck(:id))
      end
    end

    describe 'side_effects' do
      it {
        expect{ route.duplicate }.to change{Chouette::Route.count}.by(1)
      }
      it 'duplicates its stop points' do
        expect{ route.duplicate }.to change{Chouette::StopPoint.count}.by(route.stop_points.count)
      end

      it 'duplicates its stop points in the same order' do
        expect(route.duplicate.stop_points.order(:position).map(&:stop_area_id)).to eq route.stop_points.order(:position).map(&:stop_area_id)
      end

      it 'does not duplicate the stop areas' do
        expect{ route.duplicate }.not_to change{Chouette::StopArea.count}
      end
    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 name checksum checksum_source}) ).to eq( values_for_create( second_duplicate, except: %w{objectid name checksum checksum_source} ) )
      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

end