From 49cd19652ade0eb81126caa590461e8340d63d26 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 16 Feb 2016 19:29:11 -0200 Subject: [PATCH] Mark pending tasks for the note author as done when he left a note --- app/services/notes/post_process_service.rb | 4 +- app/services/task_service.rb | 11 +++++ .../notes/post_process_service_spec.rb | 1 + spec/services/task_service_spec.rb | 43 +++++++++++++++++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb index f37d3c50cdd..465b246cabc 100644 --- a/app/services/notes/post_process_service.rb +++ b/app/services/notes/post_process_service.rb @@ -1,6 +1,5 @@ module Notes class PostProcessService - attr_accessor :note def initialize(note) @@ -14,6 +13,8 @@ module Notes @note.create_cross_references! execute_note_hooks end + + TaskService.new.new_note(note) end def hook_data @@ -25,6 +26,5 @@ module Notes @note.project.execute_hooks(note_data, :note_hooks) @note.project.execute_services(note_data, :note_hooks) end - end end diff --git a/app/services/task_service.rb b/app/services/task_service.rb index 0d66f89e997..e58974a9b38 100644 --- a/app/services/task_service.rb +++ b/app/services/task_service.rb @@ -43,6 +43,17 @@ class TaskService pending_tasks.update_all(state: :done) end + # When create a note we should: + # + # * mark all pending tasks related to the noteable for the note author as done + # + def new_note(note) + # Skip system notes, like status changes and cross-references + unless note.system + mark_as_done(note.noteable, note.author) + end + end + private def create_task(project, target, author, user, action) diff --git a/spec/services/notes/post_process_service_spec.rb b/spec/services/notes/post_process_service_spec.rb index 1a3f339bd64..9489b8c6336 100644 --- a/spec/services/notes/post_process_service_spec.rb +++ b/spec/services/notes/post_process_service_spec.rb @@ -20,6 +20,7 @@ describe Notes::PostProcessService, services: true do it do expect(project).to receive(:execute_hooks) expect(project).to receive(:execute_services) + expect_any_instance_of(TaskService).to receive(:new_note).with(@note) Notes::PostProcessService.new(@note).execute end end diff --git a/spec/services/task_service_spec.rb b/spec/services/task_service_spec.rb index 04735900e25..2fd75d10b6c 100644 --- a/spec/services/task_service_spec.rb +++ b/spec/services/task_service_spec.rb @@ -43,8 +43,8 @@ describe TaskService, services: true do it 'marks related pending tasks to the target for the user as done' do service.close_issue(assigned_issue, john_doe) - expect(first_pending_task.reload.done?).to eq true - expect(second_pending_task.reload.done?).to eq true + expect(first_pending_task.reload).to be_done + expect(second_pending_task.reload).to be_done end end @@ -75,8 +75,43 @@ describe TaskService, services: true do it 'marks related pending tasks to the target for the user as done' do service.mark_as_done(assigned_issue, john_doe) - expect(first_pending_task.reload.done?).to eq true - expect(second_pending_task.reload.done?).to eq true + expect(first_pending_task.reload).to be_done + expect(second_pending_task.reload).to be_done + end + end + + describe '#new_note' do + let!(:first_pending_task) do + create(:pending_assigned_task, user: john_doe, project: project, target: assigned_issue, author: author) + end + + let!(:second_pending_task) do + create(:pending_assigned_task, user: john_doe, project: project, target: assigned_issue, author: author) + end + + let(:note) { create(:note, project: project, noteable: assigned_issue, author: john_doe) } + let(:award_note) { create(:note, :award, project: project, noteable: assigned_issue, author: john_doe, note: 'thumbsup') } + let(:system_note) { create(:system_note, project: project, noteable: assigned_issue) } + + it 'mark related pending tasks to the noteable for the note author as done' do + service.new_note(note) + + expect(first_pending_task.reload).to be_done + expect(second_pending_task.reload).to be_done + end + + it 'mark related pending tasks to the noteable for the award note author as done' do + service.new_note(award_note) + + expect(first_pending_task.reload).to be_done + expect(second_pending_task.reload).to be_done + end + + it 'does not mark related pending tasks it is a system note' do + service.new_note(system_note) + + expect(first_pending_task.reload).to be_pending + expect(second_pending_task.reload).to be_pending end end end