diff --git a/app/finders/README.md b/app/finders/README.md index 6fbf0e2..47823c5 100644 --- a/app/finders/README.md +++ b/app/finders/README.md @@ -3,7 +3,7 @@ This type of classes responsible for collectiong items based on different conditions. To prevent lookup methods in models like this: -``` +```ruby class Project def issues_for_user_filtered_by(user, filter) # A lot of logic not related to project model itself @@ -15,10 +15,8 @@ issues = project.issues_for_user_filtered_by(user, params) Better use this: -``` -selector = Finders::Issues.new - -issues = selector.execute(project, user, filter) +```ruby +issues = IssuesFinder.new.execute(project, user, filter) ``` It will help keep models thiner diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb new file mode 100644 index 0000000..7489e56 --- /dev/null +++ b/spec/finders/issues_finder_spec.rb @@ -0,0 +1,58 @@ +require 'spec_helper' + +describe IssuesFinder do + let(:user) { create :user } + let(:user2) { create :user } + let(:project1) { create(:project) } + let(:project2) { create(:project) } + let(:issue1) { create(:issue, assignee: user, project: project1) } + let(:issue2) { create(:issue, assignee: user, project: project2) } + let(:issue3) { create(:issue, assignee: user2, project: project2) } + + before do + project1.team << [user, :master] + project2.team << [user, :developer] + project2.team << [user2, :developer] + end + + describe :execute do + before :each do + issue1 + issue2 + issue3 + end + + it 'should filter by all' do + params = { scope: "all", state: 'opened' } + issues = IssuesFinder.new.execute(user, params) + issues.size.should == 3 + end + + it 'should filter by assignee' do + params = { scope: "assigned-to-me", state: 'opened' } + issues = IssuesFinder.new.execute(user, params) + issues.size.should == 2 + end + + it 'should filter by project' do + params = { scope: "assigned-to-me", state: 'opened', project_id: project1.id } + issues = IssuesFinder.new.execute(user, params) + issues.size.should == 1 + end + + it 'should be empty for unauthorized user' do + params = { scope: "all", state: 'opened' } + issues = IssuesFinder.new.execute(nil, params) + issues.size.should be_zero + end + + it 'should not include unauthorized issues' do + params = { scope: "all", state: 'opened' } + issues = IssuesFinder.new.execute(user2, params) + issues.size.should == 2 + issues.should_not include(issue1) + issues.should include(issue2) + issues.should include(issue3) + end + end +end diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb new file mode 100644 index 0000000..76f9e75 --- /dev/null +++ b/spec/finders/merge_requests_finder_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +describe MergeRequestsFinder do + let(:user) { create :user } + let(:user2) { create :user } + let(:project1) { create(:project) } + let(:project2) { create(:project) } + let(:merge_request1) { create(:merge_request, author: user, source_project: project1, target_project: project2) } + let(:merge_request2) { create(:merge_request, author: user, source_project: project2, target_project: project1) } + let(:merge_request3) { create(:merge_request, author: user, source_project: project2, target_project: project2) } + + before do + project1.team << [user, :master] + project2.team << [user, :developer] + project2.team << [user2, :developer] + end + + describe :execute do + before :each do + merge_request1 + merge_request2 + merge_request3 + end + + it 'should filter by scope' do + params = { scope: 'authored', state: 'opened' } + merge_requests = MergeRequestsFinder.new.execute(user, params) + merge_requests.size.should == 3 + end + + it 'should filter by project' do + params = { project_id: project1.id, scope: 'authored', state: 'opened' } + merge_requests = MergeRequestsFinder.new.execute(user, params) + merge_requests.size.should == 1 + end + end +end diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb new file mode 100644 index 0000000..cc6ee82 --- /dev/null +++ b/spec/finders/projects_finder_spec.rb @@ -0,0 +1,51 @@ +require 'spec_helper' + +describe ProjectsFinder do + let(:user) { create :user } + let(:group) { create :group } + + let(:project1) { create(:empty_project, group: group, visibility_level: Project::PUBLIC) } + let(:project2) { create(:empty_project, group: group, visibility_level: Project::INTERNAL) } + let(:project3) { create(:empty_project, group: group, visibility_level: Project::PRIVATE) } + let(:project4) { create(:empty_project, group: group, visibility_level: Project::PRIVATE) } + + context 'non authenticated' do + subject { ProjectsFinder.new.execute(nil, group: group) } + + it { should include(project1) } + it { should_not include(project2) } + it { should_not include(project3) } + it { should_not include(project4) } + end + + context 'authenticated' do + subject { ProjectsFinder.new.execute(user, group: group) } + + it { should include(project1) } + it { should include(project2) } + it { should_not include(project3) } + it { should_not include(project4) } + end + + context 'authenticated, project member' do + before { project3.team << [user, :developer] } + + subject { ProjectsFinder.new.execute(user, group: group) } + + it { should include(project1) } + it { should include(project2) } + it { should include(project3) } + it { should_not include(project4) } + end + + context 'authenticated, group member' do + before { group.add_user(user, Gitlab::Access::DEVELOPER) } + + subject { ProjectsFinder.new.execute(user, group: group) } + + it { should include(project1) } + it { should include(project2) } + it { should include(project3) } + it { should include(project4) } + end +end diff --git a/spec/services/filtering_service_spec.rb b/spec/services/filtering_service_spec.rb deleted file mode 100644 index 92971d0..0000000 --- a/spec/services/filtering_service_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -require 'spec_helper' - -describe FilteringService do - let(:user) { create :user } - let(:user2) { create :user } - let(:project1) { create(:project) } - let(:project2) { create(:project) } - let(:merge_request1) { create(:merge_request, author: user, source_project: project1, target_project: project2) } - let(:merge_request2) { create(:merge_request, author: user, source_project: project2, target_project: project1) } - let(:merge_request3) { create(:merge_request, author: user, source_project: project2, target_project: project2) } - let(:issue1) { create(:issue, assignee: user, project: project1) } - let(:issue2) { create(:issue, assignee: user, project: project2) } - let(:issue3) { create(:issue, assignee: user2, project: project2) } - - before do - project1.team << [user, :master] - project2.team << [user, :developer] - project2.team << [user2, :developer] - end - - describe 'merge requests' do - before :each do - merge_request1 - merge_request2 - merge_request3 - end - - it 'should filter by scope' do - params = { scope: 'authored', state: 'opened' } - merge_requests = FilteringService.new.execute(MergeRequest, user, params) - merge_requests.size.should == 3 - end - - it 'should filter by project' do - params = { project_id: project1.id, scope: 'authored', state: 'opened' } - merge_requests = FilteringService.new.execute(MergeRequest, user, params) - merge_requests.size.should == 1 - end - end - - describe 'issues' do - before :each do - issue1 - issue2 - issue3 - end - - it 'should filter by all' do - params = { scope: "all", state: 'opened' } - issues = FilteringService.new.execute(Issue, user, params) - issues.size.should == 3 - end - - it 'should filter by assignee' do - params = { scope: "assigned-to-me", state: 'opened' } - issues = FilteringService.new.execute(Issue, user, params) - issues.size.should == 2 - end - - it 'should filter by project' do - params = { scope: "assigned-to-me", state: 'opened', project_id: project1.id } - issues = FilteringService.new.execute(Issue, user, params) - issues.size.should == 1 - end - - it 'should be empty for unauthorized user' do - params = { scope: "all", state: 'opened' } - issues = FilteringService.new.execute(Issue, nil, params) - issues.size.should be_zero - end - - it 'should not include unauthorized issues' do - params = { scope: "all", state: 'opened' } - issues = FilteringService.new.execute(Issue, user2, params) - issues.size.should == 2 - issues.should_not include(issue1) - issues.should include(issue2) - issues.should include(issue3) - end - end -end diff --git a/spec/services/projects_collect_service_spec.rb b/spec/services/projects_collect_service_spec.rb deleted file mode 100644 index 107c6dc..0000000 --- a/spec/services/projects_collect_service_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' - -describe Projects::CollectService do - let(:user) { create :user } - let(:group) { create :group } - - let(:project1) { create(:empty_project, group: group, visibility_level: Project::PUBLIC) } - let(:project2) { create(:empty_project, group: group, visibility_level: Project::INTERNAL) } - let(:project3) { create(:empty_project, group: group, visibility_level: Project::PRIVATE) } - let(:project4) { create(:empty_project, group: group, visibility_level: Project::PRIVATE) } - - context 'non authenticated' do - subject { Projects::CollectService.new.execute(nil, group: group) } - - it { should include(project1) } - it { should_not include(project2) } - it { should_not include(project3) } - it { should_not include(project4) } - end - - context 'authenticated' do - subject { Projects::CollectService.new.execute(user, group: group) } - - it { should include(project1) } - it { should include(project2) } - it { should_not include(project3) } - it { should_not include(project4) } - end - - context 'authenticated, project member' do - before { project3.team << [user, :developer] } - - subject { Projects::CollectService.new.execute(user, group: group) } - - it { should include(project1) } - it { should include(project2) } - it { should include(project3) } - it { should_not include(project4) } - end - - context 'authenticated, group member' do - before { group.add_user(user, Gitlab::Access::DEVELOPER) } - - subject { Projects::CollectService.new.execute(user, group: group) } - - it { should include(project1) } - it { should include(project2) } - it { should include(project3) } - it { should include(project4) } - end -end -- libgit2 0.21.2