Merge branch '23036-replace-dashboard-todo-spinach' into 'master'
Replaces 'dashboard/todos' spinach with rspec See merge request !12453
This commit is contained in:
commit
22dc7e9cb7
9 changed files with 399 additions and 618 deletions
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Replace 'dashboard/todos' spinach with rspec
|
||||
merge_request: 12453
|
||||
author: Alexander Randa (@randaalex)
|
|
@ -1,28 +0,0 @@
|
|||
@dashboard
|
||||
Feature: Dashboard Todos
|
||||
Background:
|
||||
Given I sign in as a user
|
||||
And I own project "Shop"
|
||||
And "John Doe" is a developer of project "Shop"
|
||||
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 todos
|
||||
And I visit dashboard todos page
|
||||
|
||||
@javascript
|
||||
Scenario: I mark todos as done
|
||||
Then I should see todos assigned to me
|
||||
And I mark the todo as done
|
||||
Then I should see the todo marked as done
|
||||
|
||||
@javascript
|
||||
Scenario: I mark all todos as done
|
||||
Then I should see todos assigned to me
|
||||
And I mark all todos as done
|
||||
Then I should see all todos marked as done
|
||||
|
||||
@javascript
|
||||
Scenario: I click on a todo row
|
||||
Given I click on the todo
|
||||
Then I should be directed to the corresponding page
|
|
@ -1,191 +0,0 @@
|
|||
class Spinach::Features::DashboardTodos < Spinach::FeatureSteps
|
||||
include SharedAuthentication
|
||||
include SharedPaths
|
||||
include SharedProject
|
||||
include SharedUser
|
||||
include WaitForRequests
|
||||
|
||||
step '"John Doe" is a developer of project "Shop"' do
|
||||
project.team << [john_doe, :developer]
|
||||
end
|
||||
|
||||
step 'I am a developer of project "Enterprise"' do
|
||||
enterprise.team << [current_user, :developer]
|
||||
end
|
||||
|
||||
step '"Mary Jane" is a developer of project "Shop"' do
|
||||
project.team << [john_doe, :developer]
|
||||
end
|
||||
|
||||
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?", project: project)
|
||||
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 todos assigned to me' do
|
||||
merge_request_reference = merge_request.to_reference(full: true)
|
||||
issue_reference = issue.to_reference(full: true)
|
||||
|
||||
page.within('.todos-count') { expect(page).to have_content '4' }
|
||||
expect(page).to have_content 'To do 4'
|
||||
expect(page).to have_content 'Done 0'
|
||||
|
||||
expect(page).to have_link project.name_with_namespace
|
||||
should_see_todo(1, "John Doe assigned you merge request #{merge_request_reference}", merge_request.title)
|
||||
should_see_todo(2, "John Doe mentioned you on issue #{issue_reference}", "#{current_user.to_reference} Wdyt?")
|
||||
should_see_todo(3, "John Doe assigned you issue #{issue_reference}", issue.title)
|
||||
should_see_todo(4, "Mary Jane mentioned you on issue #{issue_reference}", issue.title)
|
||||
end
|
||||
|
||||
step 'I mark the todo as done' do
|
||||
page.within('.todo:nth-child(1)') do
|
||||
click_link 'Done'
|
||||
end
|
||||
|
||||
page.within('.todos-count') { expect(page).to have_content '3' }
|
||||
expect(page).to have_content 'To do 3'
|
||||
expect(page).to have_content 'Done 1'
|
||||
should_see_todo(1, "John Doe assigned you merge request #{merge_request.to_reference(full: true)}", merge_request.title, state: :done_reversible)
|
||||
end
|
||||
|
||||
step 'I mark all todos as done' do
|
||||
merge_request_reference = merge_request.to_reference(full: true)
|
||||
issue_reference = issue.to_reference(full: true)
|
||||
|
||||
find('.js-todos-mark-all').trigger('click')
|
||||
|
||||
page.within('.todos-count') { expect(page).to have_content '0' }
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content 'Done 4'
|
||||
expect(page).to have_content "You're all done!"
|
||||
expect('.prepend-top-default').not_to have_link project.name_with_namespace
|
||||
should_not_see_todo "John Doe assigned you merge request #{merge_request_reference}"
|
||||
should_not_see_todo "John Doe mentioned you on issue #{issue_reference}"
|
||||
should_not_see_todo "John Doe assigned you issue #{issue_reference}"
|
||||
should_not_see_todo "Mary Jane mentioned you on issue #{issue_reference}"
|
||||
end
|
||||
|
||||
step 'I should see the todo marked as done' do
|
||||
find('.todos-done a').trigger('click')
|
||||
|
||||
expect(page).to have_link project.name_with_namespace
|
||||
should_see_todo(1, "John Doe assigned you merge request #{merge_request.to_reference(full: true)}", merge_request.title, state: :done_irreversible)
|
||||
end
|
||||
|
||||
step 'I should see all todos marked as done' do
|
||||
merge_request_reference = merge_request.to_reference(full: true)
|
||||
issue_reference = issue.to_reference(full: true)
|
||||
|
||||
find('.todos-done a').trigger('click')
|
||||
|
||||
expect(page).to have_link project.name_with_namespace
|
||||
should_see_todo(1, "John Doe assigned you merge request #{merge_request_reference}", merge_request.title, state: :done_irreversible)
|
||||
should_see_todo(2, "John Doe mentioned you on issue #{issue_reference}", "#{current_user.to_reference} Wdyt?", state: :done_irreversible)
|
||||
should_see_todo(3, "John Doe assigned you issue #{issue_reference}", issue.title, state: :done_irreversible)
|
||||
should_see_todo(4, "Mary Jane mentioned you on issue #{issue_reference}", issue.title, state: :done_irreversible)
|
||||
end
|
||||
|
||||
step 'I filter by "Enterprise"' do
|
||||
click_button 'Project'
|
||||
page.within '.dropdown-menu-project' do
|
||||
click_link enterprise.name_with_namespace
|
||||
end
|
||||
end
|
||||
|
||||
step 'I filter by "John Doe"' do
|
||||
click_button 'Author'
|
||||
page.within '.dropdown-menu-author' do
|
||||
click_link john_doe.username
|
||||
end
|
||||
end
|
||||
|
||||
step 'I filter by "Issue"' do
|
||||
click_button 'Type'
|
||||
page.within '.dropdown-menu-type' do
|
||||
click_link 'Issue'
|
||||
end
|
||||
end
|
||||
|
||||
step 'I filter by "Mentioned"' do
|
||||
click_button 'Action'
|
||||
page.within '.dropdown-menu-action' do
|
||||
click_link 'Mentioned'
|
||||
end
|
||||
end
|
||||
|
||||
step 'I should not see todos' do
|
||||
expect(page).to have_content "You're all done!"
|
||||
end
|
||||
|
||||
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.to_reference(full: true)}"
|
||||
end
|
||||
|
||||
step 'I should not see todos related to "Merge Requests" in the list' do
|
||||
should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference(full: true)}"
|
||||
end
|
||||
|
||||
step 'I should not see todos related to "Assignments" in the list' do
|
||||
should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference(full: true)}"
|
||||
should_not_see_todo "John Doe assigned you issue #{issue.to_reference(full: true)}"
|
||||
end
|
||||
|
||||
step 'I click on the todo' do
|
||||
find('.todo:nth-child(1)').click
|
||||
end
|
||||
|
||||
step 'I should be directed to the corresponding page' do
|
||||
page.should have_css('.identifier', text: 'Merge request !1')
|
||||
# Merge request page loads and issues a number of Ajax requests
|
||||
wait_for_requests
|
||||
end
|
||||
|
||||
def should_see_todo(position, title, body, state: :pending)
|
||||
page.within(".todo:nth-child(#{position})") do
|
||||
expect(page).to have_content title
|
||||
expect(page).to have_content body
|
||||
|
||||
if state == :pending
|
||||
expect(page).to have_link 'Done'
|
||||
elsif state == :done_reversible
|
||||
expect(page).to have_link 'Undo'
|
||||
elsif state == :done_irreversible
|
||||
expect(page).not_to have_link 'Undo'
|
||||
expect(page).not_to have_link 'Done'
|
||||
else
|
||||
raise 'Invalid state given, valid states: :pending, :done_reversible, :done_irreversible'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def should_not_see_todo(title)
|
||||
expect(page).not_to have_visible_content title
|
||||
end
|
||||
|
||||
def have_visible_content(text)
|
||||
have_css('*', text: text, visible: true)
|
||||
end
|
||||
|
||||
def john_doe
|
||||
@john_doe ||= user_exists("John Doe", { username: "john_doe" })
|
||||
end
|
||||
|
||||
def mary_jane
|
||||
@mary_jane ||= user_exists("Mary Jane", { username: "mary_jane" })
|
||||
end
|
||||
|
||||
def enterprise
|
||||
@enterprise ||= Project.find_by(name: 'Enterprise')
|
||||
end
|
||||
|
||||
def issue
|
||||
@issue ||= create(:issue, assignees: [current_user], project: project)
|
||||
end
|
||||
|
||||
def merge_request
|
||||
@merge_request ||= create(:merge_request, assignee: current_user, source_project: project)
|
||||
end
|
||||
end
|
|
@ -112,10 +112,6 @@ module SharedPaths
|
|||
visit dashboard_groups_path
|
||||
end
|
||||
|
||||
step 'I visit dashboard todos page' do
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
step 'I should be redirected to the dashboard groups page' do
|
||||
expect(current_path).to eq dashboard_groups_path
|
||||
end
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
require 'rails_helper'
|
||||
|
||||
feature 'Todo target states', feature: true do
|
||||
feature 'Dashboard > Todo target states' do
|
||||
let(:user) { create(:user) }
|
||||
let(:author) { create(:user) }
|
||||
let(:project) { create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
|
||||
let(:project) { create(:project, :public) }
|
||||
|
||||
before do
|
||||
gitlab_sign_in user
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
scenario 'on a closed issue todo has closed label' do
|
||||
|
@ -30,7 +30,7 @@ feature 'Todo target states', feature: true do
|
|||
end
|
||||
|
||||
scenario 'on a merged merge request todo has merged label' do
|
||||
mr_merged = create(:merge_request, :simple, author: user, state: 'merged')
|
||||
mr_merged = create(:merge_request, :simple, :merged, author: user)
|
||||
create_todo mr_merged
|
||||
visit dashboard_todos_path
|
||||
|
||||
|
@ -40,7 +40,7 @@ feature 'Todo target states', feature: true do
|
|||
end
|
||||
|
||||
scenario 'on a closed merge request todo has closed label' do
|
||||
mr_closed = create(:merge_request, :simple, author: user, state: 'closed')
|
||||
mr_closed = create(:merge_request, :simple, :closed, author: user)
|
||||
create_todo mr_closed
|
||||
visit dashboard_todos_path
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe 'Dashboard > User filters todos', feature: true, js: true do
|
||||
feature 'Dashboard > User filters todos', js: true do
|
||||
let(:user_1) { create(:user, username: 'user_1', name: 'user_1') }
|
||||
let(:user_2) { create(:user, username: 'user_2', name: 'user_2') }
|
||||
|
||||
|
@ -17,7 +17,7 @@ describe 'Dashboard > User filters todos', feature: true, js: true do
|
|||
|
||||
project_1.team << [user_1, :developer]
|
||||
project_2.team << [user_1, :developer]
|
||||
gitlab_sign_in(user_1)
|
||||
sign_in(user_1)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
|
@ -34,7 +34,7 @@ describe 'Dashboard > User filters todos', feature: true, js: true do
|
|||
expect(page).not_to have_content project_2.name_with_namespace
|
||||
end
|
||||
|
||||
context "Author filter" do
|
||||
context 'Author filter' do
|
||||
it 'filters by author' do
|
||||
click_button 'Author'
|
||||
|
||||
|
@ -49,18 +49,18 @@ describe 'Dashboard > User filters todos', feature: true, js: true do
|
|||
expect(find('.todos-list')).not_to have_content 'issue'
|
||||
end
|
||||
|
||||
it "shows only authors of existing todos" do
|
||||
it 'shows only authors of existing todos' do
|
||||
click_button 'Author'
|
||||
|
||||
within '.dropdown-menu-author' do
|
||||
# It should contain two users + "Any Author"
|
||||
# It should contain two users + 'Any Author'
|
||||
expect(page).to have_selector('.dropdown-menu-user-link', count: 3)
|
||||
expect(page).to have_content(user_1.name)
|
||||
expect(page).to have_content(user_2.name)
|
||||
end
|
||||
end
|
||||
|
||||
it "shows only authors of existing done todos" do
|
||||
it 'shows only authors of existing done todos' do
|
||||
user_3 = create :user
|
||||
user_4 = create :user
|
||||
create(:todo, user: user_1, author: user_3, project: project_1, target: issue, action: 1, state: :done)
|
||||
|
@ -74,7 +74,7 @@ describe 'Dashboard > User filters todos', feature: true, js: true do
|
|||
click_button 'Author'
|
||||
|
||||
within '.dropdown-menu-author' do
|
||||
# It should contain two users + "Any Author"
|
||||
# It should contain two users + 'Any Author'
|
||||
expect(page).to have_selector('.dropdown-menu-user-link', count: 3)
|
||||
expect(page).to have_content(user_3.name)
|
||||
expect(page).to have_content(user_4.name)
|
|
@ -1,6 +1,6 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe "Dashboard > User sorts todos", feature: true do
|
||||
feature 'Dashboard > User sorts todos' do
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { create(:empty_project) }
|
||||
|
||||
|
@ -18,7 +18,7 @@ describe "Dashboard > User sorts todos", feature: true do
|
|||
let(:issue_3) { create(:issue, title: 'issue_3', project: project) }
|
||||
let(:issue_4) { create(:issue, title: 'issue_4', project: project) }
|
||||
|
||||
let!(:merge_request_1) { create(:merge_request, source_project: project, title: "merge_request_1") }
|
||||
let!(:merge_request_1) { create(:merge_request, source_project: project, title: 'merge_request_1') }
|
||||
|
||||
before do
|
||||
create(:todo, user: user, project: project, target: issue_4, created_at: 5.hours.ago)
|
||||
|
@ -32,41 +32,41 @@ describe "Dashboard > User sorts todos", feature: true do
|
|||
issue_2.labels << label_3
|
||||
issue_1.labels << label_2
|
||||
|
||||
gitlab_sign_in(user)
|
||||
sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it "sorts with oldest created todos first" do
|
||||
click_link "Last created"
|
||||
it 'sorts with oldest created todos first' do
|
||||
click_link 'Last created'
|
||||
|
||||
results_list = page.find('.todos-list')
|
||||
expect(results_list.all('p')[0]).to have_content("merge_request_1")
|
||||
expect(results_list.all('p')[1]).to have_content("issue_1")
|
||||
expect(results_list.all('p')[2]).to have_content("issue_3")
|
||||
expect(results_list.all('p')[3]).to have_content("issue_2")
|
||||
expect(results_list.all('p')[4]).to have_content("issue_4")
|
||||
expect(results_list.all('p')[0]).to have_content('merge_request_1')
|
||||
expect(results_list.all('p')[1]).to have_content('issue_1')
|
||||
expect(results_list.all('p')[2]).to have_content('issue_3')
|
||||
expect(results_list.all('p')[3]).to have_content('issue_2')
|
||||
expect(results_list.all('p')[4]).to have_content('issue_4')
|
||||
end
|
||||
|
||||
it "sorts with newest created todos first" do
|
||||
click_link "Oldest created"
|
||||
it 'sorts with newest created todos first' do
|
||||
click_link 'Oldest created'
|
||||
|
||||
results_list = page.find('.todos-list')
|
||||
expect(results_list.all('p')[0]).to have_content("issue_4")
|
||||
expect(results_list.all('p')[1]).to have_content("issue_2")
|
||||
expect(results_list.all('p')[2]).to have_content("issue_3")
|
||||
expect(results_list.all('p')[3]).to have_content("issue_1")
|
||||
expect(results_list.all('p')[4]).to have_content("merge_request_1")
|
||||
expect(results_list.all('p')[0]).to have_content('issue_4')
|
||||
expect(results_list.all('p')[1]).to have_content('issue_2')
|
||||
expect(results_list.all('p')[2]).to have_content('issue_3')
|
||||
expect(results_list.all('p')[3]).to have_content('issue_1')
|
||||
expect(results_list.all('p')[4]).to have_content('merge_request_1')
|
||||
end
|
||||
|
||||
it "sorts by label priority" do
|
||||
click_link "Label priority"
|
||||
it 'sorts by label priority' do
|
||||
click_link 'Label priority'
|
||||
|
||||
results_list = page.find('.todos-list')
|
||||
expect(results_list.all('p')[0]).to have_content("issue_3")
|
||||
expect(results_list.all('p')[1]).to have_content("merge_request_1")
|
||||
expect(results_list.all('p')[2]).to have_content("issue_1")
|
||||
expect(results_list.all('p')[3]).to have_content("issue_2")
|
||||
expect(results_list.all('p')[4]).to have_content("issue_4")
|
||||
expect(results_list.all('p')[0]).to have_content('issue_3')
|
||||
expect(results_list.all('p')[1]).to have_content('merge_request_1')
|
||||
expect(results_list.all('p')[2]).to have_content('issue_1')
|
||||
expect(results_list.all('p')[3]).to have_content('issue_2')
|
||||
expect(results_list.all('p')[4]).to have_content('issue_4')
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -88,12 +88,12 @@ describe "Dashboard > User sorts todos", feature: true do
|
|||
end
|
||||
|
||||
it "doesn't mix issues and merge requests label priorities" do
|
||||
click_link "Label priority"
|
||||
click_link 'Label priority'
|
||||
|
||||
results_list = page.find('.todos-list')
|
||||
expect(results_list.all('p')[0]).to have_content("issue_1")
|
||||
expect(results_list.all('p')[1]).to have_content("issue_2")
|
||||
expect(results_list.all('p')[2]).to have_content("merge_request_1")
|
||||
expect(results_list.all('p')[0]).to have_content('issue_1')
|
||||
expect(results_list.all('p')[1]).to have_content('issue_2')
|
||||
expect(results_list.all('p')[2]).to have_content('merge_request_1')
|
||||
end
|
||||
end
|
||||
end
|
355
spec/features/dashboard/todos/todos_spec.rb
Normal file
355
spec/features/dashboard/todos/todos_spec.rb
Normal file
|
@ -0,0 +1,355 @@
|
|||
require 'spec_helper'
|
||||
|
||||
feature 'Dashboard Todos' do
|
||||
let(:user) { create(:user) }
|
||||
let(:author) { create(:user) }
|
||||
let(:project) { create(:project, :public) }
|
||||
let(:issue) { create(:issue, due_date: Date.today) }
|
||||
|
||||
context 'User does not have todos' do
|
||||
before do
|
||||
sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows "All done" message' do
|
||||
expect(page).to have_content 'Todos let you see what you should do next.'
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has a todo', js: true do
|
||||
before do
|
||||
create(:todo, :mentioned, user: user, project: project, target: issue, author: author)
|
||||
sign_in(user)
|
||||
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'has todo present' do
|
||||
expect(page).to have_selector('.todos-list .todo', count: 1)
|
||||
end
|
||||
|
||||
it 'shows due date as today' do
|
||||
within first('.todo') do
|
||||
expect(page).to have_content 'Due today'
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'deleting the todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Done'
|
||||
end
|
||||
end
|
||||
|
||||
it 'is marked as done-reversible in the list' do
|
||||
expect(page).to have_selector('.todos-list .todo.todo-pending.done-reversible')
|
||||
end
|
||||
|
||||
it 'shows Undo button' do
|
||||
expect(page).to have_selector('.js-undo-todo', visible: true)
|
||||
expect(page).to have_selector('.js-done-todo', visible: false)
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content 'Done 1'
|
||||
end
|
||||
|
||||
it 'has not "All done" message' do
|
||||
expect(page).not_to have_selector('.todos-all-done')
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'deleting and restoring the todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Done'
|
||||
wait_for_requests
|
||||
click_link 'Undo'
|
||||
end
|
||||
end
|
||||
|
||||
it 'is marked back as pending in the list' do
|
||||
expect(page).not_to have_selector('.todos-list .todo.todo-pending.done-reversible')
|
||||
expect(page).to have_selector('.todos-list .todo.todo-pending')
|
||||
end
|
||||
|
||||
it 'shows Done button' do
|
||||
expect(page).to have_selector('.js-undo-todo', visible: false)
|
||||
expect(page).to have_selector('.js-done-todo', visible: true)
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
expect(page).to have_content 'To do 1'
|
||||
expect(page).to have_content 'Done 0'
|
||||
end
|
||||
end
|
||||
|
||||
it_behaves_like 'deleting the todo'
|
||||
it_behaves_like 'deleting and restoring the todo'
|
||||
|
||||
context 'todo is stale on the page' do
|
||||
before do
|
||||
todos = TodosFinder.new(user, state: :pending).execute
|
||||
TodoService.new.mark_todos_as_done(todos, user)
|
||||
end
|
||||
|
||||
it_behaves_like 'deleting the todo'
|
||||
it_behaves_like 'deleting and restoring the todo'
|
||||
end
|
||||
end
|
||||
|
||||
context 'User created todos for themself' do
|
||||
before do
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
context 'issue assigned todo' do
|
||||
before do
|
||||
create(:todo, :assigned, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows issue assigned to yourself message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You assigned issue #{issue.to_reference(full: true)} to yourself")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'marked todo' do
|
||||
before do
|
||||
create(:todo, :marked, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you added a todo message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You added a todo for issue #{issue.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'mentioned todo' do
|
||||
before do
|
||||
create(:todo, :mentioned, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you mentioned yourself message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You mentioned yourself on issue #{issue.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'directly_addressed todo' do
|
||||
before do
|
||||
create(:todo, :directly_addressed, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you directly addressed yourself message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You directly addressed yourself on issue #{issue.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'approval todo' do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
|
||||
before do
|
||||
create(:todo, :approval_required, user: user, project: project, target: merge_request, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you set yourself as an approver message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You set yourself as an approver for merge request #{merge_request.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has done todos', js: true do
|
||||
before do
|
||||
create(:todo, :mentioned, :done, user: user, project: project, target: issue, author: author)
|
||||
sign_in(user)
|
||||
visit dashboard_todos_path(state: :done)
|
||||
end
|
||||
|
||||
it 'has the done todo present' do
|
||||
expect(page).to have_selector('.todos-list .todo.todo-done', count: 1)
|
||||
end
|
||||
|
||||
describe 'restoring the todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Add todo'
|
||||
end
|
||||
end
|
||||
|
||||
it 'is removed from the list' do
|
||||
expect(page).not_to have_selector('.todos-list .todo.todo-done')
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
expect(page).to have_content 'To do 1'
|
||||
expect(page).to have_content 'Done 0'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has Todos with labels spanning multiple projects' do
|
||||
before do
|
||||
label1 = create(:label, project: project)
|
||||
note1 = create(:note_on_issue, note: "Hello #{label1.to_reference(format: :name)}", noteable_id: issue.id, noteable_type: 'Issue', project: issue.project)
|
||||
create(:todo, :mentioned, project: project, target: issue, user: user, note_id: note1.id)
|
||||
|
||||
project2 = create(:project, :public)
|
||||
label2 = create(:label, project: project2)
|
||||
issue2 = create(:issue, project: project2)
|
||||
note2 = create(:note_on_issue, note: "Test #{label2.to_reference(format: :name)}", noteable_id: issue2.id, noteable_type: 'Issue', project: project2)
|
||||
create(:todo, :mentioned, project: project2, target: issue2, user: user, note_id: note2.id)
|
||||
|
||||
gitlab_sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows page with two Todos' do
|
||||
expect(page).to have_selector('.todos-list .todo', count: 2)
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has multiple pages of Todos' do
|
||||
before do
|
||||
allow(Todo).to receive(:default_per_page).and_return(1)
|
||||
|
||||
# Create just enough records to cause us to paginate
|
||||
create_list(:todo, 2, :mentioned, user: user, project: project, target: issue, author: author)
|
||||
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
it 'is paginated' do
|
||||
visit dashboard_todos_path
|
||||
|
||||
expect(page).to have_selector('.gl-pagination')
|
||||
end
|
||||
|
||||
it 'is has the right number of pages' do
|
||||
visit dashboard_todos_path
|
||||
|
||||
expect(page).to have_selector('.gl-pagination .page', count: 2)
|
||||
end
|
||||
|
||||
describe 'mark all as done', js: true do
|
||||
before do
|
||||
visit dashboard_todos_path
|
||||
find('.js-todos-mark-all').trigger('click')
|
||||
end
|
||||
|
||||
it 'shows "All done" message!' do
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content "You're all done!"
|
||||
expect(page).not_to have_selector('.gl-pagination')
|
||||
end
|
||||
|
||||
it 'shows "Undo mark all as done" button' do
|
||||
expect(page).to have_selector('.js-todos-mark-all', visible: false)
|
||||
expect(page).to have_selector('.js-todos-undo-all', visible: true)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'undo mark all as done', js: true do
|
||||
before do
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows the restored todo list' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_selector('.todos-list .todo', count: 1)
|
||||
expect(page).to have_selector('.gl-pagination')
|
||||
expect(page).not_to have_content "You're all done!"
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_content 'To do 2'
|
||||
expect(page).to have_content 'Done 0'
|
||||
end
|
||||
|
||||
it 'shows "Mark all as done" button' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_selector('.js-todos-mark-all', visible: true)
|
||||
expect(page).to have_selector('.js-todos-undo-all', visible: false)
|
||||
end
|
||||
|
||||
context 'User has deleted a todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Done'
|
||||
end
|
||||
end
|
||||
|
||||
it 'shows the restored todo list with the deleted todo' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_selector('.todos-list .todo.todo-pending', count: 1)
|
||||
end
|
||||
end
|
||||
|
||||
def mark_all_and_undo
|
||||
find('.js-todos-mark-all').trigger('click')
|
||||
wait_for_requests
|
||||
find('.js-todos-undo-all').trigger('click')
|
||||
wait_for_requests
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has a Todo in a project pending deletion' do
|
||||
before do
|
||||
deleted_project = create(:project, :public, pending_delete: true)
|
||||
create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author)
|
||||
create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author, state: :done)
|
||||
sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows "All done" message' do
|
||||
within('.todos-count') { expect(page).to have_content '0' }
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content 'Done 0'
|
||||
expect(page).to have_selector('.todos-all-done', count: 1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has a Build Failed todo' do
|
||||
let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: author) }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows the todo' do
|
||||
expect(page).to have_content 'The build failed for merge request'
|
||||
end
|
||||
|
||||
it 'links to the pipelines for the merge request' do
|
||||
href = pipelines_namespace_project_merge_request_path(project.namespace, project, todo.target)
|
||||
|
||||
expect(page).to have_link "merge request #{todo.target.to_reference(full: true)}", href
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,355 +0,0 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe 'Dashboard Todos', feature: true do
|
||||
let(:user) { create(:user) }
|
||||
let(:author) { create(:user) }
|
||||
let(:project) { create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
|
||||
let(:issue) { create(:issue, due_date: Date.today) }
|
||||
|
||||
describe 'GET /dashboard/todos' do
|
||||
context 'User does not have todos' do
|
||||
before do
|
||||
gitlab_sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
it 'shows "All done" message' do
|
||||
expect(page).to have_content "Todos let you see what you should do next."
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has a todo', js: true do
|
||||
before do
|
||||
create(:todo, :mentioned, user: user, project: project, target: issue, author: author)
|
||||
gitlab_sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'has todo present' do
|
||||
expect(page).to have_selector('.todos-list .todo', count: 1)
|
||||
end
|
||||
|
||||
it 'shows due date as today' do
|
||||
within first('.todo') do
|
||||
expect(page).to have_content 'Due today'
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'deleting the todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Done'
|
||||
end
|
||||
end
|
||||
|
||||
it 'is marked as done-reversible in the list' do
|
||||
expect(page).to have_selector('.todos-list .todo.todo-pending.done-reversible')
|
||||
end
|
||||
|
||||
it 'shows Undo button' do
|
||||
expect(page).to have_selector('.js-undo-todo', visible: true)
|
||||
expect(page).to have_selector('.js-done-todo', visible: false)
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content 'Done 1'
|
||||
end
|
||||
|
||||
it 'has not "All done" message' do
|
||||
expect(page).not_to have_selector('.todos-all-done')
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'deleting and restoring the todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Done'
|
||||
wait_for_requests
|
||||
click_link 'Undo'
|
||||
end
|
||||
end
|
||||
|
||||
it 'is marked back as pending in the list' do
|
||||
expect(page).not_to have_selector('.todos-list .todo.todo-pending.done-reversible')
|
||||
expect(page).to have_selector('.todos-list .todo.todo-pending')
|
||||
end
|
||||
|
||||
it 'shows Done button' do
|
||||
expect(page).to have_selector('.js-undo-todo', visible: false)
|
||||
expect(page).to have_selector('.js-done-todo', visible: true)
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
expect(page).to have_content 'To do 1'
|
||||
expect(page).to have_content 'Done 0'
|
||||
end
|
||||
end
|
||||
|
||||
it_behaves_like 'deleting the todo'
|
||||
it_behaves_like 'deleting and restoring the todo'
|
||||
|
||||
context 'todo is stale on the page' do
|
||||
before do
|
||||
todos = TodosFinder.new(user, state: :pending).execute
|
||||
TodoService.new.mark_todos_as_done(todos, user)
|
||||
end
|
||||
|
||||
it_behaves_like 'deleting the todo'
|
||||
it_behaves_like 'deleting and restoring the todo'
|
||||
end
|
||||
end
|
||||
|
||||
context 'User created todos for themself' do
|
||||
before do
|
||||
gitlab_sign_in(user)
|
||||
end
|
||||
|
||||
context 'issue assigned todo' do
|
||||
before do
|
||||
create(:todo, :assigned, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows issue assigned to yourself message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You assigned issue #{issue.to_reference(full: true)} to yourself")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'marked todo' do
|
||||
before do
|
||||
create(:todo, :marked, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you added a todo message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You added a todo for issue #{issue.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'mentioned todo' do
|
||||
before do
|
||||
create(:todo, :mentioned, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you mentioned yourself message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You mentioned yourself on issue #{issue.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'directly_addressed todo' do
|
||||
before do
|
||||
create(:todo, :directly_addressed, user: user, project: project, target: issue, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you directly addressed yourself message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You directly addressed yourself on issue #{issue.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'approval todo' do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
|
||||
before do
|
||||
create(:todo, :approval_required, user: user, project: project, target: merge_request, author: user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows you set yourself as an approver message' do
|
||||
page.within('.js-todos-all') do
|
||||
expect(page).to have_content("You set yourself as an approver for merge request #{merge_request.to_reference(full: true)}")
|
||||
expect(page).not_to have_content('to yourself')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has done todos', js: true do
|
||||
before do
|
||||
create(:todo, :mentioned, :done, user: user, project: project, target: issue, author: author)
|
||||
gitlab_sign_in(user)
|
||||
visit dashboard_todos_path(state: :done)
|
||||
end
|
||||
|
||||
it 'has the done todo present' do
|
||||
expect(page).to have_selector('.todos-list .todo.todo-done', count: 1)
|
||||
end
|
||||
|
||||
describe 'restoring the todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Add todo'
|
||||
end
|
||||
end
|
||||
|
||||
it 'is removed from the list' do
|
||||
expect(page).not_to have_selector('.todos-list .todo.todo-done')
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
expect(page).to have_content 'To do 1'
|
||||
expect(page).to have_content 'Done 0'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has Todos with labels spanning multiple projects' do
|
||||
before do
|
||||
label1 = create(:label, project: project)
|
||||
note1 = create(:note_on_issue, note: "Hello #{label1.to_reference(format: :name)}", noteable_id: issue.id, noteable_type: 'Issue', project: issue.project)
|
||||
create(:todo, :mentioned, project: project, target: issue, user: user, note_id: note1.id)
|
||||
|
||||
project2 = create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC)
|
||||
label2 = create(:label, project: project2)
|
||||
issue2 = create(:issue, project: project2)
|
||||
note2 = create(:note_on_issue, note: "Test #{label2.to_reference(format: :name)}", noteable_id: issue2.id, noteable_type: 'Issue', project: project2)
|
||||
create(:todo, :mentioned, project: project2, target: issue2, user: user, note_id: note2.id)
|
||||
|
||||
gitlab_sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows page with two Todos' do
|
||||
expect(page).to have_selector('.todos-list .todo', count: 2)
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has multiple pages of Todos' do
|
||||
before do
|
||||
allow(Todo).to receive(:default_per_page).and_return(1)
|
||||
|
||||
# Create just enough records to cause us to paginate
|
||||
create_list(:todo, 2, :mentioned, user: user, project: project, target: issue, author: author)
|
||||
|
||||
gitlab_sign_in(user)
|
||||
end
|
||||
|
||||
it 'is paginated' do
|
||||
visit dashboard_todos_path
|
||||
|
||||
expect(page).to have_selector('.gl-pagination')
|
||||
end
|
||||
|
||||
it 'is has the right number of pages' do
|
||||
visit dashboard_todos_path
|
||||
|
||||
expect(page).to have_selector('.gl-pagination .page', count: 2)
|
||||
end
|
||||
|
||||
describe 'mark all as done', js: true do
|
||||
before do
|
||||
visit dashboard_todos_path
|
||||
find('.js-todos-mark-all').trigger('click')
|
||||
end
|
||||
|
||||
it 'shows "All done" message!' do
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content "You're all done!"
|
||||
expect(page).not_to have_selector('.gl-pagination')
|
||||
end
|
||||
|
||||
it 'shows "Undo mark all as done" button' do
|
||||
expect(page).to have_selector('.js-todos-mark-all', visible: false)
|
||||
expect(page).to have_selector('.js-todos-undo-all', visible: true)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'undo mark all as done', js: true do
|
||||
before do
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows the restored todo list' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_selector('.todos-list .todo', count: 1)
|
||||
expect(page).to have_selector('.gl-pagination')
|
||||
expect(page).not_to have_content "You're all done!"
|
||||
end
|
||||
|
||||
it 'updates todo count' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_content 'To do 2'
|
||||
expect(page).to have_content 'Done 0'
|
||||
end
|
||||
|
||||
it 'shows "Mark all as done" button' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_selector('.js-todos-mark-all', visible: true)
|
||||
expect(page).to have_selector('.js-todos-undo-all', visible: false)
|
||||
end
|
||||
|
||||
context 'User has deleted a todo' do
|
||||
before do
|
||||
within first('.todo') do
|
||||
click_link 'Done'
|
||||
end
|
||||
end
|
||||
|
||||
it 'shows the restored todo list with the deleted todo' do
|
||||
mark_all_and_undo
|
||||
|
||||
expect(page).to have_selector('.todos-list .todo.todo-pending', count: 1)
|
||||
end
|
||||
end
|
||||
|
||||
def mark_all_and_undo
|
||||
find('.js-todos-mark-all').trigger('click')
|
||||
wait_for_requests
|
||||
find('.js-todos-undo-all').trigger('click')
|
||||
wait_for_requests
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has a Todo in a project pending deletion' do
|
||||
before do
|
||||
deleted_project = create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC, pending_delete: true)
|
||||
create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author)
|
||||
create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author, state: :done)
|
||||
gitlab_sign_in(user)
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows "All done" message' do
|
||||
within('.todos-count') { expect(page).to have_content '0' }
|
||||
expect(page).to have_content 'To do 0'
|
||||
expect(page).to have_content 'Done 0'
|
||||
expect(page).to have_selector('.todos-all-done', count: 1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'User has a Build Failed todo' do
|
||||
let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: author) }
|
||||
|
||||
before do
|
||||
gitlab_sign_in user
|
||||
visit dashboard_todos_path
|
||||
end
|
||||
|
||||
it 'shows the todo' do
|
||||
expect(page).to have_content 'The build failed for merge request'
|
||||
end
|
||||
|
||||
it 'links to the pipelines for the merge request' do
|
||||
href = pipelines_namespace_project_merge_request_path(project.namespace, project, todo.target)
|
||||
|
||||
expect(page).to have_link "merge request #{todo.target.to_reference(full: true)}", href
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue