diff --git a/app/models/repository.rb b/app/models/repository.rb index e279bf6..f1b23c5 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -1,6 +1,19 @@ class Repository < KalibroClient::Entities::Processor::Repository include KalibroRecord + def self.public_or_owned_by_user(user = nil) + repository_attributes = RepositoryAttributes.where(public: true) + repository_attributes += RepositoryAttributes.where(user_id: user.id, public: false) if user + + repository_attributes.map do |attribute| + begin + self.find(attribute.repository_id) + rescue Likeno::Errors::RecordNotFound + nil + end + end.compact + end + def self.latest(count=1) all.sort { |one, another| another.id <=> one.id }.first(count) end diff --git a/spec/factories/repository_attributes.rb b/spec/factories/repository_attributes.rb index 8e46cd0..59f881a 100644 --- a/spec/factories/repository_attributes.rb +++ b/spec/factories/repository_attributes.rb @@ -1,6 +1,11 @@ FactoryGirl.define do factory :repository_attributes do + self.public true association :user, strategy: :build association :repository, strategy: :build + + trait :private do + self.public false + end end end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 83e51c0..18ce826 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -20,5 +20,62 @@ describe Repository do end end end + + describe 'public_or_owned_by_user' do + let!(:user) { FactoryGirl.build(:user, :with_id) } + + let!(:owned_private_attrs) { FactoryGirl.build(:repository_attributes, :private, user_id: user.id) } + let!(:owned_public_attrs) { FactoryGirl.build(:repository_attributes, user_id: user.id) } + let!(:not_owned_private_attrs) { FactoryGirl.build(:repository_attributes, :private, user_id: user.id + 1) } + let!(:not_owned_public_attrs) { FactoryGirl.build(:repository_attributes, user_id: user.id + 1) } + + let!(:public_attrs) { [owned_public_attrs, not_owned_public_attrs] } + let(:public_repositories) { public_attrs.map(&:repository) } + + let!(:owned_or_public_attrs) { public_attrs + [owned_private_attrs] } + let!(:owned_or_public_repositories) { owned_or_public_attrs.map(&:repository) } + + let(:all_repositories) { owned_or_public_repositories + [not_owned_private_attrs.repository] } + + context 'when repositories exist' do + before :each do + all_repositories.each do |repository| + described_class.stubs(:find).with(repository.id).returns(repository) + end + + RepositoryAttributes.expects(:where).with(public: true).returns(public_attrs) + end + + context 'when user is not provided' do + it 'is expected to find all public repositories' do + expect(described_class.public_or_owned_by_user).to eq(public_repositories) + end + end + + context 'when user is provided' do + before do + RepositoryAttributes.expects(:where).with(user_id: user.id, public: false).returns([owned_private_attrs]) + end + + it 'is expected to find all public and owned repositories' do + expect(described_class.public_or_owned_by_user(user)).to eq(owned_or_public_repositories) + end + end + end + + context 'when no repositories exist' do + before :each do + all_repositories.each do |repository| + described_class.stubs(:find).with(repository.id).raises(Likeno::Errors::RecordNotFound) + end + + RepositoryAttributes.expects(:where).with(public: true).returns(public_attrs) + end + + it 'is expected to be empty' do + expect(described_class.public_or_owned_by_user).to be_empty + end + end + end end -end \ No newline at end of file +end -- libgit2 0.21.2