From 49e4ef3b41ef635cf50e45c9c6b82d64f38c0ed7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rub=C3=A9n=20D=C3=A1vila?= <rdavila84@gmail.com>
Date: Wed, 2 Mar 2016 12:35:56 -0500
Subject: [PATCH] Add specs to ForksController#index.

* Also refactor query to get projects accessible for current user.
  ProjectsFinder actually return public projects when no user is passed.
---
 app/controllers/projects/forks_controller.rb  |  7 +-
 .../projects/forks_controller_spec.rb         | 72 +++++++++++++++++++
 2 files changed, 73 insertions(+), 6 deletions(-)
 create mode 100644 spec/controllers/projects/forks_controller_spec.rb

diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb
index c71ecf4e2bb..c71b83c89b7 100644
--- a/app/controllers/projects/forks_controller.rb
+++ b/app/controllers/projects/forks_controller.rb
@@ -6,12 +6,7 @@ class Projects::ForksController < Projects::ApplicationController
   def index
     base_query = project.forks.includes(:creator)
 
-    @forks = if current_user
-               base_query.merge(ProjectsFinder.new.execute(current_user))
-             else
-               base_query.where('projects.visibility_level = ?', Project::PUBLIC)
-             end
-
+    @forks               = base_query.merge(ProjectsFinder.new.execute(current_user))
     @total_forks_count   = base_query.size
     @private_forks_count = @total_forks_count - @forks.size
     @public_forks_count  = @total_forks_count - @private_forks_count
diff --git a/spec/controllers/projects/forks_controller_spec.rb b/spec/controllers/projects/forks_controller_spec.rb
new file mode 100644
index 00000000000..883bbaedd4e
--- /dev/null
+++ b/spec/controllers/projects/forks_controller_spec.rb
@@ -0,0 +1,72 @@
+require 'spec_helper'
+
+describe Projects::ForksController do
+  let(:user) { create(:user) }
+  let(:project) { create(:project, visibility_level: Project::PUBLIC) }
+  let(:forked_project) { Projects::ForkService.new(project, user).execute }
+  let(:group) { create(:group, owner: forked_project.creator) }
+
+  describe 'GET index' do
+    def get_forks
+      get :index,
+        namespace_id: project.namespace.to_param,
+        project_id: project.to_param
+    end
+
+    context 'when fork is public' do
+      before { forked_project.update_attribute(:visibility_level, Project::PUBLIC) }
+
+      it 'should be visible for non logged in users' do
+        get_forks
+
+        expect(assigns[:forks]).to be_present
+      end
+    end
+
+    context 'when fork is private' do
+      before do
+        forked_project.update_attributes(visibility_level: Project::PRIVATE, group: group)
+      end
+
+      it 'should not be visible for non logged in users' do
+        get_forks
+
+        expect(assigns[:forks]).to be_blank
+      end
+
+      context 'when user is logged in' do
+        before { sign_in(project.creator) }
+
+        context 'when user is not a Project member neither a group member' do
+          it 'should not see the Project listed' do
+            get_forks
+
+            expect(assigns[:forks]).to be_blank
+          end
+        end
+
+        context 'when user is a member of the Project' do
+          before { forked_project.team << [project.creator, :developer] }
+
+          it 'should see the project listed' do
+            get_forks
+
+            expect(assigns[:forks]).to be_present
+          end
+        end
+
+        context 'when user is a member of the Group' do
+          before { forked_project.group.add_developer(project.creator) }
+
+          it 'should see the project listed' do
+            get_forks
+
+            expect(assigns[:forks]).to be_present
+          end
+        end
+
+      end
+    end
+  end
+
+end
-- 
GitLab