From fd72c0f4c748658f539d24a286366e9ac7a22b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Mon, 9 Jan 2017 21:43:15 +0100 Subject: [PATCH] Handle presenters in BasePolicy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- app/policies/base_policy.rb | 4 ++++ spec/policies/base_policy_spec.rb | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 spec/policies/base_policy_spec.rb diff --git a/app/policies/base_policy.rb b/app/policies/base_policy.rb index 118c100ca11..43b4a15b81a 100644 --- a/app/policies/base_policy.rb +++ b/app/policies/base_policy.rb @@ -53,6 +53,10 @@ class BasePolicy def self.class_for(subject) return GlobalPolicy if subject.nil? + if subject.class.ancestors.include?(Gitlab::View::Presenter::Base) + subject = subject.subject + end + subject.class.ancestors.each do |klass| next unless klass.name diff --git a/spec/policies/base_policy_spec.rb b/spec/policies/base_policy_spec.rb new file mode 100644 index 00000000000..439d6436f34 --- /dev/null +++ b/spec/policies/base_policy_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe BasePolicy, models: true do + let(:build) { create(:ci_build) } + + describe '.class_for' do + it 'detects policy class based on the subject ancestors' do + expect(described_class.class_for(build)).to eq(Ci::BuildPolicy) + end + + it 'detects policy class for a presented subject' do + presentee = Ci::Build::Presenter.new(build) + + expect(described_class.class_for(presentee)).to eq(Ci::BuildPolicy) + end + end +end