Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services')
-rw-r--r--spec/services/issues/update_service_spec.rb11
-rw-r--r--spec/services/merge_requests/update_service_spec.rb11
-rw-r--r--spec/services/notes/update_service_spec.rb16
-rw-r--r--spec/services/todo_service_spec.rb138
4 files changed, 150 insertions, 26 deletions
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index fa472f3e2c3..5b324f3c706 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -13,6 +13,7 @@ describe Issues::UpdateService, services: true do
let(:issue) do
create(:issue, title: 'Old title',
+ description: "for #{user2.to_reference}",
assignee_id: user3.id,
project: project)
end
@@ -182,16 +183,24 @@ describe Issues::UpdateService, services: true do
it 'marks pending todos as done' do
expect(todo.reload.done?).to eq true
end
+
+ it 'does not create any new todos' do
+ expect(Todo.count).to eq(1)
+ end
end
context 'when the description change' do
before do
- update_issue(description: 'Also please fix')
+ update_issue(description: "Also please fix #{user2.to_reference} #{user3.to_reference}")
end
it 'marks todos as done' do
expect(todo.reload.done?).to eq true
end
+
+ it 'creates only 1 new todo' do
+ expect(Todo.count).to eq(2)
+ end
end
context 'when is reassigned' do
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index ad3d767f193..f2ca1e6fcbd 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -12,6 +12,7 @@ describe MergeRequests::UpdateService, services: true do
let(:merge_request) do
create(:merge_request, :simple, title: 'Old title',
+ description: "FYI #{user2.to_reference}",
assignee_id: user3.id,
source_project: project)
end
@@ -225,16 +226,24 @@ describe MergeRequests::UpdateService, services: true do
it 'marks pending todos as done' do
expect(pending_todo.reload).to be_done
end
+
+ it 'does not create any new todos' do
+ expect(Todo.count).to eq(1)
+ end
end
context 'when the description change' do
before do
- update_merge_request({ description: 'Also please fix' })
+ update_merge_request({ description: "Also please fix #{user2.to_reference} #{user3.to_reference}" })
end
it 'marks pending todos as done' do
expect(pending_todo.reload).to be_done
end
+
+ it 'creates only 1 new todo' do
+ expect(Todo.count).to eq(2)
+ end
end
context 'when is reassigned' do
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index dde4bde7dc2..905e2f46bde 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -4,12 +4,14 @@ describe Notes::UpdateService, services: true do
let(:project) { create(:empty_project) }
let(:user) { create(:user) }
let(:user2) { create(:user) }
+ let(:user3) { create(:user) }
let(:issue) { create(:issue, project: project) }
- let(:note) { create(:note, project: project, noteable: issue, author: user, note: 'Old note') }
+ let(:note) { create(:note, project: project, noteable: issue, author: user, note: "Old note #{user2.to_reference}") }
before do
project.team << [user, :master]
project.team << [user2, :developer]
+ project.team << [user3, :developer]
end
describe '#execute' do
@@ -23,22 +25,30 @@ describe Notes::UpdateService, services: true do
context 'when the note change' do
before do
- update_note({ note: 'New note' })
+ update_note({ note: "New note #{user2.to_reference} #{user3.to_reference}" })
end
it 'marks todos as done' do
expect(todo.reload).to be_done
end
+
+ it 'creates only 1 new todo' do
+ expect(Todo.count).to eq(2)
+ end
end
context 'when the note does not change' do
before do
- update_note({ note: 'Old note' })
+ update_note({ note: "Old note #{user2.to_reference}" })
end
it 'keep todos' do
expect(todo.reload).to be_pending
end
+
+ it 'does not create any new todos' do
+ expect(Todo.count).to eq(1)
+ end
end
end
end
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index f9e432bb216..89b3b6aad10 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -8,10 +8,12 @@ describe TodoService, services: true do
let(:guest) { create(:user) }
let(:admin) { create(:admin) }
let(:john_doe) { create(:user) }
+ let(:skipped) { create(:user) }
+ let(:skip_users) { [skipped] }
let(:project) { create(:empty_project) }
- let(:mentions) { 'FYI: ' + [author, assignee, john_doe, member, guest, non_member, admin].map(&:to_reference).join(' ') }
- let(:directly_addressed) { [author, assignee, john_doe, member, guest, non_member, admin].map(&:to_reference).join(' ') }
- let(:directly_addressed_and_mentioned) { member.to_reference + ", what do you think? cc: " + [guest, admin].map(&:to_reference).join(' ') }
+ let(:mentions) { 'FYI: ' + [author, assignee, john_doe, member, guest, non_member, admin, skipped].map(&:to_reference).join(' ') }
+ let(:directly_addressed) { [author, assignee, john_doe, member, guest, non_member, admin, skipped].map(&:to_reference).join(' ') }
+ let(:directly_addressed_and_mentioned) { member.to_reference + ", what do you think? cc: " + [guest, admin, skipped].map(&:to_reference).join(' ') }
let(:service) { described_class.new }
before do
@@ -19,6 +21,7 @@ describe TodoService, services: true do
project.team << [author, :developer]
project.team << [member, :developer]
project.team << [john_doe, :developer]
+ project.team << [skipped, :developer]
end
describe 'Issues' do
@@ -119,46 +122,61 @@ describe TodoService, services: true do
end
describe '#update_issue' do
- it 'creates a todo for each valid mentioned user' do
- service.update_issue(issue, author)
+ it 'creates a todo for each valid mentioned user not included in skip_users' do
+ service.update_issue(issue, author, skip_users)
should_create_todo(user: member, target: issue, action: Todo::MENTIONED)
should_create_todo(user: guest, target: issue, action: Todo::MENTIONED)
should_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED)
should_create_todo(user: author, target: issue, action: Todo::MENTIONED)
should_not_create_todo(user: non_member, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: skipped, target: issue, action: Todo::MENTIONED)
end
- it 'creates a todo for each valid user based on the type of mention' do
+ it 'creates a todo for each valid user not included in skip_users based on the type of mention' do
issue.update(description: directly_addressed_and_mentioned)
- service.update_issue(issue, author)
+ service.update_issue(issue, author, skip_users)
should_create_todo(user: member, target: issue, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: guest, target: issue, action: Todo::MENTIONED)
should_create_todo(user: admin, target: issue, action: Todo::MENTIONED)
+ should_not_create_todo(user: skipped, target: issue)
end
- it 'creates a directly addressed todo for each valid addressed user' do
- service.update_issue(addressed_issue, author)
+ it 'creates a directly addressed todo for each valid addressed user not included in skip_users' do
+ service.update_issue(addressed_issue, author, skip_users)
should_create_todo(user: member, target: addressed_issue, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: guest, target: addressed_issue, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: john_doe, target: addressed_issue, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: author, target: addressed_issue, action: Todo::DIRECTLY_ADDRESSED)
should_not_create_todo(user: non_member, target: addressed_issue, action: Todo::DIRECTLY_ADDRESSED)
+ should_not_create_todo(user: skipped, target: addressed_issue, action: Todo::DIRECTLY_ADDRESSED)
end
- it 'does not create a todo if user was already mentioned' do
+ it 'does not create a todo if user was already mentioned and todo is pending' do
create(:todo, :mentioned, user: member, project: project, target: issue, author: author)
- expect { service.update_issue(issue, author) }.not_to change(member.todos, :count)
+ expect { service.update_issue(issue, author, skip_users) }.not_to change(member.todos, :count)
+ end
+
+ it 'does not create a todo if user was already mentioned and todo is done' do
+ create(:todo, :mentioned, :done, user: skipped, project: project, target: issue, author: author)
+
+ expect { service.update_issue(issue, author, skip_users) }.not_to change(skipped.todos, :count)
end
- it 'does not create a directly addressed todo if user was already mentioned or addressed' do
+ it 'does not create a directly addressed todo if user was already mentioned or addressed and todo is pending' do
create(:todo, :directly_addressed, user: member, project: project, target: addressed_issue, author: author)
- expect { service.update_issue(addressed_issue, author) }.not_to change(member.todos, :count)
+ expect { service.update_issue(addressed_issue, author, skip_users) }.not_to change(member.todos, :count)
+ end
+
+ it 'does not create a directly addressed todo if user was already mentioned or addressed and todo is done' do
+ create(:todo, :directly_addressed, :done, user: skipped, project: project, target: addressed_issue, author: author)
+
+ expect { service.update_issue(addressed_issue, author, skip_users) }.not_to change(skipped.todos, :count)
end
it 'does not create todo if user can not see the issue when issue is confidential' do
@@ -521,47 +539,62 @@ describe TodoService, services: true do
end
describe '#update_merge_request' do
- it 'creates a todo for each valid mentioned user' do
- service.update_merge_request(mr_assigned, author)
+ it 'creates a todo for each valid mentioned user not included in skip_users' do
+ service.update_merge_request(mr_assigned, author, skip_users)
should_create_todo(user: member, target: mr_assigned, action: Todo::MENTIONED)
should_not_create_todo(user: guest, target: mr_assigned, action: Todo::MENTIONED)
should_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED)
should_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED)
should_not_create_todo(user: non_member, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: skipped, target: mr_assigned, action: Todo::MENTIONED)
end
- it 'creates a todo for each valid user based on the type of mention' do
+ it 'creates a todo for each valid user not included in skip_users based on the type of mention' do
mr_assigned.update(description: directly_addressed_and_mentioned)
- service.update_merge_request(mr_assigned, author)
+ service.update_merge_request(mr_assigned, author, skip_users)
should_create_todo(user: member, target: mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: admin, target: mr_assigned, action: Todo::MENTIONED)
+ should_not_create_todo(user: skipped, target: mr_assigned)
end
- it 'creates a directly addressed todo for each valid addressed user' do
- service.update_merge_request(addressed_mr_assigned, author)
+ it 'creates a directly addressed todo for each valid addressed user not included in skip_users' do
+ service.update_merge_request(addressed_mr_assigned, author, skip_users)
should_create_todo(user: member, target: addressed_mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
should_not_create_todo(user: guest, target: addressed_mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: john_doe, target: addressed_mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
should_create_todo(user: author, target: addressed_mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
should_not_create_todo(user: non_member, target: addressed_mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
+ should_not_create_todo(user: skipped, target: addressed_mr_assigned, action: Todo::DIRECTLY_ADDRESSED)
end
- it 'does not create a todo if user was already mentioned' do
+ it 'does not create a todo if user was already mentioned and todo is pending' do
create(:todo, :mentioned, user: member, project: project, target: mr_assigned, author: author)
expect { service.update_merge_request(mr_assigned, author) }.not_to change(member.todos, :count)
end
- it 'does not create a directly addressed todo if user was already mentioned or addressed' do
+ it 'does not create a todo if user was already mentioned and todo is done' do
+ create(:todo, :mentioned, :done, user: skipped, project: project, target: mr_assigned, author: author)
+
+ expect { service.update_merge_request(mr_assigned, author, skip_users) }.not_to change(skipped.todos, :count)
+ end
+
+ it 'does not create a directly addressed todo if user was already mentioned or addressed and todo is pending' do
create(:todo, :directly_addressed, user: member, project: project, target: addressed_mr_assigned, author: author)
expect{ service.update_merge_request(addressed_mr_assigned, author) }.not_to change(member.todos, :count)
end
+ it 'does not create a directly addressed todo if user was already mentioned or addressed and todo is done' do
+ create(:todo, :directly_addressed, user: skipped, project: project, target: addressed_mr_assigned, author: author)
+
+ expect{ service.update_merge_request(addressed_mr_assigned, author, skip_users) }.not_to change(skipped.todos, :count)
+ end
+
context 'with a task list' do
it 'does not create todo when tasks are marked as completed' do
mr_assigned.update(description: "- [x] Task 1\n- [X] Task 2 #{mentions}")
@@ -757,6 +790,69 @@ describe TodoService, services: true do
end
end
+ describe '#update_note' do
+ let(:noteable) { create(:issue, project: project) }
+ let(:note) { create(:note, project: project, note: mentions, noteable: noteable) }
+ let(:addressed_note) { create(:note, project: project, note: "#{directly_addressed}", noteable: noteable) }
+
+ it 'creates a todo for each valid mentioned user not included in skip_users' do
+ service.update_note(note, author, skip_users)
+
+ should_create_todo(user: member, target: noteable, action: Todo::MENTIONED)
+ should_create_todo(user: guest, target: noteable, action: Todo::MENTIONED)
+ should_create_todo(user: john_doe, target: noteable, action: Todo::MENTIONED)
+ should_create_todo(user: author, target: noteable, action: Todo::MENTIONED)
+ should_not_create_todo(user: non_member, target: noteable, action: Todo::MENTIONED)
+ should_not_create_todo(user: skipped, target: noteable, action: Todo::MENTIONED)
+ end
+
+ it 'creates a todo for each valid user not included in skip_users based on the type of mention' do
+ note.update(note: directly_addressed_and_mentioned)
+
+ service.update_note(note, author, skip_users)
+
+ should_create_todo(user: member, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ should_create_todo(user: guest, target: noteable, action: Todo::MENTIONED)
+ should_create_todo(user: admin, target: noteable, action: Todo::MENTIONED)
+ should_not_create_todo(user: skipped, target: noteable)
+ end
+
+ it 'creates a directly addressed todo for each valid addressed user not included in skip_users' do
+ service.update_note(addressed_note, author, skip_users)
+
+ should_create_todo(user: member, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ should_create_todo(user: guest, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ should_create_todo(user: john_doe, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ should_create_todo(user: author, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ should_not_create_todo(user: non_member, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ should_not_create_todo(user: skipped, target: noteable, action: Todo::DIRECTLY_ADDRESSED)
+ end
+
+ it 'does not create a todo if user was already mentioned and todo is pending' do
+ create(:todo, :mentioned, user: member, project: project, target: noteable, author: author)
+
+ expect { service.update_note(note, author, skip_users) }.not_to change(member.todos, :count)
+ end
+
+ it 'does not create a todo if user was already mentioned and todo is done' do
+ create(:todo, :mentioned, :done, user: skipped, project: project, target: noteable, author: author)
+
+ expect { service.update_note(note, author, skip_users) }.not_to change(skipped.todos, :count)
+ end
+
+ it 'does not create a directly addressed todo if user was already mentioned or addressed and todo is pending' do
+ create(:todo, :directly_addressed, user: member, project: project, target: noteable, author: author)
+
+ expect { service.update_note(addressed_note, author, skip_users) }.not_to change(member.todos, :count)
+ end
+
+ it 'does not create a directly addressed todo if user was already mentioned or addressed and todo is done' do
+ create(:todo, :directly_addressed, :done, user: skipped, project: project, target: noteable, author: author)
+
+ expect { service.update_note(addressed_note, author, skip_users) }.not_to change(skipped.todos, :count)
+ end
+ end
+
it 'updates cached counts when a todo is created' do
issue = create(:issue, project: project, assignee: john_doe, author: author, description: mentions)