diff options
Diffstat (limited to 'spec/services')
3 files changed, 113 insertions, 17 deletions
diff --git a/spec/services/merge_requests/create_pipeline_service_spec.rb b/spec/services/merge_requests/create_pipeline_service_spec.rb new file mode 100644 index 00000000000..9479439bde8 --- /dev/null +++ b/spec/services/merge_requests/create_pipeline_service_spec.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe MergeRequests::CreatePipelineService do + set(:project) { create(:project, :repository) } + set(:user) { create(:user) } + let(:service) { described_class.new(project, user, params) } + let(:params) { {} } + + before do + project.add_developer(user) + end + + describe '#execute' do + subject { service.execute(merge_request) } + + before do + stub_ci_pipeline_yaml_file(YAML.dump(config)) + end + + let(:config) do + { rspec: { script: 'echo', only: ['merge_requests'] } } + end + + let(:merge_request) do + create(:merge_request, + source_branch: 'feature', + source_project: project, + target_branch: 'master', + target_project: project) + end + + it 'creates a detached merge request pipeline' do + expect { subject }.to change { Ci::Pipeline.count }.by(1) + + expect(subject).to be_persisted + expect(subject).to be_detached_merge_request_pipeline + end + + context 'when service is called multiple times' do + it 'creates a pipeline once' do + expect do + service.execute(merge_request) + service.execute(merge_request) + end.to change { Ci::Pipeline.count }.by(1) + end + + context 'when allow_duplicate option is true' do + let(:params) { { allow_duplicate: true } } + + it 'creates pipelines multiple times' do + expect do + service.execute(merge_request) + service.execute(merge_request) + end.to change { Ci::Pipeline.count }.by(2) + end + end + end + + context 'when .gitlab-ci.yml does not have only: [merge_requests] keyword' do + let(:config) do + { rspec: { script: 'echo' } } + end + + it 'does not create a pipeline' do + expect { subject }.not_to change { Ci::Pipeline.count } + end + end + end +end diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb index 5ad30b58511..1dcfb739eb6 100644 --- a/spec/services/projects/update_service_spec.rb +++ b/spec/services/projects/update_service_spec.rb @@ -45,6 +45,7 @@ describe Projects::UpdateService do it 'updates the project to private' do expect(TodosDestroyer::ProjectPrivateWorker).to receive(:perform_in).with(Todo::WAIT_FOR_DELETE, project.id) + expect(TodosDestroyer::ConfidentialIssueWorker).to receive(:perform_in).with(Todo::WAIT_FOR_DELETE, nil, project.id) result = update_project(project, user, visibility_level: Gitlab::VisibilityLevel::PRIVATE) diff --git a/spec/services/todos/destroy/confidential_issue_service_spec.rb b/spec/services/todos/destroy/confidential_issue_service_spec.rb index 78b6744b426..9f7e656f7d3 100644 --- a/spec/services/todos/destroy/confidential_issue_service_spec.rb +++ b/spec/services/todos/destroy/confidential_issue_service_spec.rb @@ -9,36 +9,60 @@ describe Todos::Destroy::ConfidentialIssueService do let(:assignee) { create(:user) } let(:guest) { create(:user) } let(:project_member) { create(:user) } - let(:issue) { create(:issue, project: project, author: author, assignees: [assignee]) } - - let!(:todo_issue_non_member) { create(:todo, user: user, target: issue, project: project) } - let!(:todo_issue_member) { create(:todo, user: project_member, target: issue, project: project) } - let!(:todo_issue_author) { create(:todo, user: author, target: issue, project: project) } - let!(:todo_issue_asignee) { create(:todo, user: assignee, target: issue, project: project) } - let!(:todo_issue_guest) { create(:todo, user: guest, target: issue, project: project) } - let!(:todo_another_non_member) { create(:todo, user: user, project: project) } + let(:issue_1) { create(:issue, :confidential, project: project, author: author, assignees: [assignee]) } describe '#execute' do before do project.add_developer(project_member) project.add_guest(guest) + + # todos not to be deleted + create(:todo, user: project_member, target: issue_1, project: project) + create(:todo, user: author, target: issue_1, project: project) + create(:todo, user: assignee, target: issue_1, project: project) + create(:todo, user: user, project: project) + # Todos to be deleted + create(:todo, user: guest, target: issue_1, project: project) + create(:todo, user: user, target: issue_1, project: project) end - subject { described_class.new(issue.id).execute } + subject { described_class.new(issue_id: issue_1.id).execute } - context 'when provided issue is confidential' do - before do - issue.update!(confidential: true) + context 'when issue_id parameter is present' do + context 'when provided issue is confidential' do + it 'removes issue todos for users who can not access the confidential issue' do + expect { subject }.to change { Todo.count }.from(6).to(4) + end end - it 'removes issue todos for users who can not access the confidential issue' do - expect { subject }.to change { Todo.count }.from(6).to(4) + context 'when provided issue is not confidential' do + it 'does not remove any todos' do + issue_1.update(confidential: false) + + expect { subject }.not_to change { Todo.count } + end end end - context 'when provided issue is not confidential' do - it 'does not remove any todos' do - expect { subject }.not_to change { Todo.count } + context 'when project_id parameter is present' do + subject { described_class.new(issue_id: nil, project_id: project.id).execute } + + it 'removes issues todos for users that cannot access confidential issues' do + issue_2 = create(:issue, :confidential, project: project) + issue_3 = create(:issue, :confidential, project: project, author: author, assignees: [assignee]) + issue_4 = create(:issue, project: project) + # Todos not to be deleted + create(:todo, user: guest, target: issue_1, project: project) + create(:todo, user: assignee, target: issue_1, project: project) + create(:todo, user: project_member, target: issue_2, project: project) + create(:todo, user: author, target: issue_3, project: project) + create(:todo, user: user, target: issue_4, project: project) + create(:todo, user: user, project: project) + # Todos to be deleted + create(:todo, user: user, target: issue_1, project: project) + create(:todo, user: guest, target: issue_2, project: project) + + expect { subject }.to change { Todo.count }.from(14).to(10) end end end |