diff options
author | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-02-20 11:59:59 -0200 |
---|---|---|
committer | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-02-20 12:39:27 -0200 |
commit | 3d52e139b13ad077286f2f9f46b7e98f43ad9564 (patch) | |
tree | 22c70561b0f64851d938e44661aafeed3a2c80b2 /spec | |
parent | 408e010d65e7e2e2b64a694e12d44636d7d81dec (diff) | |
download | gitlab-ce-3d52e139b13ad077286f2f9f46b7e98f43ad9564.tar.gz |
Rename Tasks to Todos
Diffstat (limited to 'spec')
-rw-r--r-- | spec/factories/todos.rb (renamed from spec/factories/tasks.rb) | 10 | ||||
-rw-r--r-- | spec/models/note_spec.rb | 2 | ||||
-rw-r--r-- | spec/models/todo_spec.rb.rb (renamed from spec/models/task_spec.rb) | 8 | ||||
-rw-r--r-- | spec/models/user_spec.rb | 2 | ||||
-rw-r--r-- | spec/services/issues/close_service_spec.rb | 8 | ||||
-rw-r--r-- | spec/services/issues/create_service_spec.rb | 9 | ||||
-rw-r--r-- | spec/services/issues/update_service_spec.rb | 33 | ||||
-rw-r--r-- | spec/services/merge_requests/close_service_spec.rb | 6 | ||||
-rw-r--r-- | spec/services/merge_requests/create_service_spec.rb | 16 | ||||
-rw-r--r-- | spec/services/merge_requests/update_service_spec.rb | 37 | ||||
-rw-r--r-- | spec/services/notes/update_service_spec.rb | 12 | ||||
-rw-r--r-- | spec/services/task_service_spec.rb | 264 | ||||
-rw-r--r-- | spec/services/todo_service_spec.rb | 264 |
13 files changed, 338 insertions, 333 deletions
diff --git a/spec/factories/tasks.rb b/spec/factories/todos.rb index 4df489fa4c9..bd85b1d798a 100644 --- a/spec/factories/tasks.rb +++ b/spec/factories/todos.rb @@ -1,6 +1,6 @@ # == Schema Information # -# Table name: tasks +# Table name: todos # # id :integer not null, primary key # user_id :integer not null @@ -16,19 +16,19 @@ # FactoryGirl.define do - factory :task do + factory :todo do project author user target factory: :issue - action { Task::ASSIGNED } + action { Todo::ASSIGNED } trait :assigned do - action { Task::ASSIGNED } + action { Todo::ASSIGNED } end trait :mentioned do - action { Task::MENTIONED } + action { Todo::MENTIONED } end end end diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index 70c3a999c95..583937ca748 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -27,7 +27,7 @@ describe Note, models: true do it { is_expected.to belong_to(:noteable) } it { is_expected.to belong_to(:author).class_name('User') } - it { is_expected.to have_many(:tasks).dependent(:destroy) } + it { is_expected.to have_many(:todos).dependent(:destroy) } end describe 'validation' do diff --git a/spec/models/task_spec.rb b/spec/models/todo_spec.rb.rb index 2bbd47c5e8a..ac481bf9fbd 100644 --- a/spec/models/task_spec.rb +++ b/spec/models/todo_spec.rb.rb @@ -1,6 +1,6 @@ # == Schema Information # -# Table name: tasks +# Table name: todos # # id :integer not null, primary key # user_id :integer not null @@ -17,7 +17,7 @@ require 'spec_helper' -describe Task, models: true do +describe Todo, models: true do describe 'relationships' do it { is_expected.to belong_to(:author).class_name("User") } it { is_expected.to belong_to(:note) } @@ -39,13 +39,13 @@ describe Task, models: true do describe '#action_name' do it 'returns proper message when action is an assigment' do - subject.action = Task::ASSIGNED + subject.action = Todo::ASSIGNED expect(subject.action_name).to eq 'assigned' end it 'returns proper message when action is a mention' do - subject.action = Task::MENTIONED + subject.action = Todo::MENTIONED expect(subject.action_name).to eq 'mentioned you on' end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d2769836526..32d4f39b04a 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -92,7 +92,7 @@ describe User, models: true do it { is_expected.to have_many(:identities).dependent(:destroy) } it { is_expected.to have_one(:abuse_report) } it { is_expected.to have_many(:spam_logs).dependent(:destroy) } - it { is_expected.to have_many(:tasks).dependent(:destroy) } + it { is_expected.to have_many(:todos).dependent(:destroy) } end describe 'validations' do 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 |