route_spec.rb 7.0 KB
Newer Older
1 2 3
require 'spec_helper'

describe Route, models: true do
M
Michael Kozono 已提交
4 5
  let(:group) { create(:group, path: 'git_lab', name: 'git_lab') }
  let(:route) { group.route }
6 7 8 9 10 11

  describe 'relationships' do
    it { is_expected.to belong_to(:source) }
  end

  describe 'validations' do
M
Michael Kozono 已提交
12
    before { route }
13 14 15 16 17
    it { is_expected.to validate_presence_of(:source) }
    it { is_expected.to validate_presence_of(:path) }
    it { is_expected.to validate_uniqueness_of(:path) }
  end

M
Michael Kozono 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
  describe 'callbacks' do
    context 'after update' do
      it 'calls #create_redirect_for_old_path' do
        expect(route).to receive(:create_redirect_for_old_path)
        route.update_attributes(path: 'foo')
      end

      it 'calls #delete_conflicting_redirects' do
        expect(route).to receive(:delete_conflicting_redirects)
        route.update_attributes(path: 'foo')
      end
    end

    context 'after create' do
      it 'calls #delete_conflicting_redirects' do
        route.destroy
        new_route = Route.new(source: group, path: group.path)
        expect(new_route).to receive(:delete_conflicting_redirects)
        new_route.save!
      end
    end
  end

41 42 43 44 45 46 47 48 49 50 51 52
  describe '.inside_path' do
    let!(:nested_group) { create(:group, path: 'test', name: 'test', parent: group) }
    let!(:deep_nested_group) { create(:group, path: 'foo', name: 'foo', parent: nested_group) }
    let!(:another_group) { create(:group, path: 'other') }
    let!(:similar_group) { create(:group, path: 'gitllab') }
    let!(:another_group_nested) { create(:group, path: 'another', name: 'another', parent: similar_group) }

    it 'returns correct routes' do
      expect(Route.inside_path('git_lab')).to match_array([nested_group.route, deep_nested_group.route])
    end
  end

M
Michael Kozono 已提交
53
  describe '#rename_descendants' do
54 55 56
    let!(:nested_group) { create(:group, path: 'test', name: 'test', parent: group) }
    let!(:deep_nested_group) { create(:group, path: 'foo', name: 'foo', parent: nested_group) }
    let!(:similar_group) { create(:group, path: 'gitlab-org', name: 'gitlab-org') }
57 58
    let!(:another_group) { create(:group, path: 'gittlab', name: 'gitllab') }
    let!(:another_group_nested) { create(:group, path: 'git_lab', name: 'git_lab', parent: another_group) }
59

60
    context 'path update' do
61 62 63
      context 'when route name is set' do
        before { route.update_attributes(path: 'bar') }

M
Michael Kozono 已提交
64
        it 'updates children routes with new path' do
65 66 67 68
          expect(described_class.exists?(path: 'bar')).to be_truthy
          expect(described_class.exists?(path: 'bar/test')).to be_truthy
          expect(described_class.exists?(path: 'bar/test/foo')).to be_truthy
          expect(described_class.exists?(path: 'gitlab-org')).to be_truthy
69 70
          expect(described_class.exists?(path: 'gittlab')).to be_truthy
          expect(described_class.exists?(path: 'gittlab/git_lab')).to be_truthy
71 72
        end
      end
73

74 75 76 77 78 79 80 81
      context 'when route name is nil' do
        before do
          route.update_column(:name, nil)
        end

        it "does not fail" do
          expect(route.update_attributes(path: 'bar')).to be_truthy
        end
82
      end
M
Michael Kozono 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96

      context 'when conflicting redirects exist' do
        let!(:conflicting_redirect1) { route.create_redirect('bar/test') }
        let!(:conflicting_redirect2) { route.create_redirect('bar/test/foo') }
        let!(:conflicting_redirect3) { route.create_redirect('gitlab-org') }

        it 'deletes the conflicting redirects' do
          route.update_attributes(path: 'bar')

          expect(RedirectRoute.exists?(path: 'bar/test')).to be_falsey
          expect(RedirectRoute.exists?(path: 'bar/test/foo')).to be_falsey
          expect(RedirectRoute.exists?(path: 'gitlab-org')).to be_truthy
        end
      end
97 98 99
    end

    context 'name update' do
M
Michael Kozono 已提交
100
      it 'updates children routes with new path' do
101
        route.update_attributes(name: 'bar')
102

103 104 105 106 107
        expect(described_class.exists?(name: 'bar')).to be_truthy
        expect(described_class.exists?(name: 'bar / test')).to be_truthy
        expect(described_class.exists?(name: 'bar / test / foo')).to be_truthy
        expect(described_class.exists?(name: 'gitlab-org')).to be_truthy
      end
108 109 110 111 112 113 114 115

      it 'handles a rename from nil' do
        # Note: using `update_columns` to skip all validation and callbacks
        route.update_columns(name: nil)

        expect { route.update_attributes(name: 'bar') }
          .to change { route.name }.from(nil).to('bar')
      end
116 117
    end
  end
118

M
Michael Kozono 已提交
119
  describe '#create_redirect_for_old_path' do
120 121
    context 'if the path changed' do
      it 'creates a RedirectRoute for the old path' do
M
Michael Kozono 已提交
122 123
        redirect_scope = route.source.redirect_routes.where(path: 'git_lab')
        expect(redirect_scope.exists?).to be_falsey
124 125
        route.path = 'new-path'
        route.save!
M
Michael Kozono 已提交
126
        expect(redirect_scope.exists?).to be_truthy
127 128
      end
    end
M
Michael Kozono 已提交
129
  end
130

M
Michael Kozono 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
  describe '#create_redirect' do
    it 'creates a RedirectRoute with the same source' do
      redirect_route = route.create_redirect('foo')
      expect(redirect_route).to be_a(RedirectRoute)
      expect(redirect_route).to be_persisted
      expect(redirect_route.source).to eq(route.source)
      expect(redirect_route.path).to eq('foo')
    end
  end

  describe '#delete_conflicting_redirects' do
    context 'when a redirect route with the same path exists' do
      let!(:redirect1) { route.create_redirect(route.path) }

      it 'deletes the redirect' do
        route.delete_conflicting_redirects
        expect(route.conflicting_redirects).to be_empty
      end

      context 'when redirect routes with paths descending from the route path exists' do
        let!(:redirect2) { route.create_redirect("#{route.path}/foo") }
        let!(:redirect3) { route.create_redirect("#{route.path}/foo/bar") }
        let!(:redirect4) { route.create_redirect("#{route.path}/baz/quz") }
        let!(:other_redirect) { route.create_redirect("other") }

        it 'deletes all redirects with paths that descend from the route path' do
          route.delete_conflicting_redirects
          expect(route.conflicting_redirects).to be_empty
        end
      end
    end
  end

  describe '#conflicting_redirects' do
    context 'when a redirect route with the same path exists' do
      let!(:redirect1) { route.create_redirect(route.path) }

      it 'returns the redirect route' do
        expect(route.conflicting_redirects).to be_an(ActiveRecord::Relation)
        expect(route.conflicting_redirects).to match_array([redirect1])
      end

      context 'when redirect routes with paths descending from the route path exists' do
        let!(:redirect2) { route.create_redirect("#{route.path}/foo") }
        let!(:redirect3) { route.create_redirect("#{route.path}/foo/bar") }
        let!(:redirect4) { route.create_redirect("#{route.path}/baz/quz") }
        let!(:other_redirect) { route.create_redirect("other") }

        it 'returns the redirect routes' do
          expect(route.conflicting_redirects).to be_an(ActiveRecord::Relation)
          expect(route.conflicting_redirects).to match_array([redirect1, redirect2, redirect3, redirect4])
        end
183 184 185
      end
    end
  end
186
end