From e5a29b451473c6f188d5096f21055d27a51fdf90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= <remy@rymai.me> Date: Mon, 9 Jan 2017 21:46:38 +0100 Subject: [PATCH] Improve presenter factory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable <remy@rymai.me> --- lib/gitlab/view/presenter/factory.rb | 22 +++++++++ lib/gitlab/view/presenter_factory.rb | 39 --------------- .../lib/gitlab/view/presenter/factory_spec.rb | 42 ++++++++++++++++ .../lib/gitlab/view/presenter_factory_spec.rb | 48 ------------------- 4 files changed, 64 insertions(+), 87 deletions(-) create mode 100644 lib/gitlab/view/presenter/factory.rb delete mode 100644 lib/gitlab/view/presenter_factory.rb create mode 100644 spec/lib/gitlab/view/presenter/factory_spec.rb delete mode 100644 spec/lib/gitlab/view/presenter_factory_spec.rb diff --git a/lib/gitlab/view/presenter/factory.rb b/lib/gitlab/view/presenter/factory.rb new file mode 100644 index 00000000000..92979c61a25 --- /dev/null +++ b/lib/gitlab/view/presenter/factory.rb @@ -0,0 +1,22 @@ +module Gitlab + module View + module Presenter + class Factory + def initialize(subject, **attributes) + @subject = subject + @attributes = attributes + end + + def fabricate! + presenter_class.new(@subject, @attributes) + end + + private + + def presenter_class + @subject.class.const_get('Presenter') + end + end + end + end +end diff --git a/lib/gitlab/view/presenter_factory.rb b/lib/gitlab/view/presenter_factory.rb deleted file mode 100644 index c8cab1249da..00000000000 --- a/lib/gitlab/view/presenter_factory.rb +++ /dev/null @@ -1,39 +0,0 @@ -module Gitlab - module View - class PresenterFactory - def initialize(subject, user: nil) - @subject = subject - @user = user - end - - def fabricate! - presenter = - if presenter_class.ancestors.include?(SimpleDelegator) - delegator_presenter - else - simple_presenter - end - - presenter - .with_subject(subject) - .with_user(user) - end - - private - - attr_reader :subject, :user - - def presenter_class - "#{subject.class.name.demodulize}Presenter".constantize - end - - def delegator_presenter - presenter_class.new(subject) - end - - def simple_presenter - presenter_class.new - end - end - end -end diff --git a/spec/lib/gitlab/view/presenter/factory_spec.rb b/spec/lib/gitlab/view/presenter/factory_spec.rb new file mode 100644 index 00000000000..7a65429b500 --- /dev/null +++ b/spec/lib/gitlab/view/presenter/factory_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' + +describe Gitlab::View::Presenter::Factory do + let(:variable) { create(:ci_variable) } + + describe '#initialize' do + context 'without optional parameters' do + subject do + described_class.new(variable) + end + + it 'takes a subject and optional params' do + expect { subject }.not_to raise_error + end + end + + context 'with optional parameters' do + subject do + described_class.new(variable, user: 'user') + end + + it 'takes a subject and optional params' do + expect { subject }.not_to raise_error + end + end + end + + describe '#fabricate!' do + subject do + described_class.new(variable, user: 'user', foo: 'bar').fabricate! + end + + it 'exposes given params' do + expect(subject.user).to eq('user') + expect(subject.foo).to eq('bar') + end + + it 'detects the presenter based on the given subject' do + expect(subject).to be_a(Ci::Variable::Presenter) + end + end +end diff --git a/spec/lib/gitlab/view/presenter_factory_spec.rb b/spec/lib/gitlab/view/presenter_factory_spec.rb deleted file mode 100644 index c5e4d86f6c9..00000000000 --- a/spec/lib/gitlab/view/presenter_factory_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'spec_helper' - -describe Gitlab::View::PresenterFactory do - let(:appearance) { build(:appearance) } - let(:broadcast_message) { build(:broadcast_message) } - - before do - class AppearancePresenter - include Gitlab::View::Presenter - end - - class BroadcastMessagePresenter < SimpleDelegator - include Gitlab::View::Presenter - end - end - - describe '#initialize' do - subject do - described_class.new(appearance) - end - - it 'takes a subject and optional params' do - expect { subject }.not_to raise_error - end - end - - describe '#fabricate!' do - context 'without delegation' do - subject do - described_class.new(appearance).fabricate! - end - - it 'does not forward missing methods to subject' do - expect { subject.title }.to raise_error(NoMethodError) - end - end - - context 'with delegation' do - subject do - described_class.new(broadcast_message).fabricate! - end - - it 'forwards missing methods to subject' do - expect(subject.message).to eq(broadcast_message.message) - end - end - end -end -- GitLab