Commit 04b76c3a57793640818af72eb621ab7213e25002

Authored by Rafael Reggiani Manzo
2 parents 42963265 141ff299
Exists in colab and in 2 other branches master, stable

Merge pull request #348 from mezuro/hide_repositories

Hide repositories
app/controllers/repositories_controller.rb
@@ -14,7 +14,7 @@ class RepositoriesController < ApplicationController @@ -14,7 +14,7 @@ class RepositoriesController < ApplicationController
14 skip_before_action :verify_authenticity_token, :only => [:notify_push] 14 skip_before_action :verify_authenticity_token, :only => [:notify_push]
15 15
16 def index 16 def index
17 - @repositories = Repository.all 17 + @repositories = Repository.public_or_owned_by_user(current_user)
18 end 18 end
19 19
20 # GET /projects/1/repositories/1 20 # GET /projects/1/repositories/1
app/models/repository.rb
1 class Repository < KalibroClient::Entities::Processor::Repository 1 class Repository < KalibroClient::Entities::Processor::Repository
2 include KalibroRecord 2 include KalibroRecord
3 3
  4 + attr_writer :attributes
  5 +
  6 + def self.public_or_owned_by_user(user = nil)
  7 + repository_attributes = RepositoryAttributes.where(public: true)
  8 + repository_attributes += RepositoryAttributes.where(user_id: user.id, public: false) if user
  9 +
  10 + repository_attributes.map do |attribute|
  11 + begin
  12 + self.find(attribute.repository_id)
  13 + rescue Likeno::Errors::RecordNotFound
  14 + nil
  15 + end
  16 + end.compact
  17 + end
  18 +
4 def self.latest(count=1) 19 def self.latest(count=1)
5 - all.sort { |one, another| another.id <=> one.id }.first(count) 20 + all.sort { |one, another| another.id <=> one.id }.select { |repository| repository.attributes.public }.first(count)
  21 + end
  22 +
  23 + def attributes
  24 + @attributes ||= RepositoryAttributes.find_by_repository_id(@id)
6 end 25 end
7 end 26 end
db/migrate/20160418192431_add_public_to_repository_attributes.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +class AddPublicToRepositoryAttributes < ActiveRecord::Migration
  2 + def change
  3 + add_column :repository_attributes, :public, :boolean, default: true
  4 + end
  5 +end
@@ -11,10 +11,7 @@ @@ -11,10 +11,7 @@
11 # 11 #
12 # It's strongly recommended that you check this file into your version control system. 12 # It's strongly recommended that you check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(version: 20151106182639) do  
15 -  
16 - # These are extensions that must be enabled in order to support this database  
17 - enable_extension "plpgsql" 14 +ActiveRecord::Schema.define(version: 20160418192431) do
18 15
19 create_table "kalibro_configuration_attributes", force: :cascade do |t| 16 create_table "kalibro_configuration_attributes", force: :cascade do |t|
20 t.integer "user_id" 17 t.integer "user_id"
@@ -44,11 +41,12 @@ ActiveRecord::Schema.define(version: 20151106182639) do @@ -44,11 +41,12 @@ ActiveRecord::Schema.define(version: 20151106182639) do
44 create_table "repository_attributes", force: :cascade do |t| 41 create_table "repository_attributes", force: :cascade do |t|
45 t.integer "repository_id" 42 t.integer "repository_id"
46 t.integer "user_id" 43 t.integer "user_id"
47 - t.datetime "created_at", null: false  
48 - t.datetime "updated_at", null: false 44 + t.datetime "created_at", null: false
  45 + t.datetime "updated_at", null: false
  46 + t.boolean "public", default: true
49 end 47 end
50 48
51 - add_index "repository_attributes", ["user_id"], name: "index_repository_attributes_on_user_id", using: :btree 49 + add_index "repository_attributes", ["user_id"], name: "index_repository_attributes_on_user_id"
52 50
53 create_table "users", force: :cascade do |t| 51 create_table "users", force: :cascade do |t|
54 t.string "name", limit: 255, default: "", null: false 52 t.string "name", limit: 255, default: "", null: false
@@ -66,7 +64,7 @@ ActiveRecord::Schema.define(version: 20151106182639) do @@ -66,7 +64,7 @@ ActiveRecord::Schema.define(version: 20151106182639) do
66 t.string "last_sign_in_ip", limit: 255 64 t.string "last_sign_in_ip", limit: 255
67 end 65 end
68 66
69 - add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree  
70 - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 67 + add_index "users", ["email"], name: "index_users_on_email", unique: true
  68 + add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
71 69
72 end 70 end
features/repository/index.feature
@@ -19,8 +19,9 @@ Feature: Repository listing @@ -19,8 +19,9 @@ Feature: Repository listing
19 And I have a sample repository 19 And I have a sample repository
20 And I have a sample project 20 And I have a sample project
21 And I have a sample repository within the sample project 21 And I have a sample repository within the sample project
  22 + And I own that repository
22 And I am at the All Repositories page 23 And I am at the All Repositories page
23 - Then the sample repository should be there 24 + Then the sample repository should not be there
24 And the project repository should be there 25 And the project repository should be there
25 And I should not see "You must be logged in to create new Repositories." 26 And I should not see "You must be logged in to create new Repositories."
26 27
features/step_definitions/repository_steps.rb
@@ -249,6 +249,10 @@ Then(/^the sample repository should be there$/) do @@ -249,6 +249,10 @@ Then(/^the sample repository should be there$/) do
249 expect(page).to have_content(@independent_repository.description) 249 expect(page).to have_content(@independent_repository.description)
250 end 250 end
251 251
  252 +Then(/^the sample repository should not be there$/) do
  253 + expect(page).to_not have_content(@independent_repository.name)
  254 +end
  255 +
252 Then(/^the project repository should be there$/) do 256 Then(/^the project repository should be there$/) do
253 expect(page).to have_content(@repository.name) 257 expect(page).to have_content(@repository.name)
254 expect(page).to have_content(@repository.description) 258 expect(page).to have_content(@repository.description)
spec/controllers/repositories_controller_spec.rb
@@ -5,7 +5,7 @@ describe RepositoriesController, :type =&gt; :controller do @@ -5,7 +5,7 @@ describe RepositoriesController, :type =&gt; :controller do
5 let!(:repository) { FactoryGirl.build(:repository) } 5 let!(:repository) { FactoryGirl.build(:repository) }
6 6
7 before :each do 7 before :each do
8 - Repository.expects(:all).returns([repository]) 8 + Repository.expects(:public_or_owned_by_user).returns([repository])
9 get :index 9 get :index
10 end 10 end
11 11
spec/factories/repository_attributes.rb
1 FactoryGirl.define do 1 FactoryGirl.define do
2 factory :repository_attributes do 2 factory :repository_attributes do
  3 + self.public true
3 association :user, strategy: :build 4 association :user, strategy: :build
4 association :repository, strategy: :build 5 association :repository, strategy: :build
  6 +
  7 + trait :private do
  8 + self.public false
  9 + end
5 end 10 end
6 end 11 end
spec/models/repository_spec.rb
1 require 'rails_helper' 1 require 'rails_helper'
2 2
3 describe Repository do 3 describe Repository do
  4 + describe 'methods' do
  5 + describe 'attributes' do
  6 + subject { FactoryGirl.build(:repository) }
  7 +
  8 + context 'when there are attributes' do
  9 + let!(:repository_attributes) { FactoryGirl.build(:repository_attributes) }
  10 +
  11 + before :each do
  12 + RepositoryAttributes.expects(:find_by_repository_id).returns(repository_attributes)
  13 + end
  14 +
  15 + it 'is expected to return the repository attributes' do
  16 + expect(subject.attributes).to eq(repository_attributes)
  17 + end
  18 + end
  19 +
  20 + context 'when there are no attributes' do
  21 + before :each do
  22 + RepositoryAttributes.expects(:find_by_repository_id).returns(nil)
  23 + end
  24 +
  25 + it 'is expected to return the repository attributes' do
  26 + expect(subject.attributes).to be_nil
  27 + end
  28 + end
  29 + end
  30 + end
  31 +
4 describe 'class method' do 32 describe 'class method' do
5 describe 'latest' do 33 describe 'latest' do
6 - let!(:repository) { FactoryGirl.build(:repository, id: 1) }  
7 - let!(:another_repository) { FactoryGirl.build(:another_repository, id: 2) } 34 + let!(:repository) { FactoryGirl.build(:repository) }
  35 + let!(:another_repository) { FactoryGirl.build(:repository, id: 2) }
  36 + let!(:repository_attributes) { FactoryGirl.build(:repository_attributes) }
  37 +
  38 + before :each do
  39 + repository.expects(:attributes).returns(repository_attributes)
  40 + another_repository.expects(:attributes).returns(repository_attributes)
  41 + end
  42 +
  43 + context 'without private repositories' do
  44 + before :each do
  45 + Repository.expects(:all).returns([repository, another_repository])
  46 + end
  47 +
  48 + it 'is expected to return the two repositories ordered' do
  49 + expect(Repository.latest(2)).to eq([another_repository, repository])
  50 + end
  51 +
  52 + context 'when no parameter is passed' do
  53 + it 'is expected to return just the most recent repository' do
  54 + expect(Repository.latest).to eq([another_repository])
  55 + end
  56 + end
  57 + end
  58 +
  59 + context 'with private repositories' do
  60 + let(:private_repository) { FactoryGirl.build(:repository, id: 3) }
  61 + let(:private_attributes) { FactoryGirl.build(:repository_attributes, :private) }
  62 +
  63 + before :each do
  64 + private_repository.expects(:attributes).returns(private_attributes)
8 65
9 - before do  
10 - Repository.expects(:all).returns([repository, another_repository]) 66 + Repository.expects(:all).returns([repository, another_repository, private_repository])
  67 + end
  68 +
  69 + it 'is expected to return only the public ones' do
  70 + expect(Repository.latest(2)).to eq([another_repository, repository])
  71 + end
11 end 72 end
  73 + end
  74 +
  75 + describe 'public_or_owned_by_user' do
  76 + let!(:user) { FactoryGirl.build(:user, :with_id) }
  77 +
  78 + let!(:owned_private_attrs) { FactoryGirl.build(:repository_attributes, :private, user_id: user.id) }
  79 + let!(:owned_public_attrs) { FactoryGirl.build(:repository_attributes, user_id: user.id) }
  80 + let!(:not_owned_private_attrs) { FactoryGirl.build(:repository_attributes, :private, user_id: user.id + 1) }
  81 + let!(:not_owned_public_attrs) { FactoryGirl.build(:repository_attributes, user_id: user.id + 1) }
  82 +
  83 + let!(:public_attrs) { [owned_public_attrs, not_owned_public_attrs] }
  84 + let(:public_repositories) { public_attrs.map(&:repository) }
  85 +
  86 + let!(:owned_or_public_attrs) { public_attrs + [owned_private_attrs] }
  87 + let!(:owned_or_public_repositories) { owned_or_public_attrs.map(&:repository) }
12 88
13 - it 'should return the two repositorys ordered' do  
14 - expect(Repository.latest(2)).to eq([another_repository, repository]) 89 + let(:all_repositories) { owned_or_public_repositories + [not_owned_private_attrs.repository] }
  90 +
  91 + context 'when repositories exist' do
  92 + before :each do
  93 + all_repositories.each do |repository|
  94 + described_class.stubs(:find).with(repository.id).returns(repository)
  95 + end
  96 +
  97 + RepositoryAttributes.expects(:where).with(public: true).returns(public_attrs)
  98 + end
  99 +
  100 + context 'when user is not provided' do
  101 + it 'is expected to find all public repositories' do
  102 + expect(described_class.public_or_owned_by_user).to eq(public_repositories)
  103 + end
  104 + end
  105 +
  106 + context 'when user is provided' do
  107 + before do
  108 + RepositoryAttributes.expects(:where).with(user_id: user.id, public: false).returns([owned_private_attrs])
  109 + end
  110 +
  111 + it 'is expected to find all public and owned repositories' do
  112 + expect(described_class.public_or_owned_by_user(user)).to eq(owned_or_public_repositories)
  113 + end
  114 + end
15 end 115 end
16 116
17 - context 'when no parameter is passed' do  
18 - it 'should return just the most recent repository' do  
19 - expect(Repository.latest).to eq([another_repository]) 117 + context 'when no repositories exist' do
  118 + before :each do
  119 + all_repositories.each do |repository|
  120 + described_class.stubs(:find).with(repository.id).raises(Likeno::Errors::RecordNotFound)
  121 + end
  122 +
  123 + RepositoryAttributes.expects(:where).with(public: true).returns(public_attrs)
  124 + end
  125 +
  126 + it 'is expected to be empty' do
  127 + expect(described_class.public_or_owned_by_user).to be_empty
20 end 128 end
21 end 129 end
22 end 130 end
23 end 131 end
24 -end  
25 \ No newline at end of file 132 \ No newline at end of file
  133 +end