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