Commit 1df5380e authored by Rémy Coutable's avatar Rémy Coutable

Merge branch '23036-replace-dashboard-spinach' into 'master'

Replaces dashboard/dashboard.feature spinach with rspec

See merge request !12876
parents 55b98134 1c84f668
---
title: Replaces dashboard/dashboard.feature spinach with rspec
merge_request: 12876
author: Alexander Randa (@randaalex)
@dashboard
Feature: Dashboard
Background:
Given I sign in as a user
And I own project "Shop"
And project "Shop" has push event
And project "Shop" has CI enabled
And project "Shop" has CI build
And project "Shop" has labels: "bug", "feature", "enhancement"
And project "Shop" has issue: "bug report"
And I visit dashboard page
Scenario: I should see projects list
Then I should see "New Project" link
Then I should see "Shop" project link
Then I should see "Shop" project CI status
@javascript
Scenario: I should see activity list
And I visit dashboard activity page
Then I should see project "Shop" activity feed
Scenario: I should see groups list
Given I have group with projects
And I visit dashboard page
Then I should see groups list
@javascript
Scenario: I should see last push widget
Then I should see last push widget
And I click "Create Merge Request" link
Then I see prefilled new Merge Request page
@javascript
Scenario: Sorting Issues
Given I visit dashboard issues page
And I sort the list by "Oldest updated"
And I visit dashboard activity page
And I visit dashboard issues page
Then The list should be sorted by "Oldest updated"
@javascript
Scenario: Filtering Issues by label
Given project "Shop" has issue "Bugfix1" with label "feature"
When I visit dashboard issues page
And I filter the list by label "feature"
Then I should see "Bugfix1" in issues list
@javascript
Scenario: Visiting Project's issues after sorting
Given I visit dashboard issues page
And I sort the list by "Oldest updated"
And I visit project "Shop" issues page
Then The list should be sorted by "Oldest updated"
@javascript
Scenario: Sorting Merge Requests
Given I visit dashboard merge requests page
And I sort the list by "Oldest updated"
And I visit dashboard activity page
And I visit dashboard merge requests page
Then The list should be sorted by "Oldest updated"
@javascript
Scenario: Visiting Project's merge requests after sorting
Given project "Shop" has a "Bugfix MR" merge request open
And I visit dashboard merge requests page
And I sort the list by "Oldest updated"
And I visit project "Shop" merge requests page
Then The list should be sorted by "Oldest updated"
class Spinach::Features::Dashboard < Spinach::FeatureSteps
include SharedAuthentication
include SharedPaths
include SharedProject
include SharedIssuable
step 'I should see "New Project" link' do
expect(page).to have_link "New project"
end
step 'I should see "Shop" project link' do
expect(page).to have_link "Shop"
end
step 'I should see "Shop" project CI status' do
expect(page).to have_link "Commit: skipped"
end
step 'I should see last push widget' do
expect(page).to have_content "You pushed to fix"
expect(page).to have_link "Create merge request"
end
step 'I click "Create merge request" link' do
find_link("Create merge request", visible: false).trigger('click')
end
step 'I see prefilled new Merge Request page' do
expect(page).to have_selector('.merge-request-form')
expect(current_path).to eq project_new_merge_request_path(@project)
expect(find("#merge_request_target_project_id").value).to eq @project.id.to_s
expect(find("input#merge_request_source_branch").value).to eq "fix"
expect(find("input#merge_request_target_branch").value).to eq "master"
end
step 'I have group with projects' do
@group = create(:group)
@project = create(:empty_project, namespace: @group)
@event = create(:closed_issue_event, project: @project)
@project.team << [current_user, :master]
end
step 'I should see projects list' do
@user.authorized_projects.all.each do |project|
expect(page).to have_link project.name_with_namespace
end
end
step 'I should see groups list' do
Group.all.each do |group|
expect(page).to have_link group.name
end
end
step 'group has a projects that does not belongs to me' do
@forbidden_project1 = create(:empty_project, group: @group)
@forbidden_project2 = create(:empty_project, group: @group)
end
step 'I should see 1 project at group list' do
expect(find('span.last_activity/span')).to have_content('1')
end
step 'I filter the list by label "feature"' do
page.within ".labels-filter" do
find('.dropdown').click
click_link "feature"
end
end
step 'I should see "Bugfix1" in issues list' do
page.within "ul.content-list" do
expect(page).to have_content "Bugfix1"
end
end
step 'project "Shop" has issue "Bugfix1" with label "feature"' do
project = Project.find_by(name: "Shop")
issue = create(:issue, title: "Bugfix1", project: project, assignees: [current_user])
issue.labels << project.labels.find_by(title: 'feature')
end
end
...@@ -239,11 +239,6 @@ module SharedProject ...@@ -239,11 +239,6 @@ module SharedProject
create(:label, project: project, title: 'enhancement') create(:label, project: project, title: 'enhancement')
end end
step 'project "Shop" has issue: "bug report"' do
project = Project.find_by(name: "Shop")
create(:issue, project: project, title: "bug report")
end
step 'project "Shop" has CI enabled' do step 'project "Shop" has CI enabled' do
project = Project.find_by(name: "Shop") project = Project.find_by(name: "Shop")
project.enable_ci project.enable_ci
......
require 'spec_helper' require 'spec_helper'
describe 'Dashboard Groups page', js: true, feature: true do feature 'Dashboard Groups page', :js do
let!(:user) { create :user } let!(:user) { create :user }
let!(:group) { create(:group) } let!(:group) { create(:group) }
let!(:nested_group) { create(:group, :nested) } let!(:nested_group) { create(:group, :nested) }
...@@ -41,7 +41,7 @@ describe 'Dashboard Groups page', js: true, feature: true do ...@@ -41,7 +41,7 @@ describe 'Dashboard Groups page', js: true, feature: true do
fill_in 'filter_groups', with: group.name fill_in 'filter_groups', with: group.name
wait_for_requests wait_for_requests
fill_in 'filter_groups', with: "" fill_in 'filter_groups', with: ''
wait_for_requests wait_for_requests
expect(page).to have_content(group.full_name) expect(page).to have_content(group.full_name)
......
require 'spec_helper' require 'spec_helper'
describe "Dashboard Issues filtering", feature: true, js: true do feature 'Dashboard Issues filtering', js: true do
include SortingHelper
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:empty_project) } let(:project) { create(:empty_project) }
let(:milestone) { create(:milestone, project: project) } let(:milestone) { create(:milestone, project: project) }
context 'filtering by milestone' do let!(:issue) { create(:issue, project: project, author: user, assignees: [user]) }
let!(:issue2) { create(:issue, project: project, author: user, assignees: [user], milestone: milestone) }
before do before do
project.team << [user, :master] project.add_master(user)
sign_in(user) sign_in(user)
create(:issue, project: project, author: user, assignees: [user])
create(:issue, project: project, author: user, assignees: [user], milestone: milestone)
visit_issues visit_issues
end end
context 'filtering by milestone' do
it 'shows all issues with no milestone' do it 'shows all issues with no milestone' do
show_milestone_dropdown show_milestone_dropdown
...@@ -62,6 +64,46 @@ describe "Dashboard Issues filtering", feature: true, js: true do ...@@ -62,6 +64,46 @@ describe "Dashboard Issues filtering", feature: true, js: true do
end end
end end
context 'filtering by label' do
let(:label) { create(:label, project: project) }
let!(:label_link) { create(:label_link, label: label, target: issue) }
it 'shows all issues without filter' do
page.within 'ul.content-list' do
expect(page).to have_content issue.title
expect(page).to have_content issue2.title
end
end
it 'shows all issues with the selected label' do
page.within '.labels-filter' do
find('.dropdown').click
click_link label.title
end
page.within 'ul.content-list' do
expect(page).to have_content issue.title
expect(page).not_to have_content issue2.title
end
end
end
context 'sorting' do
it 'shows sorted issues' do
sorting_by('Oldest updated')
visit_issues
expect(find('.issues-filters')).to have_content('Oldest updated')
end
it 'keeps sorting issues after visiting Projects Issues page' do
sorting_by('Oldest updated')
visit project_issues_path(project)
expect(find('.issues-filters')).to have_content('Oldest updated')
end
end
def show_milestone_dropdown def show_milestone_dropdown
click_button 'Milestone' click_button 'Milestone'
expect(page).to have_selector('.dropdown-content', visible: true) expect(page).to have_selector('.dropdown-content', visible: true)
......
...@@ -2,6 +2,7 @@ require 'spec_helper' ...@@ -2,6 +2,7 @@ require 'spec_helper'
feature 'Dashboard Merge Requests' do feature 'Dashboard Merge Requests' do
include FilterItemSelectHelper include FilterItemSelectHelper
include SortingHelper
let(:current_user) { create :user } let(:current_user) { create :user }
let(:project) { create(:empty_project) } let(:project) { create(:empty_project) }
...@@ -109,5 +110,21 @@ feature 'Dashboard Merge Requests' do ...@@ -109,5 +110,21 @@ feature 'Dashboard Merge Requests' do
expect(page).to have_content(assigned_merge_request_from_fork.title) expect(page).to have_content(assigned_merge_request_from_fork.title)
expect(page).to have_content(other_merge_request.title) expect(page).to have_content(other_merge_request.title)
end end
it 'shows sorted merge requests' do
sorting_by('Oldest updated')
visit merge_requests_dashboard_path(assignee_id: current_user.id)
expect(find('.issues-filters')).to have_content('Oldest updated')
end
it 'keeps sorting merge requests after visiting Projects MR page' do
sorting_by('Oldest updated')
visit project_merge_requests_path(project)
expect(find('.issues-filters')).to have_content('Oldest updated')
end
end end
end end
...@@ -61,7 +61,7 @@ feature 'Dashboard Projects' do ...@@ -61,7 +61,7 @@ feature 'Dashboard Projects' do
end end
end end
describe "with a pipeline", clean_gitlab_redis_shared_state: true do describe 'with a pipeline', clean_gitlab_redis_shared_state: true do
let(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit.sha) } let(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit.sha) }
before do before do
...@@ -74,7 +74,50 @@ feature 'Dashboard Projects' do ...@@ -74,7 +74,50 @@ feature 'Dashboard Projects' do
it 'shows that the last pipeline passed' do it 'shows that the last pipeline passed' do
visit dashboard_projects_path visit dashboard_projects_path
page.within('.controls') do
expect(page).to have_xpath("//a[@href='#{pipelines_project_commit_path(project, project.commit)}']") expect(page).to have_xpath("//a[@href='#{pipelines_project_commit_path(project, project.commit)}']")
expect(page).to have_css('.ci-status-link')
expect(page).to have_css('.ci-status-icon-success')
expect(page).to have_link('Commit: passed')
end
end
end
context 'last push widget' do
let(:push_event_data) do
{
before: Gitlab::Git::BLANK_SHA,
after: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e',
ref: 'refs/heads/feature',
user_id: user.id,
user_name: user.name,
repository: {
name: project.name,
url: 'localhost/rubinius',
description: '',
homepage: 'localhost/rubinius',
private: true
}
}
end
let!(:push_event) { create(:event, :pushed, data: push_event_data, project: project, author: user) }
before do
visit dashboard_projects_path
end
scenario 'shows "Create merge request" button' do
expect(page).to have_content 'You pushed to feature'
within('#content-body') do
find_link('Create merge request', visible: false).click
end
expect(page).to have_selector('.merge-request-form')
expect(current_path).to eq project_new_merge_request_path(project)
expect(find('#merge_request_target_project_id').value).to eq project.id.to_s
expect(find('input#merge_request_source_branch').value).to eq 'feature'
expect(find('input#merge_request_target_branch').value).to eq 'master'
end end
end end
end end
require 'spec_helper' require 'spec_helper'
feature 'Merge Request button', feature: true do feature 'Merge Request button' do
shared_examples 'Merge request button only shown when allowed' do shared_examples 'Merge request button only shown when allowed' do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project, :public) } let(:project) { create(:project, :public) }
...@@ -10,16 +10,14 @@ feature 'Merge Request button', feature: true do ...@@ -10,16 +10,14 @@ feature 'Merge Request button', feature: true do
it 'does not show Create merge request button' do it 'does not show Create merge request button' do
visit url visit url
within("#content-body") do
expect(page).not_to have_link(label) expect(page).not_to have_link(label)
end end
end end
end
context 'logged in as developer' do context 'logged in as developer' do
before do before do
sign_in(user) sign_in(user)
project.team << [user, :developer] project.add_developer(user)
end end
it 'shows Create merge request button' do it 'shows Create merge request button' do
...@@ -29,7 +27,7 @@ feature 'Merge Request button', feature: true do ...@@ -29,7 +27,7 @@ feature 'Merge Request button', feature: true do
visit url visit url
within("#content-body") do within('#content-body') do
expect(page).to have_link(label, href: href) expect(page).to have_link(label, href: href)
end end
end end
...@@ -42,7 +40,7 @@ feature 'Merge Request button', feature: true do ...@@ -42,7 +40,7 @@ feature 'Merge Request button', feature: true do
it 'does not show Create merge request button' do it 'does not show Create merge request button' do
visit url visit url
within("#content-body") do within('#content-body') do
expect(page).not_to have_link(label) expect(page).not_to have_link(label)
end end
end end
...@@ -57,7 +55,7 @@ feature 'Merge Request button', feature: true do ...@@ -57,7 +55,7 @@ feature 'Merge Request button', feature: true do
it 'does not show Create merge request button' do it 'does not show Create merge request button' do
visit url visit url
within("#content-body") do within('#content-body') do
expect(page).not_to have_link(label) expect(page).not_to have_link(label)
end end
end end
......
# Helper allows you to sort items
#
# Params
# value - value for sorting
#
# Usage:
# include SortingHelper
#
# sorting_by('Oldest updated')
#
module SortingHelper
def sorting_by(value)
find('button.dropdown-toggle').click
page.within('.content ul.dropdown-menu.dropdown-menu-align-right li') do
click_link value
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment