Merge branch 'mk-fix-permanent-redirect-validation' into 'master'
Fix Route validation when conflicting permanent redirects exist Closes gitlab-com/support-forum#2883 and #41786 See merge request gitlab-org/gitlab-ce!16397
This commit is contained in:
commit
d607f16fe5
4 changed files with 81 additions and 1 deletions
|
@ -8,7 +8,7 @@ class Route < ActiveRecord::Base
|
|||
presence: true,
|
||||
uniqueness: { case_sensitive: false }
|
||||
|
||||
validate :ensure_permanent_paths
|
||||
validate :ensure_permanent_paths, if: :path_changed?
|
||||
|
||||
after_create :delete_conflicting_redirects
|
||||
after_update :delete_conflicting_redirects, if: :path_changed?
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Prevent invalid Route path if path is unchanged
|
||||
merge_request: 16397
|
||||
author:
|
||||
type: fixed
|
15
spec/factories/redirect_routes.rb
Normal file
15
spec/factories/redirect_routes.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
FactoryBot.define do
|
||||
factory :redirect_route do
|
||||
sequence(:path) { |n| "redirect#{n}" }
|
||||
source factory: :group
|
||||
permanent false
|
||||
|
||||
trait :permanent do
|
||||
permanent true
|
||||
end
|
||||
|
||||
trait :temporary do
|
||||
permanent false
|
||||
end
|
||||
end
|
||||
end
|
|
@ -16,6 +16,66 @@ describe Route do
|
|||
it { is_expected.to validate_presence_of(:source) }
|
||||
it { is_expected.to validate_presence_of(:path) }
|
||||
it { is_expected.to validate_uniqueness_of(:path).case_insensitive }
|
||||
|
||||
describe '#ensure_permanent_paths' do
|
||||
context 'when the route is not yet persisted' do
|
||||
let(:new_route) { described_class.new(path: 'foo', source: build(:group)) }
|
||||
|
||||
context 'when permanent conflicting redirects exist' do
|
||||
it 'is invalid' do
|
||||
redirect = build(:redirect_route, :permanent, path: 'foo/bar/baz')
|
||||
redirect.save!(validate: false)
|
||||
|
||||
expect(new_route.valid?).to be_falsey
|
||||
expect(new_route.errors.first[1]).to eq('foo has been taken before. Please use another one')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when no permanent conflicting redirects exist' do
|
||||
it 'is valid' do
|
||||
expect(new_route.valid?).to be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when path has changed' do
|
||||
before do
|
||||
route.path = 'foo'
|
||||
end
|
||||
|
||||
context 'when permanent conflicting redirects exist' do
|
||||
it 'is invalid' do
|
||||
redirect = build(:redirect_route, :permanent, path: 'foo/bar/baz')
|
||||
redirect.save!(validate: false)
|
||||
|
||||
expect(route.valid?).to be_falsey
|
||||
expect(route.errors.first[1]).to eq('foo has been taken before. Please use another one')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when no permanent conflicting redirects exist' do
|
||||
it 'is valid' do
|
||||
expect(route.valid?).to be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when path has not changed' do
|
||||
context 'when permanent conflicting redirects exist' do
|
||||
it 'is valid' do
|
||||
redirect = build(:redirect_route, :permanent, path: 'git_lab/foo/bar')
|
||||
redirect.save!(validate: false)
|
||||
|
||||
expect(route.valid?).to be_truthy
|
||||
end
|
||||
end
|
||||
context 'when no permanent conflicting redirects exist' do
|
||||
it 'is valid' do
|
||||
expect(route.valid?).to be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'callbacks' do
|
||||
|
|
Loading…
Reference in a new issue