Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2017-01-09 23:45:49 +0300
committerRémy Coutable <remy@rymai.me>2017-01-18 18:38:34 +0300
commitbf789ff567c71ff68c216bfa8f3d43e09b6f49fb (patch)
tree28d4ac2aa74824eb5d85dc8271474980a3237bbe /spec/lib/gitlab/view
parentfd72c0f4c748658f539d24a286366e9ac7a22b57 (diff)
Improve presenter architecture
Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'spec/lib/gitlab/view')
-rw-r--r--spec/lib/gitlab/view/presenter/base_spec.rb38
-rw-r--r--spec/lib/gitlab/view/presenter/delegated_spec.rb33
-rw-r--r--spec/lib/gitlab/view/presenter/simple_spec.rb33
-rw-r--r--spec/lib/gitlab/view/presenter_spec.rb29
4 files changed, 104 insertions, 29 deletions
diff --git a/spec/lib/gitlab/view/presenter/base_spec.rb b/spec/lib/gitlab/view/presenter/base_spec.rb
new file mode 100644
index 00000000000..57b98276622
--- /dev/null
+++ b/spec/lib/gitlab/view/presenter/base_spec.rb
@@ -0,0 +1,38 @@
+require 'spec_helper'
+
+describe Gitlab::View::Presenter::Base do
+ let(:project) { double(:project) }
+ let(:presenter_class) do
+ Struct.new(:subject).include(described_class)
+ end
+
+ subject do
+ presenter_class.new(project)
+ end
+
+ describe '.presents' do
+ it 'exposes #subject with the given keyword' do
+ presenter_class.presents(:foo)
+
+ expect(subject.foo).to eq(project)
+ end
+ end
+
+ describe '#can?' do
+ let(:project) { create(:empty_project) }
+
+ context 'user is not allowed' do
+ it 'returns false' do
+ expect(subject.can?(nil, :read_project)).to be_falsy
+ end
+ end
+
+ context 'user is allowed' do
+ let(:project) { create(:empty_project, :public) }
+
+ it 'returns true' do
+ expect(subject.can?(nil, :read_project)).to be_truthy
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/view/presenter/delegated_spec.rb b/spec/lib/gitlab/view/presenter/delegated_spec.rb
new file mode 100644
index 00000000000..816d6b7c6d4
--- /dev/null
+++ b/spec/lib/gitlab/view/presenter/delegated_spec.rb
@@ -0,0 +1,33 @@
+require 'spec_helper'
+
+describe Gitlab::View::Presenter::Delegated do
+ let(:project) { double(:project, foo: 'bar') }
+ let(:presenter_class) do
+ Class.new(described_class)
+ end
+
+ subject do
+ presenter_class.new(project)
+ end
+
+ it 'includes Gitlab::View::Presenter::Base' do
+ expect(described_class).to include(Gitlab::View::Presenter::Base)
+ end
+
+ describe '#initialize' do
+ subject do
+ presenter_class.new(project, user: 'user', foo: 'bar')
+ end
+
+ it 'takes arbitrary key/values and exposes them' do
+ expect(subject.user).to eq('user')
+ expect(subject.foo).to eq('bar')
+ end
+ end
+
+ describe 'delegation' do
+ it 'does not forward missing methods to subject' do
+ expect(subject.foo).to eq('bar')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/view/presenter/simple_spec.rb b/spec/lib/gitlab/view/presenter/simple_spec.rb
new file mode 100644
index 00000000000..baf074019ec
--- /dev/null
+++ b/spec/lib/gitlab/view/presenter/simple_spec.rb
@@ -0,0 +1,33 @@
+require 'spec_helper'
+
+describe Gitlab::View::Presenter::Simple do
+ let(:project) { double(:project) }
+ let(:presenter_class) do
+ Class.new(described_class)
+ end
+
+ subject do
+ presenter_class.new(project)
+ end
+
+ it 'includes Gitlab::View::Presenter::Base' do
+ expect(described_class).to include(Gitlab::View::Presenter::Base)
+ end
+
+ describe '#initialize' do
+ subject do
+ presenter_class.new(project, user: 'user', foo: 'bar')
+ end
+
+ it 'takes arbitrary key/values and exposes them' do
+ expect(subject.user).to eq('user')
+ expect(subject.foo).to eq('bar')
+ end
+ end
+
+ describe 'delegation' do
+ it 'does not forward missing methods to subject' do
+ expect { subject.foo }.to raise_error(NoMethodError)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/view/presenter_spec.rb b/spec/lib/gitlab/view/presenter_spec.rb
deleted file mode 100644
index 0880fbe5d77..00000000000
--- a/spec/lib/gitlab/view/presenter_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::View::Presenter do
- let(:project) { double(:project, bar: 'baz!') }
- let(:presenter) do
- base_presenter = described_class
-
- Class.new do
- include base_presenter
-
- presents :foo
- end
- end
- subject do
- presenter.new.with_subject(project)
- end
-
- describe '#initialize' do
- it 'takes an object accessible via a reader' do
- expect(subject.foo).to eq(project)
- end
- end
-
- describe 'common helpers' do
- it 'responds to #can?' do
- expect(subject).to respond_to(:can?)
- end
- end
-end