summaryrefslogtreecommitdiff
path: root/spec/services
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-02-20 11:59:59 -0200
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-02-20 12:39:27 -0200
commit3d52e139b13ad077286f2f9f46b7e98f43ad9564 (patch)
tree22c70561b0f64851d938e44661aafeed3a2c80b2 /spec/services
parent408e010d65e7e2e2b64a694e12d44636d7d81dec (diff)
downloadgitlab-ce-3d52e139b13ad077286f2f9f46b7e98f43ad9564.tar.gz
Rename Tasks to Todos
Diffstat (limited to 'spec/services')
-rw-r--r--spec/services/issues/close_service_spec.rb8
-rw-r--r--spec/services/issues/create_service_spec.rb9
-rw-r--r--spec/services/issues/update_service_spec.rb33
-rw-r--r--spec/services/merge_requests/close_service_spec.rb6
-rw-r--r--spec/services/merge_requests/create_service_spec.rb16
-rw-r--r--spec/services/merge_requests/update_service_spec.rb37
-rw-r--r--spec/services/notes/update_service_spec.rb12
-rw-r--r--spec/services/task_service_spec.rb264
-rw-r--r--spec/services/todo_service_spec.rb264
9 files changed, 327 insertions, 322 deletions
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index fdf0fd819b2..62b25709a5d 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -5,7 +5,7 @@ describe Issues::CloseService, services: true do
let(:user2) { create(:user) }
let(:issue) { create(:issue, assignee: user2) }
let(:project) { issue.project }
- let!(:pending_task) { create(:task, :assigned, user: user, project: project, target: issue, author: user2) }
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
before do
project.team << [user, :master]
@@ -34,8 +34,8 @@ describe Issues::CloseService, services: true do
expect(note.note).to include "Status changed to closed"
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks todos as done' do
+ expect(todo.reload).to be_done
end
end
@@ -47,7 +47,7 @@ describe Issues::CloseService, services: true do
it { expect(@issue).to be_valid }
it { expect(@issue).to be_opened }
- it { expect(pending_task.reload).to be_pending }
+ it { expect(todo.reload).to be_pending }
end
end
end
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index f3b66779987..5e7915db7e1 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -24,17 +24,18 @@ describe Issues::CreateService, services: true do
it { expect(@issue.title).to eq('Awesome issue') }
it { expect(@issue.assignee).to eq assignee }
- it 'creates a pending task for new assignee' do
+ it 'creates a pending todo for new assignee' do
attributes = {
project: project,
author: user,
user: assignee,
- target: @issue,
- action: Task::ASSIGNED,
+ target_id: @issue.id,
+ target_type: @issue.class.name,
+ action: Todo::ASSIGNED,
state: :pending
}
- expect(Task.where(attributes).count).to eq 1
+ expect(Todo.where(attributes).count).to eq 1
end
end
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 5674b9f1e9b..e579e49dfa7 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -80,16 +80,16 @@ describe Issues::UpdateService, services: true do
end
end
- context 'task queue' do
- let!(:pending_task) { create(:task, :assigned, user: user, project: project, target: issue, author: user2) }
+ context 'todos' do
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
context 'when the title change' do
before do
update_issue({ title: 'New title' })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload.done?).to eq true
+ it 'marks pending todos as done' do
+ expect(todo.reload.done?).to eq true
end
end
@@ -98,8 +98,8 @@ describe Issues::UpdateService, services: true do
update_issue({ description: 'Also please fix' })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload.done?).to eq true
+ it 'marks todos as done' do
+ expect(todo.reload.done?).to eq true
end
end
@@ -108,21 +108,22 @@ describe Issues::UpdateService, services: true do
update_issue({ assignee: user2 })
end
- it 'marks previous assignee pending tasks as done' do
- expect(pending_task.reload.done?).to eq true
+ it 'marks previous assignee todos as done' do
+ expect(todo.reload.done?).to eq true
end
- it 'creates a pending task for new assignee' do
+ it 'creates a todo for new assignee' do
attributes = {
project: project,
author: user,
user: user2,
- target: issue,
- action: Task::ASSIGNED,
+ target_id: issue.id,
+ target_type: issue.class.name,
+ action: Todo::ASSIGNED,
state: :pending
}
- expect(Task.where(attributes).count).to eq 1
+ expect(Todo.where(attributes).count).to eq 1
end
end
@@ -131,8 +132,8 @@ describe Issues::UpdateService, services: true do
update_issue({ milestone: create(:milestone) })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload.done?).to eq true
+ it 'marks todos as done' do
+ expect(todo.reload.done?).to eq true
end
end
@@ -141,8 +142,8 @@ describe Issues::UpdateService, services: true do
update_issue({ label_ids: [label.id] })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload.done?).to eq true
+ it 'marks todos as done' do
+ expect(todo.reload.done?).to eq true
end
end
end
diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb
index 50227af7f2b..8443a00e70c 100644
--- a/spec/services/merge_requests/close_service_spec.rb
+++ b/spec/services/merge_requests/close_service_spec.rb
@@ -5,7 +5,7 @@ describe MergeRequests::CloseService, services: true do
let(:user2) { create(:user) }
let(:merge_request) { create(:merge_request, assignee: user2) }
let(:project) { merge_request.project }
- let!(:pending_task) { create(:task, :assigned, user: user, project: project, target: merge_request, author: user2) }
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: merge_request, author: user2) }
before do
project.team << [user, :master]
@@ -43,8 +43,8 @@ describe MergeRequests::CloseService, services: true do
expect(note.note).to include 'Status changed to closed'
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks todos as done' do
+ expect(todo.reload).to be_done
end
end
end
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
index 2e3c9f88369..120f4d6a669 100644
--- a/spec/services/merge_requests/create_service_spec.rb
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -34,13 +34,14 @@ describe MergeRequests::CreateService, services: true do
expect(service).to have_received(:execute_hooks).with(@merge_request)
end
- it 'does not creates a pending task' do
+ it 'does not creates todos' do
attributes = {
project: project,
- target: @merge_request
+ target_id: @merge_request.id,
+ target_type: @merge_request.class.name
}
- expect(Task.where(attributes).count).to be_zero
+ expect(Todo.where(attributes).count).to be_zero
end
context 'when merge request is assigned to someone' do
@@ -56,17 +57,18 @@ describe MergeRequests::CreateService, services: true do
it { expect(@merge_request.assignee).to eq assignee }
- it 'creates a pending task for new assignee' do
+ it 'creates a todo for new assignee' do
attributes = {
project: project,
author: user,
user: assignee,
- target: @merge_request,
- action: Task::ASSIGNED,
+ target_id: @merge_request.id,
+ target_type: @merge_request.class.name,
+ action: Todo::ASSIGNED,
state: :pending
}
- expect(Task.where(attributes).count).to eq 1
+ expect(Todo.where(attributes).count).to eq 1
end
end
end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 6d70e8ec16a..99703c7a8ec 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -98,16 +98,16 @@ describe MergeRequests::UpdateService, services: true do
end
end
- context 'task queue' do
- let!(:pending_task) { create(:task, :assigned, user: user, project: project, target: merge_request, author: user2) }
+ context 'todos' do
+ let!(:pending_todo) { create(:todo, :assigned, user: user, project: project, target: merge_request, author: user2) }
context 'when the title change' do
before do
update_merge_request({ title: 'New title' })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
end
end
@@ -116,8 +116,8 @@ describe MergeRequests::UpdateService, services: true do
update_merge_request({ description: 'Also please fix' })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
end
end
@@ -126,21 +126,22 @@ describe MergeRequests::UpdateService, services: true do
update_merge_request({ assignee: user2 })
end
- it 'marks previous assignee pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks previous assignee pending todos as done' do
+ expect(pending_todo.reload).to be_done
end
- it 'creates a pending task for new assignee' do
+ it 'creates a pending todo for new assignee' do
attributes = {
project: project,
author: user,
user: user2,
- target: merge_request,
- action: Task::ASSIGNED,
+ target_id: merge_request.id,
+ target_type: merge_request.class.name,
+ action: Todo::ASSIGNED,
state: :pending
}
- expect(Task.where(attributes).count).to eq 1
+ expect(Todo.where(attributes).count).to eq 1
end
end
@@ -149,8 +150,8 @@ describe MergeRequests::UpdateService, services: true do
update_merge_request({ milestone: create(:milestone) })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
end
end
@@ -159,8 +160,8 @@ describe MergeRequests::UpdateService, services: true do
update_merge_request({ label_ids: [label.id] })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
end
end
@@ -169,8 +170,8 @@ describe MergeRequests::UpdateService, services: true do
update_merge_request({ target_branch: 'target' })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks pending todos as done' do
+ expect(pending_todo.reload).to be_done
end
end
end
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index a8b3e0d825d..dde4bde7dc2 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -18,16 +18,16 @@ describe Notes::UpdateService, services: true do
@note.reload
end
- context 'task queue' do
- let!(:pending_task) { create(:task, :assigned, user: user, project: project, target: issue, author: user2) }
+ context 'todos' do
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
context 'when the note change' do
before do
update_note({ note: 'New note' })
end
- it 'marks pending tasks as done' do
- expect(pending_task.reload).to be_done
+ it 'marks todos as done' do
+ expect(todo.reload).to be_done
end
end
@@ -36,8 +36,8 @@ describe Notes::UpdateService, services: true do
update_note({ note: 'Old note' })
end
- it 'keep pending tasks' do
- expect(pending_task.reload).to be_pending
+ it 'keep todos' do
+ expect(todo.reload).to be_pending
end
end
end
diff --git a/spec/services/task_service_spec.rb b/spec/services/task_service_spec.rb
deleted file mode 100644
index 43022ca1604..00000000000
--- a/spec/services/task_service_spec.rb
+++ /dev/null
@@ -1,264 +0,0 @@
-require 'spec_helper'
-
-describe TaskService, services: true do
- let(:author) { create(:user) }
- let(:john_doe) { create(:user, username: 'john_doe') }
- let(:michael) { create(:user, username: 'michael') }
- let(:stranger) { create(:user, username: 'stranger') }
- let(:project) { create(:project) }
- let(:mentions) { [author.to_reference, john_doe.to_reference, michael.to_reference, stranger.to_reference].join(' ') }
- let(:service) { described_class.new }
-
- before do
- project.team << [author, :developer]
- project.team << [john_doe, :developer]
- project.team << [michael, :developer]
- end
-
- describe 'Issues' do
- let(:issue) { create(:issue, project: project, assignee: john_doe, author: author, description: mentions) }
- let(:unassigned_issue) { create(:issue, project: project, assignee: nil) }
-
- describe '#new_issue' do
- it 'creates a task if assigned' do
- service.new_issue(issue, author)
-
- should_create_task(user: john_doe, target: issue, action: Task::ASSIGNED)
- end
-
- it 'does not create a task if unassigned' do
- should_not_create_any_task { service.new_issue(unassigned_issue, author) }
- end
-
- it 'does not create a task if assignee is the current user' do
- should_not_create_any_task { service.new_issue(unassigned_issue, john_doe) }
- end
-
- it 'creates a task for each valid mentioned user' do
- service.new_issue(issue, author)
-
- should_create_task(user: michael, target: issue, action: Task::MENTIONED)
- should_not_create_task(user: author, target: issue, action: Task::MENTIONED)
- should_not_create_task(user: john_doe, target: issue, action: Task::MENTIONED)
- should_not_create_task(user: stranger, target: issue, action: Task::MENTIONED)
- end
- end
-
- describe '#update_issue' do
- it 'creates a task for each valid mentioned user' do
- service.update_issue(issue, author)
-
- should_create_task(user: michael, target: issue, action: Task::MENTIONED)
- should_create_task(user: john_doe, target: issue, action: Task::MENTIONED)
- should_not_create_task(user: author, target: issue, action: Task::MENTIONED)
- should_not_create_task(user: stranger, target: issue, action: Task::MENTIONED)
- end
-
- it 'does not create a task if user was already mentioned' do
- create(:task, :mentioned, user: michael, project: project, target: issue, author: author)
-
- expect { service.update_issue(issue, author) }.not_to change(michael.tasks, :count)
- end
- end
-
- describe '#close_issue' do
- it 'marks related pending tasks to the target for the user as done' do
- first_task = create(:task, :assigned, user: john_doe, project: project, target: issue, author: author)
- second_task = create(:task, :assigned, user: john_doe, project: project, target: issue, author: author)
-
- service.close_issue(issue, john_doe)
-
- expect(first_task.reload).to be_done
- expect(second_task.reload).to be_done
- 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)
-
- should_create_task(user: john_doe, target: unassigned_issue, action: Task::ASSIGNED)
- end
-
- it 'does not create a task if unassigned' do
- issue.update_attribute(:assignee, nil)
-
- should_not_create_any_task { service.reassigned_issue(issue, author) }
- end
-
- it 'does not create a task if new assignee is the current user' do
- unassigned_issue.update_attribute(:assignee, john_doe)
-
- should_not_create_any_task { service.reassigned_issue(unassigned_issue, john_doe) }
- end
- end
-
- describe '#mark_pending_tasks_as_done' do
- it 'marks related pending tasks to the target for the user as done' do
- first_task = create(:task, :assigned, user: john_doe, project: project, target: issue, author: author)
- second_task = create(:task, :assigned, user: john_doe, project: project, target: issue, author: author)
-
- service.mark_pending_tasks_as_done(issue, john_doe)
-
- expect(first_task.reload).to be_done
- expect(second_task.reload).to be_done
- end
- end
-
- describe '#new_note' do
- let!(:first_task) { create(:task, :assigned, user: john_doe, project: project, target: issue, author: author) }
- let!(:second_task) { create(:task, :assigned, user: john_doe, project: project, target: issue, author: author) }
- let(:note) { create(:note, project: project, noteable: issue, author: john_doe, note: mentions) }
- let(:award_note) { create(:note, :award, project: project, noteable: issue, author: john_doe, note: 'thumbsup') }
- let(:system_note) { create(:system_note, project: project, noteable: issue) }
-
- it 'mark related pending tasks to the noteable for the note author as done' do
- first_task = create(:task, :assigned, user: john_doe, project: project, target: issue, author: author)
- second_task = create(:task, :assigned, user: john_doe, project: project, target: issue, author: author)
-
- service.new_note(note, john_doe)
-
- expect(first_task.reload).to be_done
- expect(second_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, john_doe)
-
- expect(first_task.reload).to be_done
- expect(second_task.reload).to be_done
- end
-
- it 'does not mark related pending tasks it is a system note' do
- service.new_note(system_note, john_doe)
-
- expect(first_task.reload).to be_pending
- expect(second_task.reload).to be_pending
- end
-
- it 'creates a task for each valid mentioned user' do
- service.new_note(note, john_doe)
-
- should_create_task(user: michael, target: issue, author: john_doe, action: Task::MENTIONED, note: note)
- should_create_task(user: author, target: issue, author: john_doe, action: Task::MENTIONED, note: note)
- should_not_create_task(user: john_doe, target: issue, author: john_doe, action: Task::MENTIONED, note: note)
- should_not_create_task(user: stranger, target: issue, author: john_doe, action: Task::MENTIONED, note: note)
- end
- end
- end
-
- describe 'Merge Requests' do
- let(:mr_assigned) { create(:merge_request, source_project: project, author: author, assignee: john_doe, description: mentions) }
- let(:mr_unassigned) { create(:merge_request, source_project: project, author: author, assignee: nil) }
-
- describe '#new_merge_request' do
- it 'creates a pending task if assigned' do
- service.new_merge_request(mr_assigned, author)
-
- should_create_task(user: john_doe, target: mr_assigned, action: Task::ASSIGNED)
- end
-
- it 'does not create a task if unassigned' do
- should_not_create_any_task { service.new_merge_request(mr_unassigned, author) }
- end
-
- it 'does not create a task if assignee is the current user' do
- should_not_create_any_task { service.new_merge_request(mr_unassigned, john_doe) }
- end
-
- it 'creates a task for each valid mentioned user' do
- service.new_merge_request(mr_assigned, author)
-
- should_create_task(user: michael, target: mr_assigned, action: Task::MENTIONED)
- should_not_create_task(user: author, target: mr_assigned, action: Task::MENTIONED)
- should_not_create_task(user: john_doe, target: mr_assigned, action: Task::MENTIONED)
- should_not_create_task(user: stranger, target: mr_assigned, action: Task::MENTIONED)
- end
- end
-
- describe '#update_merge_request' do
- it 'creates a task for each valid mentioned user' do
- service.update_merge_request(mr_assigned, author)
-
- should_create_task(user: michael, target: mr_assigned, action: Task::MENTIONED)
- should_create_task(user: john_doe, target: mr_assigned, action: Task::MENTIONED)
- should_not_create_task(user: author, target: mr_assigned, action: Task::MENTIONED)
- should_not_create_task(user: stranger, target: mr_assigned, action: Task::MENTIONED)
- end
-
- it 'does not create a task if user was already mentioned' do
- create(:task, :mentioned, user: michael, project: project, target: mr_assigned, author: author)
-
- expect { service.update_merge_request(mr_assigned, author) }.not_to change(michael.tasks, :count)
- end
- end
-
- describe '#close_merge_request' do
- it 'marks related pending tasks to the target for the user as done' do
- first_task = create(:task, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
- second_task = create(:task, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
- service.close_merge_request(mr_assigned, john_doe)
-
- expect(first_task.reload).to be_done
- expect(second_task.reload).to be_done
- end
- end
-
- describe '#reassigned_merge_request' do
- it 'creates a pending task for new assignee' do
- mr_unassigned.update_attribute(:assignee, john_doe)
- service.reassigned_merge_request(mr_unassigned, author)
-
- should_create_task(user: john_doe, target: mr_unassigned, action: Task::ASSIGNED)
- end
-
- it 'does not create a task if unassigned' do
- mr_assigned.update_attribute(:assignee, nil)
-
- should_not_create_any_task { service.reassigned_merge_request(mr_assigned, author) }
- end
-
- it 'does not create a task if new assignee is the current user' do
- mr_assigned.update_attribute(:assignee, john_doe)
-
- should_not_create_any_task { service.reassigned_merge_request(mr_assigned, john_doe) }
- end
- end
-
- describe '#merge_merge_request' do
- it 'marks related pending tasks to the target for the user as done' do
- first_task = create(:task, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
- second_task = create(:task, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
- service.merge_merge_request(mr_assigned, john_doe)
-
- expect(first_task.reload).to be_done
- expect(second_task.reload).to be_done
- end
- end
- end
-
- def should_create_task(attributes = {})
- attributes.reverse_merge!(
- project: project,
- author: author,
- state: :pending
- )
-
- expect(Task.where(attributes).count).to eq 1
- end
-
- def should_not_create_task(attributes = {})
- attributes.reverse_merge!(
- project: project,
- author: author,
- state: :pending
- )
-
- expect(Task.where(attributes).count).to eq 0
- end
-
- def should_not_create_any_task
- expect { yield }.not_to change(Task, :count)
- end
-end
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
new file mode 100644
index 00000000000..df3aa955f24
--- /dev/null
+++ b/spec/services/todo_service_spec.rb
@@ -0,0 +1,264 @@
+require 'spec_helper'
+
+describe TodoService, services: true do
+ let(:author) { create(:user) }
+ let(:john_doe) { create(:user, username: 'john_doe') }
+ let(:michael) { create(:user, username: 'michael') }
+ let(:stranger) { create(:user, username: 'stranger') }
+ let(:project) { create(:project) }
+ let(:mentions) { [author.to_reference, john_doe.to_reference, michael.to_reference, stranger.to_reference].join(' ') }
+ let(:service) { described_class.new }
+
+ before do
+ project.team << [author, :developer]
+ project.team << [john_doe, :developer]
+ project.team << [michael, :developer]
+ end
+
+ describe 'Issues' do
+ let(:issue) { create(:issue, project: project, assignee: john_doe, author: author, description: mentions) }
+ let(:unassigned_issue) { create(:issue, project: project, assignee: nil) }
+
+ describe '#new_issue' do
+ it 'creates a todo if assigned' do
+ service.new_issue(issue, author)
+
+ should_create_todo(user: john_doe, target: issue, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ should_not_create_any_todo { service.new_issue(unassigned_issue, author) }
+ end
+
+ it 'does not create a todo if assignee is the current user' do
+ should_not_create_any_todo { service.new_issue(unassigned_issue, john_doe) }
+ end
+
+ it 'creates a todo for each valid mentioned user' do
+ service.new_issue(issue, author)
+
+ should_create_todo(user: michael, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: issue, action: Todo::MENTIONED)
+ end
+ end
+
+ describe '#update_issue' do
+ it 'creates a todo for each valid mentioned user' do
+ service.update_issue(issue, author)
+
+ should_create_todo(user: michael, target: issue, action: Todo::MENTIONED)
+ should_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: issue, action: Todo::MENTIONED)
+ end
+
+ it 'does not create a todo if user was already mentioned' do
+ create(:todo, :mentioned, user: michael, project: project, target: issue, author: author)
+
+ expect { service.update_issue(issue, author) }.not_to change(michael.todos, :count)
+ end
+ end
+
+ describe '#close_issue' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+
+ service.close_issue(issue, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+
+ describe '#reassigned_issue' do
+ it 'creates a pending todo for new assignee' do
+ unassigned_issue.update_attribute(:assignee, john_doe)
+ service.reassigned_issue(unassigned_issue, author)
+
+ should_create_todo(user: john_doe, target: unassigned_issue, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ issue.update_attribute(:assignee, nil)
+
+ should_not_create_any_todo { service.reassigned_issue(issue, author) }
+ end
+
+ it 'does not create a todo if new assignee is the current user' do
+ unassigned_issue.update_attribute(:assignee, john_doe)
+
+ should_not_create_any_todo { service.reassigned_issue(unassigned_issue, john_doe) }
+ end
+ end
+
+ describe '#mark_pending_todos_as_done' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+
+ service.mark_pending_todos_as_done(issue, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+
+ describe '#new_note' do
+ let!(:first_todo) { create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) }
+ let!(:second_todo) { create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) }
+ let(:note) { create(:note, project: project, noteable: issue, author: john_doe, note: mentions) }
+ let(:award_note) { create(:note, :award, project: project, noteable: issue, author: john_doe, note: 'thumbsup') }
+ let(:system_note) { create(:system_note, project: project, noteable: issue) }
+
+ it 'mark related pending todos to the noteable for the note author as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author)
+
+ service.new_note(note, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+
+ it 'mark related pending todos to the noteable for the award note author as done' do
+ service.new_note(award_note, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+
+ it 'does not mark related pending todos it is a system note' do
+ service.new_note(system_note, john_doe)
+
+ expect(first_todo.reload).to be_pending
+ expect(second_todo.reload).to be_pending
+ end
+
+ it 'creates a todo for each valid mentioned user' do
+ service.new_note(note, john_doe)
+
+ should_create_todo(user: michael, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ should_create_todo(user: author, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ should_not_create_todo(user: john_doe, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ should_not_create_todo(user: stranger, target: issue, author: john_doe, action: Todo::MENTIONED, note: note)
+ end
+ end
+ end
+
+ describe 'Merge Requests' do
+ let(:mr_assigned) { create(:merge_request, source_project: project, author: author, assignee: john_doe, description: mentions) }
+ let(:mr_unassigned) { create(:merge_request, source_project: project, author: author, assignee: nil) }
+
+ describe '#new_merge_request' do
+ it 'creates a pending todo if assigned' do
+ service.new_merge_request(mr_assigned, author)
+
+ should_create_todo(user: john_doe, target: mr_assigned, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ should_not_create_any_todo { service.new_merge_request(mr_unassigned, author) }
+ end
+
+ it 'does not create a todo if assignee is the current user' do
+ should_not_create_any_todo { service.new_merge_request(mr_unassigned, john_doe) }
+ end
+
+ it 'creates a todo for each valid mentioned user' do
+ service.new_merge_request(mr_assigned, author)
+
+ should_create_todo(user: michael, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: mr_assigned, action: Todo::MENTIONED)
+ end
+ end
+
+ describe '#update_merge_request' do
+ it 'creates a todo for each valid mentioned user' do
+ service.update_merge_request(mr_assigned, author)
+
+ should_create_todo(user: michael, target: mr_assigned, action: Todo::MENTIONED)
+ should_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: stranger, target: mr_assigned, action: Todo::MENTIONED)
+ end
+
+ it 'does not create a todo if user was already mentioned' do
+ create(:todo, :mentioned, user: michael, project: project, target: mr_assigned, author: author)
+
+ expect { service.update_merge_request(mr_assigned, author) }.not_to change(michael.todos, :count)
+ end
+ end
+
+ describe '#close_merge_request' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ service.close_merge_request(mr_assigned, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+
+ describe '#reassigned_merge_request' do
+ it 'creates a pending todo for new assignee' do
+ mr_unassigned.update_attribute(:assignee, john_doe)
+ service.reassigned_merge_request(mr_unassigned, author)
+
+ should_create_todo(user: john_doe, target: mr_unassigned, action: Todo::ASSIGNED)
+ end
+
+ it 'does not create a todo if unassigned' do
+ mr_assigned.update_attribute(:assignee, nil)
+
+ should_not_create_any_todo { service.reassigned_merge_request(mr_assigned, author) }
+ end
+
+ it 'does not create a todo if new assignee is the current user' do
+ mr_assigned.update_attribute(:assignee, john_doe)
+
+ should_not_create_any_todo { service.reassigned_merge_request(mr_assigned, john_doe) }
+ end
+ end
+
+ describe '#merge_merge_request' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: mr_assigned, author: author)
+ service.merge_merge_request(mr_assigned, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+ end
+ end
+
+ def should_create_todo(attributes = {})
+ attributes.reverse_merge!(
+ project: project,
+ author: author,
+ state: :pending
+ )
+
+ expect(Todo.where(attributes).count).to eq 1
+ end
+
+ def should_not_create_todo(attributes = {})
+ attributes.reverse_merge!(
+ project: project,
+ author: author,
+ state: :pending
+ )
+
+ expect(Todo.where(attributes).count).to eq 0
+ end
+
+ def should_not_create_any_todo
+ expect { yield }.not_to change(Todo, :count)
+ end
+end