diff options
| author | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-02-15 16:13:52 -0200 |
|---|---|---|
| committer | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-02-20 12:10:26 -0200 |
| commit | 422a01fc853a93e8946c69dc2ad0ad1dea261653 (patch) | |
| tree | bd50032c0cc5df5b2cb2a70f1202cbf4ad9c583d | |
| parent | 1e0053f2dca63fdba18811a2194a36f828d45486 (diff) | |
| download | gitlab-ce-422a01fc853a93e8946c69dc2ad0ad1dea261653.tar.gz | |
Create a pending task when an issue is assigned to someone
| -rw-r--r-- | app/services/base_service.rb | 4 | ||||
| -rw-r--r-- | app/services/issues/create_service.rb | 1 | ||||
| -rw-r--r-- | app/services/issues/update_service.rb | 1 | ||||
| -rw-r--r-- | app/services/task_service.rb | 43 | ||||
| -rw-r--r-- | spec/services/issues/create_service_spec.rb | 22 | ||||
| -rw-r--r-- | spec/services/issues/update_service_spec.rb | 13 | ||||
| -rw-r--r-- | spec/services/task_service_spec.rb | 59 |
7 files changed, 141 insertions, 2 deletions
diff --git a/app/services/base_service.rb b/app/services/base_service.rb index b48ca67d4d2..c349997b9e4 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -23,6 +23,10 @@ class BaseService EventCreateService.new end + def task_service + TaskService.new + end + def log_info(message) Gitlab::AppLogger.info message end diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb index bcb380d3215..2a6c84c3ce5 100644 --- a/app/services/issues/create_service.rb +++ b/app/services/issues/create_service.rb @@ -9,6 +9,7 @@ module Issues if issue.save issue.update_attributes(label_ids: label_params) notification_service.new_issue(issue, current_user) + task_service.new_issue(issue, current_user) event_service.open_issue(issue, current_user) issue.create_cross_references!(current_user) execute_hooks(issue, 'open') diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index a55a04dd5e0..e6afcb91652 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -12,6 +12,7 @@ module Issues if issue.previous_changes.include?('assignee_id') create_assignee_note(issue) notification_service.reassigned_issue(issue, current_user) + task_service.reassigned_issue(issue, current_user) end end diff --git a/app/services/task_service.rb b/app/services/task_service.rb new file mode 100644 index 00000000000..d82bce10eda --- /dev/null +++ b/app/services/task_service.rb @@ -0,0 +1,43 @@ +# TaskService class +# +# Used for creating tasks on task queue after certain user action +# +# Ex. +# TaskService.new.new_issue(issue, current_user) +# +class TaskService + # When create an issue we should: + # + # * creates a pending task for assignee if issue is assigned + # + def new_issue(issue, current_user) + if issue.is_assigned? + create_task(issue.project, issue, current_user, issue.assignee, Task::ASSIGNED) + end + end + + # When we reassign an issue we should: + # + # * creates a pending task for new assignee if issue is assigned + # + def reassigned_issue(issue, current_user) + if issue.is_assigned? + create_task(issue.project, issue, current_user, issue.assignee, Task::ASSIGNED) + end + end + + private + + def create_task(project, target, author, user, action) + attributes = { + project: project, + user_id: user.id, + author_id: author.id, + target_id: target.id, + target_type: target.class.name, + action: action + } + + Task.create(attributes) + end +end diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb index 2148d091a57..f3b66779987 100644 --- a/spec/services/issues/create_service_spec.rb +++ b/spec/services/issues/create_service_spec.rb @@ -3,14 +3,18 @@ require 'spec_helper' describe Issues::CreateService, services: true do let(:project) { create(:empty_project) } let(:user) { create(:user) } + let(:assignee) { create(:user) } describe :execute do - context "valid params" do + context 'valid params' do before do project.team << [user, :master] + project.team << [assignee, :master] + opts = { title: 'Awesome issue', - description: 'please fix' + description: 'please fix', + assignee: assignee } @issue = Issues::CreateService.new(project, user, opts).execute @@ -18,6 +22,20 @@ describe Issues::CreateService, services: true do it { expect(@issue).to be_valid } it { expect(@issue.title).to eq('Awesome issue') } + it { expect(@issue.assignee).to eq assignee } + + it 'creates a pending task for new assignee' do + attributes = { + project: project, + author: user, + user: assignee, + target: @issue, + action: Task::ASSIGNED, + state: :pending + } + + expect(Task.where(attributes).count).to eq 1 + end end end end diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb index 87da0e9618b..8f654517bce 100644 --- a/spec/services/issues/update_service_spec.rb +++ b/spec/services/issues/update_service_spec.rb @@ -78,6 +78,19 @@ describe Issues::UpdateService, services: true do expect(note).not_to be_nil expect(note.note).to eq 'Title changed from **Old title** to **New title**' end + + it 'creates a pending task if being reassigned' do + attributes = { + project: project, + author: user, + user: user2, + target: issue, + action: Task::ASSIGNED, + state: :pending + } + + expect(Task.where(attributes).count).to eq 1 + end end context 'when Issue has tasks' do diff --git a/spec/services/task_service_spec.rb b/spec/services/task_service_spec.rb new file mode 100644 index 00000000000..ee3c4f8f95d --- /dev/null +++ b/spec/services/task_service_spec.rb @@ -0,0 +1,59 @@ +require 'spec_helper' + +describe TaskService, services: true do + let(:service) { described_class.new } + + describe 'Issues' do + let(:author) { create(:user) } + let(:john_doe) { create(:user) } + let(:project) { create(:empty_project, :public) } + let(:assigned_issue) { create(:issue, project: project, assignee: john_doe) } + let(:unassigned_issue) { create(:issue, project: project, assignee: nil) } + + before do + project.team << [author, :developer] + project.team << [john_doe, :developer] + end + + describe '#new_issue' do + it 'creates a pending task if assigned' do + service.new_issue(assigned_issue, author) + + is_expected_to_create_pending_task(user: john_doe, target: assigned_issue, action: Task::ASSIGNED) + end + + it 'does not create a task if unassigned' do + is_expected_to_not_create_task { service.new_issue(unassigned_issue, author) } + end + end + + describe '#reassigned_issue' do + it 'creates a pending task for new assignee' do + unassigned_issue.update_attribute(:assignee, john_doe) + service.reassigned_issue(unassigned_issue, author) + + is_expected_to_create_pending_task(user: john_doe, target: unassigned_issue, action: Task::ASSIGNED) + end + + it 'does not create a task if unassigned' do + assigned_issue.update_attribute(:assignee, nil) + + is_expected_to_not_create_task { service.reassigned_issue(assigned_issue, author) } + end + end + end + + def is_expected_to_create_pending_task(attributes = {}) + attributes.reverse_merge!( + project: project, + author: author, + state: :pending + ) + + expect(Task.where(attributes).count).to eq 1 + end + + def is_expected_to_not_create_task + expect { yield }.not_to change(Task, :count) + end +end |
