From 3d52e139b13ad077286f2f9f46b7e98f43ad9564 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Sat, 20 Feb 2016 11:59:59 -0200 Subject: [PATCH] Rename Tasks to Todos --- CHANGELOG | 4 +- .../pages/{tasks.scss => todos.scss} | 26 +- app/controllers/dashboard/tasks_controller.rb | 21 -- app/controllers/dashboard/todos_controller.rb | 23 ++ .../projects/merge_requests_controller.rb | 2 +- .../{tasks_finder.rb => todos_finder.rb} | 10 +- app/helpers/tasks_helper.rb | 69 ----- app/helpers/todos_helper.rb | 59 ++++ app/models/note.rb | 2 +- app/models/{task.rb => todo.rb} | 4 +- app/models/user.rb | 2 +- app/services/base_service.rb | 4 +- app/services/issues/close_service.rb | 4 +- app/services/issues/create_service.rb | 2 +- app/services/issues/update_service.rb | 6 +- app/services/merge_requests/close_service.rb | 2 +- app/services/merge_requests/create_service.rb | 2 +- app/services/merge_requests/update_service.rb | 6 +- app/services/notes/create_service.rb | 2 +- app/services/notes/update_service.rb | 2 +- .../{task_service.rb => todo_service.rb} | 86 +++--- app/views/dashboard/tasks/_task.html.haml | 21 -- app/views/dashboard/todos/_todo.html.haml | 21 ++ .../{tasks => todos}/index.html.haml | 28 +- app/views/layouts/header/_default.html.haml | 6 +- app/views/layouts/nav/_dashboard.html.haml | 8 +- config/routes.rb | 2 +- .../20160220123949_rename_tasks_to_todos.rb | 5 + db/schema.rb | 16 +- .../{tasks.feature => todos.feature} | 22 +- .../steps/dashboard/{tasks.rb => todos.rb} | 64 ++--- features/steps/shared/paths.rb | 4 +- spec/factories/{tasks.rb => todos.rb} | 10 +- spec/models/note_spec.rb | 2 +- spec/models/{task_spec.rb => todo_spec.rb.rb} | 8 +- spec/models/user_spec.rb | 2 +- spec/services/issues/close_service_spec.rb | 8 +- spec/services/issues/create_service_spec.rb | 9 +- spec/services/issues/update_service_spec.rb | 33 +-- .../merge_requests/close_service_spec.rb | 6 +- .../merge_requests/create_service_spec.rb | 16 +- .../merge_requests/update_service_spec.rb | 37 +-- spec/services/notes/update_service_spec.rb | 12 +- spec/services/task_service_spec.rb | 264 ------------------ spec/services/todo_service_spec.rb | 264 ++++++++++++++++++ 45 files changed, 604 insertions(+), 602 deletions(-) rename app/assets/stylesheets/pages/{tasks.scss => todos.scss} (87%) delete mode 100644 app/controllers/dashboard/tasks_controller.rb create mode 100644 app/controllers/dashboard/todos_controller.rb rename app/finders/{tasks_finder.rb => todos_finder.rb} (92%) delete mode 100644 app/helpers/tasks_helper.rb create mode 100644 app/helpers/todos_helper.rb rename app/models/{task.rb => todo.rb} (96%) rename app/services/{task_service.rb => todo_service.rb} (50%) delete mode 100644 app/views/dashboard/tasks/_task.html.haml create mode 100644 app/views/dashboard/todos/_todo.html.haml rename app/views/dashboard/{tasks => todos}/index.html.haml (76%) create mode 100644 db/migrate/20160220123949_rename_tasks_to_todos.rb rename features/dashboard/{tasks.feature => todos.feature} (58%) rename features/steps/dashboard/{tasks.rb => todos.rb} (52%) rename spec/factories/{tasks.rb => todos.rb} (81%) rename spec/models/{task_spec.rb => todo_spec.rb.rb} (94%) delete mode 100644 spec/services/task_service_spec.rb create mode 100644 spec/services/todo_service_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 1225ce42683..d8d40239db2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -65,7 +65,7 @@ v 8.5.0 (unreleased) - Fix broken link to project in build notification emails - Ability to see and sort on vote count from Issues and MR lists - Fix builds scheduler when first build in stage was allowed to fail - - User project limit is reached notice is hidden if the projects limit is zero + - User project limit is reached notice is hidden if the projects limit is zero - Add API support for managing runners and project's runners - Allow SAML users to login with no previous account without having to allow all Omniauth providers to do so. @@ -75,7 +75,7 @@ v 8.5.0 (unreleased) - Emoji comment on diffs are not award emoji - Add label description (Nuttanart Pornprasitsakul) - Show label row when filtering issues or merge requests by label (Nuttanart Pornprasitsakul) - - Add Task Queue + - Add Todos v 8.4.4 - Update omniauth-saml gem to 1.4.2 diff --git a/app/assets/stylesheets/pages/tasks.scss b/app/assets/stylesheets/pages/todos.scss similarity index 87% rename from app/assets/stylesheets/pages/tasks.scss rename to app/assets/stylesheets/pages/todos.scss index a3dffeed4ab..2f57f21963d 100644 --- a/app/assets/stylesheets/pages/tasks.scss +++ b/app/assets/stylesheets/pages/todos.scss @@ -1,37 +1,37 @@ /** - * Dashboard tasks queue + * Dashboard Todos * */ .navbar-nav { li { - .badge.tasks-pending-count { + .badge.todos-pending-count { background-color: #7f8fa4; margin-top: -5px; } } } -.tasks { +.todos { .panel { border-top: none; margin-bottom: 0; } } -.task-item { +.todo-item { font-size: $gl-font-size; padding: $gl-padding-top 0 $gl-padding-top ($gl-avatar-size + $gl-padding-top); border-bottom: 1px solid $table-border-color; color: #7f8fa4; - &.task-inline { + &.todo-inline { .avatar { position: relative; top: -2px; } - .task-title { + .todo-title { line-height: 40px; } } @@ -44,7 +44,7 @@ margin-left: -($gl-avatar-size + $gl-padding-top); } - .task-title { + .todo-title { @include str-truncated(calc(100% - 174px)); font-weight: 600; @@ -53,10 +53,10 @@ } } - .task-body { + .todo-body { margin-right: 174px; - .task-note { + .todo-note { word-wrap: break-word; .md { @@ -89,7 +89,7 @@ } } - .task-note-icon { + .todo-note-icon { color: #777; float: left; font-size: $gl-font-size; @@ -102,10 +102,10 @@ } @media (max-width: $screen-xs-max) { - .task-item { + .todo-item { padding-left: $gl-padding; - .task-title { + .todo-title { white-space: normal; overflow: visible; max-width: 100%; @@ -115,7 +115,7 @@ display: none; } - .task-body { + .todo-body { margin: 0; border-left: 2px solid #DDD; padding-left: 10px; diff --git a/app/controllers/dashboard/tasks_controller.rb b/app/controllers/dashboard/tasks_controller.rb deleted file mode 100644 index a8884be54e4..00000000000 --- a/app/controllers/dashboard/tasks_controller.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Dashboard::TasksController < Dashboard::ApplicationController - def index - @tasks = TasksFinder.new(current_user, params).execute - @tasks = @tasks.page(params[:page]).per(PER_PAGE) - end - - def destroy - task.done! - - respond_to do |format| - format.html { redirect_to dashboard_tasks_path, notice: 'Task was successfully marked as done.' } - format.js { render nothing: true } - end - end - - private - - def task - @task ||= current_user.tasks.find(params[:id]) - end -end diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb new file mode 100644 index 00000000000..e24b8d3e58f --- /dev/null +++ b/app/controllers/dashboard/todos_controller.rb @@ -0,0 +1,23 @@ +class Dashboard::TodosController < Dashboard::ApplicationController + def index + @todos = TodosFinder.new(current_user, params).execute + @todos = @todos.page(params[:page]).per(PER_PAGE) + end + + def destroy + todo.done! + + respond_to do |format| + format.html { redirect_to dashboard_todos_path, notice: 'Todo was successfully marked as done.' } + format.js { render nothing: true } + end + end + + private + + def todo + @todo ||= current_user.todos.find(params[:id]) + end +end + + diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index be58156a9dc..5fe21694605 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -181,7 +181,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController return end - TaskService.new.merge_merge_request(merge_request, current_user) + TodoService.new.merge_merge_request(merge_request, current_user) @merge_request.update(merge_error: nil) diff --git a/app/finders/tasks_finder.rb b/app/finders/todos_finder.rb similarity index 92% rename from app/finders/tasks_finder.rb rename to app/finders/todos_finder.rb index 2a32e977c24..3ba27c40504 100644 --- a/app/finders/tasks_finder.rb +++ b/app/finders/todos_finder.rb @@ -1,6 +1,6 @@ -# TasksFinder +# TodosFinder # -# Used to filter Tasks by set of params +# Used to filter Todos by set of params # # Arguments: # current_user - which user use @@ -12,7 +12,7 @@ # type: 'Issue' or 'MergeRequest' # -class TasksFinder +class TodosFinder NONE = '0' attr_accessor :current_user, :params @@ -23,7 +23,7 @@ class TasksFinder end def execute - items = current_user.tasks + items = current_user.todos items = by_action_id(items) items = by_author(items) items = by_project(items) @@ -36,7 +36,7 @@ class TasksFinder private def action_id? - action_id.present? && [Task::ASSIGNED, Task::MENTIONED].include?(action_id.to_i) + action_id.present? && [Todo::ASSIGNED, Todo::MENTIONED].include?(action_id.to_i) end def action_id diff --git a/app/helpers/tasks_helper.rb b/app/helpers/tasks_helper.rb deleted file mode 100644 index 4498cd3af25..00000000000 --- a/app/helpers/tasks_helper.rb +++ /dev/null @@ -1,69 +0,0 @@ -module TasksHelper - def link_to_author(task) - author = task.author - - if author - link_to author.name, user_path(author.username) - else - task.author_name - end - end - - def tasks_pending_count - current_user.tasks.pending.count - end - - def tasks_done_count - current_user.tasks.done.count - end - - def task_action_name(task) - target = task.target_type.titleize.downcase - - [task.action_name, target].join(" ") - end - - def task_target_link_html(task) - link_to "##{task.target_iid}", task_target_path(task) - end - - def task_target_path(task) - anchor = dom_id(task.note) if task.note.present? - - polymorphic_path([task.project.namespace.becomes(Namespace), - task.project, task.target], anchor: anchor) - end - - def task_actions_options - actions = [ - OpenStruct.new(id: '', title: 'Any Action'), - OpenStruct.new(id: Task::ASSIGNED, title: 'Assigned'), - OpenStruct.new(id: Task::MENTIONED, title: 'Mentioned') - ] - - options_from_collection_for_select(actions, 'id', 'title', params[:action_id]) - end - - def task_projects_options - projects = current_user.authorized_projects.sorted_by_activity.non_archived - projects = projects.includes(:namespace) - - projects = projects.map do |project| - OpenStruct.new(id: project.id, title: project.name_with_namespace) - end - - projects.unshift(OpenStruct.new(id: '', title: 'Any Project')) - - options_from_collection_for_select(projects, 'id', 'title', params[:project_id]) - end - - def task_types_options - types = [ - OpenStruct.new(title: 'Any Type', name: ''), - OpenStruct.new(title: 'Issue', name: 'Issue'), - OpenStruct.new(title: 'Merge Request', name: 'MergeRequest') - ] - - options_from_collection_for_select(types, 'name', 'title', params[:type]) - end -end diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb new file mode 100644 index 00000000000..7c360468945 --- /dev/null +++ b/app/helpers/todos_helper.rb @@ -0,0 +1,59 @@ +module TodosHelper + def todos_pending_count + current_user.todos.pending.count + end + + def todos_done_count + current_user.todos.done.count + end + + def todo_action_name(todo) + target = todo.target_type.titleize.downcase + + [todo.action_name, target].join(" ") + end + + def todo_target_link_html(todo) + link_to "##{todo.target_iid}", todo_target_path(todo) + end + + def todo_target_path(todo) + anchor = dom_id(todo.note) if todo.note.present? + + polymorphic_path([todo.project.namespace.becomes(Namespace), + todo.project, todo.target], anchor: anchor) + end + + def todo_actions_options + actions = [ + OpenStruct.new(id: '', title: 'Any Action'), + OpenStruct.new(id: Todo::ASSIGNED, title: 'Assigned'), + OpenStruct.new(id: Todo::MENTIONED, title: 'Mentioned') + ] + + options_from_collection_for_select(actions, 'id', 'title', params[:action_id]) + end + + def todo_projects_options + projects = current_user.authorized_projects.sorted_by_activity.non_archived + projects = projects.includes(:namespace) + + projects = projects.map do |project| + OpenStruct.new(id: project.id, title: project.name_with_namespace) + end + + projects.unshift(OpenStruct.new(id: '', title: 'Any Project')) + + options_from_collection_for_select(projects, 'id', 'title', params[:project_id]) + end + + def todo_types_options + types = [ + OpenStruct.new(title: 'Any Type', name: ''), + OpenStruct.new(title: 'Issue', name: 'Issue'), + OpenStruct.new(title: 'Merge Request', name: 'MergeRequest') + ] + + options_from_collection_for_select(types, 'name', 'title', params[:type]) + end +end diff --git a/app/models/note.rb b/app/models/note.rb index 31606cf8222..d287e0f3c6d 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -37,7 +37,7 @@ class Note < ActiveRecord::Base belongs_to :author, class_name: "User" belongs_to :updated_by, class_name: "User" - has_many :tasks, dependent: :destroy + has_many :todos, dependent: :destroy delegate :name, to: :project, prefix: true delegate :name, :email, to: :author, prefix: true diff --git a/app/models/task.rb b/app/models/todo.rb similarity index 96% rename from app/models/task.rb rename to app/models/todo.rb index 0872743097c..7a9b0212f9f 100644 --- a/app/models/task.rb +++ b/app/models/todo.rb @@ -1,6 +1,6 @@ # == Schema Information # -# Table name: tasks +# Table name: todos # # id :integer not null, primary key # user_id :integer not null @@ -15,7 +15,7 @@ # updated_at :datetime # -class Task < ActiveRecord::Base +class Todo < ActiveRecord::Base ASSIGNED = 1 MENTIONED = 2 diff --git a/app/models/user.rb b/app/models/user.rb index d108ba78e4b..02ff2456f2b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -140,7 +140,7 @@ class User < ActiveRecord::Base has_one :abuse_report, dependent: :destroy has_many :spam_logs, dependent: :destroy has_many :builds, dependent: :nullify, class_name: 'Ci::Build' - has_many :tasks, dependent: :destroy + has_many :todos, dependent: :destroy # # Validations diff --git a/app/services/base_service.rb b/app/services/base_service.rb index c349997b9e4..8563633816c 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -23,8 +23,8 @@ class BaseService EventCreateService.new end - def task_service - TaskService.new + def todo_service + TodoService.new end def log_info(message) diff --git a/app/services/issues/close_service.rb b/app/services/issues/close_service.rb index a652bba4761..78254b49af3 100644 --- a/app/services/issues/close_service.rb +++ b/app/services/issues/close_service.rb @@ -3,7 +3,7 @@ module Issues def execute(issue, commit = nil) if project.jira_tracker? && project.jira_service.active project.jira_service.execute(commit, issue) - task_service.close_issue(issue, current_user) + todo_service.close_issue(issue, current_user) return issue end @@ -11,7 +11,7 @@ module Issues event_service.close_issue(issue, current_user) create_note(issue, commit) notification_service.close_issue(issue, current_user) - task_service.close_issue(issue, current_user) + todo_service.close_issue(issue, current_user) execute_hooks(issue, 'close') end diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb index 2a6c84c3ce5..10787e8873c 100644 --- a/app/services/issues/create_service.rb +++ b/app/services/issues/create_service.rb @@ -9,7 +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) + todo_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 4d85f6464b1..51ef9dfe610 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -6,12 +6,12 @@ module Issues def handle_changes(issue, options = {}) if has_changes?(issue, options) - task_service.mark_pending_tasks_as_done(issue, current_user) + todo_service.mark_pending_todos_as_done(issue, current_user) end if issue.previous_changes.include?('title') || issue.previous_changes.include?('description') - task_service.update_issue(issue, current_user) + todo_service.update_issue(issue, current_user) end if issue.previous_changes.include?('milestone_id') @@ -21,7 +21,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) + todo_service.reassigned_issue(issue, current_user) end end diff --git a/app/services/merge_requests/close_service.rb b/app/services/merge_requests/close_service.rb index 1f70c95ab4a..27ee81fe3e7 100644 --- a/app/services/merge_requests/close_service.rb +++ b/app/services/merge_requests/close_service.rb @@ -9,7 +9,7 @@ module MergeRequests event_service.close_mr(merge_request, current_user) create_note(merge_request) notification_service.close_mr(merge_request, current_user) - task_service.close_merge_request(merge_request, current_user) + todo_service.close_merge_request(merge_request, current_user) execute_hooks(merge_request, 'close') end diff --git a/app/services/merge_requests/create_service.rb b/app/services/merge_requests/create_service.rb index b5691cdf44f..33609d01f20 100644 --- a/app/services/merge_requests/create_service.rb +++ b/app/services/merge_requests/create_service.rb @@ -18,7 +18,7 @@ module MergeRequests merge_request.update_attributes(label_ids: label_params) event_service.open_mr(merge_request, current_user) notification_service.new_merge_request(merge_request, current_user) - task_service.new_merge_request(merge_request, current_user) + todo_service.new_merge_request(merge_request, current_user) merge_request.create_cross_references!(current_user) execute_hooks(merge_request) end diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb index b9781864697..6319ad805b6 100644 --- a/app/services/merge_requests/update_service.rb +++ b/app/services/merge_requests/update_service.rb @@ -16,12 +16,12 @@ module MergeRequests def handle_changes(merge_request, options = {}) if has_changes?(merge_request, options) - task_service.mark_pending_tasks_as_done(merge_request, current_user) + todo_service.mark_pending_todos_as_done(merge_request, current_user) end if merge_request.previous_changes.include?('title') || merge_request.previous_changes.include?('description') - task_service.update_merge_request(merge_request, current_user) + todo_service.update_merge_request(merge_request, current_user) end if merge_request.previous_changes.include?('target_branch') @@ -37,7 +37,7 @@ module MergeRequests if merge_request.previous_changes.include?('assignee_id') create_assignee_note(merge_request) notification_service.reassigned_merge_request(merge_request, current_user) - task_service.reassigned_merge_request(merge_request, current_user) + todo_service.reassigned_merge_request(merge_request, current_user) end if merge_request.previous_changes.include?('target_branch') || diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb index dbbf9e63164..b970439b921 100644 --- a/app/services/notes/create_service.rb +++ b/app/services/notes/create_service.rb @@ -8,7 +8,7 @@ module Notes if note.save # Finish the harder work in the background NewNoteWorker.perform_in(2.seconds, note.id, params) - TaskService.new.new_note(note, current_user) + TodoService.new.new_note(note, current_user) end note diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb index 6c2d36546e1..1361b1e0300 100644 --- a/app/services/notes/update_service.rb +++ b/app/services/notes/update_service.rb @@ -8,7 +8,7 @@ module Notes note.reset_events_cache if note.previous_changes.include?('note') - TaskService.new.update_note(note, current_user) + TodoService.new.update_note(note, current_user) end note diff --git a/app/services/task_service.rb b/app/services/todo_service.rb similarity index 50% rename from app/services/task_service.rb rename to app/services/todo_service.rb index c4479fe6382..dc270602ebc 100644 --- a/app/services/task_service.rb +++ b/app/services/todo_service.rb @@ -1,15 +1,15 @@ -# TaskService class +# TodoService class # -# Used for creating tasks on task queue after certain user action +# Used for creating todos after certain user actions # # Ex. -# TaskService.new.new_issue(issue, current_user) +# TodoService.new.new_issue(issue, current_user) # -class TaskService +class TodoService # When create an issue we should: # - # * create a task for assignee if issue is assigned - # * create a task for each mentioned user on issue + # * create a todo for assignee if issue is assigned + # * create a todo for each mentioned user on issue # def new_issue(issue, current_user) new_issuable(issue, current_user) @@ -17,32 +17,32 @@ class TaskService # When update an issue we should: # - # * mark all pending tasks related to the issue for the current user as done + # * mark all pending todos related to the issue for the current user as done # def update_issue(issue, current_user) - create_mention_tasks(issue.project, issue, current_user) + create_mention_todos(issue.project, issue, current_user) end # When close an issue we should: # - # * mark all pending tasks related to the target for the current user as done + # * mark all pending todos related to the target for the current user as done # def close_issue(issue, current_user) - mark_pending_tasks_as_done(issue, current_user) + mark_pending_todos_as_done(issue, current_user) end # When we reassign an issue we should: # - # * create a pending task for new assignee if issue is assigned + # * create a pending todo for new assignee if issue is assigned # def reassigned_issue(issue, current_user) - create_assignment_task(issue, current_user) + create_assignment_todo(issue, current_user) end # When create a merge request we should: # - # * creates a pending task for assignee if merge request is assigned - # * create a task for each mentioned user on merge request + # * creates a pending todo for assignee if merge request is assigned + # * create a todo for each mentioned user on merge request # def new_merge_request(merge_request, current_user) new_issuable(merge_request, current_user) @@ -50,40 +50,40 @@ class TaskService # When update a merge request we should: # - # * create a task for each mentioned user on merge request + # * create a todo for each mentioned user on merge request # def update_merge_request(merge_request, current_user) - create_mention_tasks(merge_request.project, merge_request, current_user) + create_mention_todos(merge_request.project, merge_request, current_user) end # When close a merge request we should: # - # * mark all pending tasks related to the target for the current user as done + # * mark all pending todos related to the target for the current user as done # def close_merge_request(merge_request, current_user) - mark_pending_tasks_as_done(merge_request, current_user) + mark_pending_todos_as_done(merge_request, current_user) end # When we reassign a merge request we should: # - # * creates a pending task for new assignee if merge request is assigned + # * creates a pending todo for new assignee if merge request is assigned # def reassigned_merge_request(merge_request, current_user) - create_assignment_task(merge_request, current_user) + create_assignment_todo(merge_request, current_user) end # When merge a merge request we should: # - # * mark all pending tasks related to the target for the current user as done + # * mark all pending todos related to the target for the current user as done # def merge_merge_request(merge_request, current_user) - mark_pending_tasks_as_done(merge_request, current_user) + mark_pending_todos_as_done(merge_request, current_user) end # When create a note we should: # - # * mark all pending tasks related to the noteable for the note author as done - # * create a task for each mentioned user on note + # * mark all pending todos related to the noteable for the note author as done + # * create a todo for each mentioned user on note # def new_note(note, current_user) handle_note(note, current_user) @@ -91,28 +91,28 @@ class TaskService # When update a note we should: # - # * mark all pending tasks related to the noteable for the current user as done - # * create a task for each new user mentioned on note + # * mark all pending todos related to the noteable for the current user as done + # * create a todo for each new user mentioned on note # def update_note(note, current_user) handle_note(note, current_user) end - # When marking pending tasks as done we should: + # When marking pending todos as done we should: # - # * mark all pending tasks related to the target for the current user as done + # * mark all pending todos related to the target for the current user as done # - def mark_pending_tasks_as_done(target, user) - pending_tasks(user, target.project, target).update_all(state: :done) + def mark_pending_todos_as_done(target, user) + pending_todos(user, target.project, target).update_all(state: :done) end private - def create_tasks(project, target, author, users, action, note = nil) + def create_todos(project, target, author, users, action, note = nil) Array(users).each do |user| - next if pending_tasks(user, project, target).exists? + next if pending_todos(user, project, target).exists? - Task.create( + Todo.create( project: project, user_id: user.id, author_id: author.id, @@ -125,8 +125,8 @@ class TaskService end def new_issuable(issuable, author) - create_assignment_task(issuable, author) - create_mention_tasks(issuable.project, issuable, author) + create_assignment_todo(issuable, author) + create_mention_todos(issuable.project, issuable, author) end def handle_note(note, author) @@ -136,19 +136,19 @@ class TaskService project = note.project target = note.noteable - mark_pending_tasks_as_done(target, author) - create_mention_tasks(project, target, author, note) + mark_pending_todos_as_done(target, author) + create_mention_todos(project, target, author, note) end - def create_assignment_task(issuable, author) + def create_assignment_todo(issuable, author) if issuable.assignee && issuable.assignee != author - create_tasks(issuable.project, issuable, author, issuable.assignee, Task::ASSIGNED) + create_todos(issuable.project, issuable, author, issuable.assignee, Todo::ASSIGNED) end end - def create_mention_tasks(project, issuable, author, note = nil) + def create_mention_todos(project, issuable, author, note = nil) mentioned_users = filter_mentioned_users(project, note || issuable, author) - create_tasks(project, issuable, author, mentioned_users, Task::MENTIONED, note) + create_todos(project, issuable, author, mentioned_users, Todo::MENTIONED, note) end def filter_mentioned_users(project, target, author) @@ -160,8 +160,8 @@ class TaskService mentioned_users.uniq end - def pending_tasks(user, project, target) - user.tasks.pending.where( + def pending_todos(user, project, target) + user.todos.pending.where( project_id: project.id, target_id: target.id, target_type: target.class.name diff --git a/app/views/dashboard/tasks/_task.html.haml b/app/views/dashboard/tasks/_task.html.haml deleted file mode 100644 index 164a53dd928..00000000000 --- a/app/views/dashboard/tasks/_task.html.haml +++ /dev/null @@ -1,21 +0,0 @@ -%li{class: "task task-#{task.done? ? 'done' : 'pending'}", id: dom_id(task) } - .task-item{class: 'task-block'} - = image_tag avatar_icon(task.author_email, 40), class: 'avatar s40', alt:'' - - .task-title - %span.author_name - = link_to_author task - %span.task_label - = task_action_name(task) - = task_target_link_html(task) - - · #{time_ago_with_tooltip(task.created_at)} - - - if task.pending? - .task-actions.pull-right - = link_to 'Done', [:dashboard, task], method: :delete, class: 'btn' - - .task-body - .task-note - .md - = event_note(task.body, project: task.project) diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml new file mode 100644 index 00000000000..7de703e304f --- /dev/null +++ b/app/views/dashboard/todos/_todo.html.haml @@ -0,0 +1,21 @@ +%li{class: "todo todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) } + .todo-item{class: 'todo-block'} + = image_tag avatar_icon(todo.author_email, 40), class: 'avatar s40', alt:'' + + .todo-title + %span.author_name + = link_to_author todo + %span.todo_label + = todo_action_name(todo) + = todo_target_link_html(todo) + + · #{time_ago_with_tooltip(todo.created_at)} + + - if todo.pending? + .todo-actions.pull-right + = link_to 'Done', [:dashboard, todo], method: :delete, class: 'btn' + + .todo-body + .todo-note + .md + = event_note(todo.body, project: todo.project) diff --git a/app/views/dashboard/tasks/index.html.haml b/app/views/dashboard/todos/index.html.haml similarity index 76% rename from app/views/dashboard/tasks/index.html.haml rename to app/views/dashboard/todos/index.html.haml index 4b6e3d83e62..a91f8f24f8c 100644 --- a/app/views/dashboard/tasks/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -1,53 +1,53 @@ -- page_title "Tasks" -- header_title "Tasks", dashboard_tasks_path +- page_title "Todos" +- header_title "Todos", dashboard_todos_path .top-area %ul.nav-links %li{class: ('active' if params[:state].blank? || params[:state] == 'pending')} = link_to page_filter_path(state: 'pending') do %span - Tasks + Todos %span{class: 'badge'} - = tasks_pending_count + = todos_pending_count %li{class: ('active' if params[:state] == 'done')} = link_to page_filter_path(state: 'done') do %span Done %span{class: 'badge'} - = tasks_done_count + = todos_done_count -.tasks-filters +.todos-filters .gray-content-block.second-block = form_tag page_filter_path(without: [:assignee_id, :milestone_title, :label_name, :scope, :sort]), method: :get, class: 'filter-form' do .filter-item.inline - = select_tag('project_id', task_projects_options, + = select_tag('project_id', todo_projects_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Project'}) .filter-item.inline = users_select_tag(:author_id, selected: params[:author_id], placeholder: 'Author', class: 'trigger-submit', any_user: "Any Author", first_user: true, current_user: true) .filter-item.inline - = select_tag('type', task_types_options, + = select_tag('type', todo_types_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Type'}) .filter-item.inline.actions-filter - = select_tag('action_id', task_actions_options, + = select_tag('action_id', todo_actions_options, class: 'select2 trigger-submit', include_blank: true, data: {placeholder: 'Action'}) .prepend-top-default - - if @tasks.any? - - @tasks.group_by(&:project).each do |group| + - if @todos.any? + - @todos.group_by(&:project).each do |group| .panel.panel-default.panel-small - project = group[0] .panel-heading = link_to project.name_with_namespace, namespace_project_path(project.namespace, project) - %ul.well-list.tasks-list + %ul.well-list.todos-list = render group[1] - = paginate @tasks, theme: "gitlab" + = paginate @todos, theme: "gitlab" - else - .nothing-here-block No tasks to show + .nothing-here-block No todos to show :javascript new UsersSelect(); diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 3d55c4bba1b..4781ff23507 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -22,9 +22,9 @@ = link_to admin_root_path, title: 'Admin Area', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = icon('wrench fw') %li - = link_to dashboard_tasks_path, title: 'Tasks', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - %span.badge.tasks-pending-count - = tasks_pending_count + = link_to dashboard_todos_path, title: 'Todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do + %span.badge.todos-pending-count + = todos_pending_count - if current_user.can_create_project? %li = link_to new_project_path, title: 'New project', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 586eff002df..db0cf393922 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -4,12 +4,12 @@ = icon('home fw') %span Projects - = nav_link(controller: :tasks) do - = link_to dashboard_tasks_path, title: 'Tasks' do + = nav_link(controller: :todos) do + = link_to dashboard_todos_path, title: 'Todos' do = icon('bell fw') %span - Tasks - %span.count= number_with_delimiter(tasks_pending_count) + Todos + %span.count= number_with_delimiter(todos_pending_count) = nav_link(path: 'dashboard#activity') do = link_to activity_dashboard_path, class: 'shortcuts-activity', title: 'Activity' do = icon('dashboard fw') diff --git a/config/routes.rb b/config/routes.rb index 0b263933fba..c228a51bed1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -333,7 +333,7 @@ Rails.application.routes.draw do resources :groups, only: [:index] resources :snippets, only: [:index] - resources :tasks, only: [:index, :destroy] + resources :todos, only: [:index, :destroy] resources :projects, only: [:index] do collection do diff --git a/db/migrate/20160220123949_rename_tasks_to_todos.rb b/db/migrate/20160220123949_rename_tasks_to_todos.rb new file mode 100644 index 00000000000..30c10d27146 --- /dev/null +++ b/db/migrate/20160220123949_rename_tasks_to_todos.rb @@ -0,0 +1,5 @@ +class RenameTasksToTodos < ActiveRecord::Migration + def change + rename_table :tasks, :todos + end +end diff --git a/db/schema.rb b/db/schema.rb index 2b726d17682..4708c29d9ae 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160217174422) do +ActiveRecord::Schema.define(version: 20160220123949) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -824,7 +824,7 @@ ActiveRecord::Schema.define(version: 20160217174422) do add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree - create_table "tasks", force: :cascade do |t| + create_table "todos", force: :cascade do |t| t.integer "user_id", null: false t.integer "project_id", null: false t.integer "target_id", null: false @@ -837,12 +837,12 @@ ActiveRecord::Schema.define(version: 20160217174422) do t.integer "note_id" end - add_index "tasks", ["author_id"], name: "index_tasks_on_author_id", using: :btree - add_index "tasks", ["note_id"], name: "index_tasks_on_note_id", using: :btree - add_index "tasks", ["project_id"], name: "index_tasks_on_project_id", using: :btree - add_index "tasks", ["state"], name: "index_tasks_on_state", using: :btree - add_index "tasks", ["target_type", "target_id"], name: "index_tasks_on_target_type_and_target_id", using: :btree - add_index "tasks", ["user_id"], name: "index_tasks_on_user_id", using: :btree + add_index "todos", ["author_id"], name: "index_todos_on_author_id", using: :btree + add_index "todos", ["note_id"], name: "index_todos_on_note_id", using: :btree + add_index "todos", ["project_id"], name: "index_todos_on_project_id", using: :btree + add_index "todos", ["state"], name: "index_todos_on_state", using: :btree + add_index "todos", ["target_type", "target_id"], name: "index_todos_on_target_type_and_target_id", using: :btree + add_index "todos", ["user_id"], name: "index_todos_on_user_id", using: :btree create_table "users", force: :cascade do |t| t.string "email", default: "", null: false diff --git a/features/dashboard/tasks.feature b/features/dashboard/todos.feature similarity index 58% rename from features/dashboard/tasks.feature rename to features/dashboard/todos.feature index 9d4f386f7dd..1e7b1b50d64 100644 --- a/features/dashboard/tasks.feature +++ b/features/dashboard/todos.feature @@ -1,5 +1,5 @@ @dashboard -Feature: Dashboard Tasks +Feature: Dashboard Todos Background: Given I sign in as a user And I own project "Shop" @@ -7,32 +7,32 @@ Feature: Dashboard Tasks And "Mary Jane" is a developer of project "Shop" And "Mary Jane" owns private project "Enterprise" And I am a developer of project "Enterprise" - And I have pending tasks - And I visit dashboard task queue page + And I have todos + And I visit dashboard todos page @javascript - Scenario: I mark pending tasks as done - Then I should see pending tasks assigned to me - And I mark the pending task as done + Scenario: I mark todos as done + Then I should see todos assigned to me + And I mark the todo as done And I click on the "Done" tab - Then I should see all tasks marked as done + Then I should see all todos marked as done @javascript Scenario: I filter by project Given I filter by "Enterprise" - Then I should not see tasks + Then I should not see todos @javascript Scenario: I filter by author Given I filter by "John Doe" - Then I should not see tasks related to "Mary Jane" in the list + Then I should not see todos related to "Mary Jane" in the list @javascript Scenario: I filter by type Given I filter by "Issue" - Then I should not see tasks related to "Merge Requests" in the list + Then I should not see todos related to "Merge Requests" in the list @javascript Scenario: I filter by action Given I filter by "Mentioned" - Then I should not see tasks related to "Assignments" in the list + Then I should not see todos related to "Assignments" in the list diff --git a/features/steps/dashboard/tasks.rb b/features/steps/dashboard/todos.rb similarity index 52% rename from features/steps/dashboard/tasks.rb rename to features/steps/dashboard/todos.rb index 556aa41bad9..207d997f8a0 100644 --- a/features/steps/dashboard/tasks.rb +++ b/features/steps/dashboard/todos.rb @@ -1,4 +1,4 @@ -class Spinach::Features::DashboardTasks < Spinach::FeatureSteps +class Spinach::Features::DashboardTodos < Spinach::FeatureSteps include SharedAuthentication include SharedPaths include SharedProject @@ -17,43 +17,43 @@ class Spinach::Features::DashboardTasks < Spinach::FeatureSteps project.team << [john_doe, :developer] end - step 'I have pending tasks' do - create(:task, user: current_user, project: project, author: mary_jane, target: issue, action: Task::MENTIONED) - create(:task, user: current_user, project: project, author: john_doe, target: issue, action: Task::ASSIGNED) + step 'I have todos' do + create(:todo, user: current_user, project: project, author: mary_jane, target: issue, action: Todo::MENTIONED) + create(:todo, user: current_user, project: project, author: john_doe, target: issue, action: Todo::ASSIGNED) note = create(:note, author: john_doe, noteable: issue, note: "#{current_user.to_reference} Wdyt?") - create(:task, user: current_user, project: project, author: john_doe, target: issue, action: Task::MENTIONED, note: note) - create(:task, user: current_user, project: project, author: john_doe, target: merge_request, action: Task::ASSIGNED) + create(:todo, user: current_user, project: project, author: john_doe, target: issue, action: Todo::MENTIONED, note: note) + create(:todo, user: current_user, project: project, author: john_doe, target: merge_request, action: Todo::ASSIGNED) end - step 'I should see pending tasks assigned to me' do - expect(page).to have_content 'Tasks 4' + step 'I should see todos assigned to me' do + expect(page).to have_content 'Todos 4' expect(page).to have_content 'Done 0' expect(page).to have_link project.name_with_namespace - should_see_task(1, "John Doe assigned merge request ##{merge_request.iid}", merge_request.title) - should_see_task(2, "John Doe mentioned you on issue ##{issue.iid}", "#{current_user.to_reference} Wdyt?") - should_see_task(3, "John Doe assigned issue ##{issue.iid}", issue.title) - should_see_task(4, "Mary Jane mentioned you on issue ##{issue.iid}", issue.title) + should_see_todo(1, "John Doe assigned merge request ##{merge_request.iid}", merge_request.title) + should_see_todo(2, "John Doe mentioned you on issue ##{issue.iid}", "#{current_user.to_reference} Wdyt?") + should_see_todo(3, "John Doe assigned issue ##{issue.iid}", issue.title) + should_see_todo(4, "Mary Jane mentioned you on issue ##{issue.iid}", issue.title) end - step 'I mark the pending task as done' do - page.within('.task:nth-child(1)') do + step 'I mark the todo as done' do + page.within('.todo:nth-child(1)') do click_link 'Done' end - expect(page).to have_content 'Task was successfully marked as done.' - expect(page).to have_content 'Tasks 3' + expect(page).to have_content 'Todo was successfully marked as done.' + expect(page).to have_content 'Todos 3' expect(page).to have_content 'Done 1' - should_not_see_task "John Doe assigned merge request ##{merge_request.iid}" + should_not_see_todo "John Doe assigned merge request ##{merge_request.iid}" end step 'I click on the "Done" tab' do click_link 'Done 1' end - step 'I should see all tasks marked as done' do + step 'I should see all todos marked as done' do expect(page).to have_link project.name_with_namespace - should_see_task(1, "John Doe assigned merge request ##{merge_request.iid}", merge_request.title, false) + should_see_todo(1, "John Doe assigned merge request ##{merge_request.iid}", merge_request.title, false) end step 'I filter by "Enterprise"' do @@ -69,28 +69,28 @@ class Spinach::Features::DashboardTasks < Spinach::FeatureSteps end step 'I filter by "Mentioned"' do - select2("#{Task::MENTIONED}", from: '#action_id') + select2("#{Todo::MENTIONED}", from: '#action_id') end - step 'I should not see tasks' do - expect(page).to have_content 'No tasks to show' + step 'I should not see todos' do + expect(page).to have_content 'No todos to show' end - step 'I should not see tasks related to "Mary Jane" in the list' do - should_not_see_task "Mary Jane mentioned you on issue ##{issue.iid}" + step 'I should not see todos related to "Mary Jane" in the list' do + should_not_see_todo "Mary Jane mentioned you on issue ##{issue.iid}" end - step 'I should not see tasks related to "Merge Requests" in the list' do - should_not_see_task "John Doe assigned merge request ##{merge_request.iid}" + step 'I should not see todos related to "Merge Requests" in the list' do + should_not_see_todo "John Doe assigned merge request ##{merge_request.iid}" end - step 'I should not see tasks related to "Assignments" in the list' do - should_not_see_task "John Doe assigned merge request ##{merge_request.iid}" - should_not_see_task "John Doe assigned issue ##{issue.iid}" + step 'I should not see todos related to "Assignments" in the list' do + should_not_see_todo "John Doe assigned merge request ##{merge_request.iid}" + should_not_see_todo "John Doe assigned issue ##{issue.iid}" end - def should_see_task(position, title, body, pending = true) - page.within(".task:nth-child(#{position})") do + def should_see_todo(position, title, body, pending = true) + page.within(".todo:nth-child(#{position})") do expect(page).to have_content title expect(page).to have_content body @@ -102,7 +102,7 @@ class Spinach::Features::DashboardTasks < Spinach::FeatureSteps end end - def should_not_see_task(title) + def should_not_see_todo(title) expect(page).not_to have_content title end diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index 112ace342f0..f4df4874d2f 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -103,8 +103,8 @@ module SharedPaths visit dashboard_groups_path end - step 'I visit dashboard task queue page' do - visit dashboard_tasks_path + step 'I visit dashboard todos page' do + visit dashboard_todos_path end step 'I should be redirected to the dashboard groups page' do diff --git a/spec/factories/tasks.rb b/spec/factories/todos.rb similarity index 81% rename from spec/factories/tasks.rb rename to 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 similarity index 94% rename from spec/models/task_spec.rb rename to 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