Skip to content
Snippets Groups Projects
Commit 2d54dfb2 authored by Rémy Coutable's avatar Rémy Coutable Committed by Robert Speicher
Browse files

Migrate features/project/project.feature to RSpec and reorganize several Project feature specs


Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent ffc9a470
No related branches found
No related tags found
No related merge requests found
Showing
with 88 additions and 520 deletions
Feature: Project
Background:
Given I sign in as a user
And I own project "Shop"
And project "Shop" has push event
And I visit project "Shop" page
Scenario: I edit the project avatar
Given I visit edit project "Shop" page
When I change the project avatar
And I should see new project avatar
And I should see the "Remove avatar" button
Scenario: I remove the project avatar
Given I visit edit project "Shop" page
And I have an project avatar
When I remove my project avatar
Then I should see the default project avatar
And I should not see the "Remove avatar" button
@javascript
Scenario: I should have readme on page
And I visit project "Shop" page
Then I should see project "Shop" README
Scenario: I should see last commit with CI
Given project "Shop" has CI enabled
Given project "Shop" has CI build
And I visit project "Shop" page
And I should see last commit with CI status
@javascript
Scenario: I should see project activity
When I visit project "Shop" activity page
Then I should see project "Shop" activity feed
Scenario: I visit edit project
When I visit edit project "Shop" page
Then I should see project settings
Scenario: I edit project
When I visit edit project "Shop" page
And change project settings
And I save project
Then I should see project with new settings
Scenario: I change project path
When I visit edit project "Shop" page
And change project path settings
Then I should see project with new path settings
Scenario: I should change project default branch
When I visit edit project "Shop" page
And change project default branch
And I save project
Then I should see project default branch changed
Scenario: I tag a project
When I visit edit project "Shop" page
Then I should see project settings
And I add project tags
And I save project
Then I should see project tags
Scenario: I should not see "New Issue" or "New Merge Request" buttons
Given I disable issues and merge requests in project
When I visit project "Shop" page
Then I should not see "New Issue" button
And I should not see "New Merge Request" button
Scenario: I should not see Project snippets
Given I disable snippets in project
When I visit project "Shop" page
Then I should not see "Snippets" button
@javascript
Scenario: I edit Project Notifications
Given I click notifications drop down button
When I choose Mention setting
Then I should see Notification saved message
Scenario: I should see command line instructions
Given I own an empty project
And I visit my empty project page
And I create bare repo
Then I should see command line instructions
class Spinach::Features::Project < Spinach::FeatureSteps
include SharedAuthentication
include SharedProject
include SharedPaths
include WaitForRequests
step 'change project settings' do
fill_in 'project_name_edit', with: 'NewName'
end
step 'I save project' do
page.within '.general-settings' do
click_button 'Save changes'
end
end
step 'I should see project with new settings' do
expect(find_field('project_name').value).to eq 'NewName'
end
step 'change project path settings' do
fill_in 'project_path', with: 'new-path'
click_button 'Rename'
end
step 'I should see project with new path settings' do
expect(project.path).to eq 'new-path'
end
step 'I change the project avatar' do
attach_file(
:project_avatar,
File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
)
page.within '.general-settings' do
click_button 'Save changes'
end
@project.reload
end
step 'I should see new project avatar' do
expect(@project.avatar).to be_instance_of AvatarUploader
url = @project.avatar.url
expect(url).to eq "/uploads/-/system/project/avatar/#{@project.id}/banana_sample.gif"
end
step 'I should see the "Remove avatar" button' do
expect(page).to have_link('Remove avatar')
end
step 'I have an project avatar' do
attach_file(
:project_avatar,
File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
)
page.within '.general-settings' do
click_button 'Save changes'
end
@project.reload
end
step 'I remove my project avatar' do
click_link 'Remove avatar'
@project.reload
end
step 'I should see the default project avatar' do
expect(@project.avatar?).to eq false
end
step 'I should not see the "Remove avatar" button' do
expect(page).not_to have_link('Remove avatar')
end
step 'change project default branch' do
select 'fix', from: 'project_default_branch'
page.within '.general-settings' do
click_button 'Save changes'
end
end
step 'I should see project default branch changed' do
expect(find(:css, 'select#project_default_branch').value).to eq 'fix'
end
step 'I select project "Forum" README tab' do
click_link 'Readme'
end
step 'I should see project "Forum" README' do
page.within('.readme-holder') do
expect(page).to have_content 'Sample repo for testing gitlab features'
end
end
step 'I should see project "Shop" README' do
wait_for_requests
page.within('.readme-holder') do
expect(page).to have_content 'testme'
end
end
step 'I add project tags' do
fill_in 'Tags', with: 'tag1, tag2'
end
step 'I should see project tags' do
expect(find_field('Tags').value).to eq 'tag1, tag2'
end
step 'I should not see "New Issue" button' do
expect(page).not_to have_link 'New Issue'
end
step 'I should not see "New Merge Request" button' do
expect(page).not_to have_link 'New Merge Request'
end
step 'I should not see "Snippets" button' do
page.within '.content' do
expect(page).not_to have_link 'Snippets'
end
end
step 'project "Shop" belongs to group' do
group = create(:group)
@project.namespace = group
@project.save!
end
step 'I click notifications drop down button' do
first('.notifications-btn').click
end
step 'I choose Mention setting' do
click_link 'On mention'
end
step 'I should see Notification saved message' do
page.within '#notifications-button' do
expect(page).to have_content 'On mention'
end
end
step 'I create bare repo' do
click_link 'Create empty repository'
end
step 'I should see command line instructions' do
page.within ".empty_wrapper" do
expect(page).to have_content("Command line instructions")
end
end
end
Loading
Loading
@@ -25,72 +25,6 @@ module SharedProject
@project.add_master(@user)
end
 
step 'I disable snippets in project' do
@project.snippets_enabled = false
@project.save
end
step 'I disable issues and merge requests in project' do
@project.issues_enabled = false
@project.merge_requests_enabled = false
@project.save
end
# Add another user to project "Shop"
step 'I add a user to project "Shop"' do
@project = Project.find_by(name: "Shop")
other_user = create(:user, name: 'Alpha')
@project.add_master(other_user)
end
# Create another specific project called "Forum"
step 'I own project "Forum"' do
@project = Project.find_by(name: "Forum")
@project ||= create(:project, :repository, name: "Forum", namespace: @user.namespace, path: 'forum_project')
@project.build_project_feature
@project.project_feature.save
@project.add_master(@user)
end
# Create an empty project without caring about the name
step 'I own an empty project' do
@project = create(:project, name: 'Empty Project', namespace: @user.namespace)
@project.add_master(@user)
end
step 'I visit my empty project page' do
project = Project.find_by(name: 'Empty Project')
visit project_path(project)
end
step 'I visit project "Shop" activity page' do
project = Project.find_by(name: 'Shop')
visit project_path(project)
end
step 'project "Shop" has push event' do
@project = Project.find_by(name: "Shop")
@event = create(:push_event, project: @project, author: @user)
create(:push_event_payload,
event: @event,
action: :created,
commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
ref: 'fix',
commit_count: 1)
end
step 'I should see project "Shop" activity feed' do
project = Project.find_by(name: "Shop")
expect(page).to have_content "#{@user.name} pushed new branch fix at #{project.full_name}"
end
step 'I should see project settings' do
expect(current_path).to eq edit_project_path(@project)
expect(page).to have_content("Project name")
expect(page).to have_content("Permissions")
end
def current_project
@project ||= Project.first
end
Loading
Loading
@@ -206,24 +140,6 @@ module SharedProject
create(:label, project: project, title: 'enhancement')
end
 
step 'project "Shop" has CI enabled' do
project = Project.find_by(name: "Shop")
project.enable_ci
end
step 'project "Shop" has CI build' do
project = Project.find_by(name: "Shop")
pipeline = create :ci_pipeline, project: project, sha: project.commit.sha, ref: 'master'
pipeline.skip
end
step 'I should see last commit with CI status' do
page.within ".blob-commit-info" do
expect(page).to have_content(project.commit.sha[0..6])
expect(page).to have_link("Commit: skipped")
end
end
step 'The project is internal' do
@project.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
end
Loading
Loading
require 'spec_helper'
feature 'Projects > Activity > User sees activity' do
let(:project) { create(:project, :repository, :public) }
let(:user) { project.creator }
before do
event = create(:push_event, project: project, author: user)
create(:push_event_payload,
event: event,
action: :created,
commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
ref: 'fix',
commit_count: 1)
visit activity_project_path(project)
end
shared_examples 'push appears in activity' do
it 'shows the last push in the activity page', :js do
expect(page).to have_content "#{user.name} pushed new branch fix"
end
end
context 'when signed in' do
before do
project.add_developer(user)
sign_in(user)
end
it_behaves_like 'push appears in activity'
end
context 'when signed out' do
it_behaves_like 'push appears in activity'
end
end
require 'rails_helper'
feature 'Project edit', :js do
let(:admin) { create(:admin) }
let(:user) { create(:user) }
let(:project) { create(:project) }
context 'feature visibility' do
before do
project.add_master(user)
sign_in(user)
visit edit_project_path(project)
end
context 'merge requests select' do
it 'hides merge requests section' do
find('.project-feature-controls[data-for="project[project_feature_attributes][merge_requests_access_level]"] .project-feature-toggle').click
expect(page).to have_selector('.merge-requests-feature', visible: false)
end
context 'given project with merge_requests_disabled access level' do
let(:project) { create(:project, :merge_requests_disabled) }
it 'hides merge requests section' do
expect(page).to have_selector('.merge-requests-feature', visible: false)
end
end
end
context 'builds select' do
it 'hides builds select section' do
find('.project-feature-controls[data-for="project[project_feature_attributes][builds_access_level]"] .project-feature-toggle').click
expect(page).to have_selector('.builds-feature', visible: false)
end
context 'given project with builds_disabled access level' do
let(:project) { create(:project, :builds_disabled) }
it 'hides builds select section' do
expect(page).to have_selector('.builds-feature', visible: false)
end
end
end
end
context 'LFS enabled setting' do
before do
sign_in(admin)
end
it 'displays the correct elements' do
allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
visit edit_project_path(project)
expect(page).to have_content('Git Large File Storage')
expect(page).to have_selector('input[name="project[lfs_enabled]"] + button', visible: true)
end
end
end
require 'spec_helper'
feature 'user browses project', :js do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
before do
project.add_master(user)
sign_in(user)
visit project_tree_path(project, project.default_branch)
end
scenario "can see blame of '.gitignore'" do
click_link ".gitignore"
click_link 'Blame'
expect(page).to have_content "*.rb"
expect(page).to have_content "Dmitriy Zaporozhets"
expect(page).to have_content "Initial commit"
end
scenario 'can see raw content of LFS pointer with LFS disabled' do
allow_any_instance_of(Project).to receive(:lfs_enabled?).and_return(false)
click_link 'files'
click_link 'lfs'
click_link 'lfs_object.iso'
wait_for_requests
expect(page).not_to have_content 'Download (1.5 MB)'
expect(page).to have_content 'version https://git-lfs.github.com/spec/v1'
expect(page).to have_content 'oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897'
expect(page).to have_content 'size 1575078'
end
scenario 'can see last commit for current directory' do
last_commit = project.repository.last_commit_for_path(project.default_branch, 'files')
click_link 'files'
wait_for_requests
page.within('.blob-commit-info') do
expect(page).to have_content last_commit.short_id
expect(page).to have_content last_commit.author_name
end
end
end
require 'spec_helper'
feature 'User wants to create a file' do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
background do
project.add_master(user)
sign_in user
visit project_new_blob_path(project, project.default_branch)
end
def submit_new_file(options)
file_name = find('#file_name')
file_name.set options[:file_name] || 'README.md'
file_content = find('#file-content', visible: false)
file_content.set options[:file_content] || 'Some content'
click_button 'Commit changes'
end
scenario 'file name contains Chinese characters' do
submit_new_file(file_name: '测试.md')
expect(page).to have_content 'The file has been successfully created.'
end
scenario 'directory name contains Chinese characters' do
submit_new_file(file_name: '中文/测试.md')
expect(page).to have_content 'The file has been successfully created'
end
scenario 'file name contains directory traversal' do
submit_new_file(file_name: '../README.md')
expect(page).to have_content 'Path cannot include directory traversal'
end
end
require 'spec_helper'
require 'fileutils'
 
feature 'User wants to add a Dockerfile file' do
describe 'Projects > Files > User wants to add a Dockerfile file' do
before do
user = create(:user)
project = create(:project, :repository)
Loading
Loading
@@ -12,11 +12,11 @@ feature 'User wants to add a Dockerfile file' do
visit project_new_blob_path(project, 'master', file_name: 'Dockerfile')
end
 
scenario 'user can see Dockerfile dropdown' do
it 'user can see Dockerfile dropdown' do
expect(page).to have_css('.dockerfile-selector')
end
 
scenario 'user can pick a Dockerfile file from the dropdown', :js do
it 'user can pick a Dockerfile file from the dropdown', :js do
find('.js-dockerfile-selector').click
 
wait_for_requests
Loading
Loading
require 'spec_helper'
 
feature 'Download buttons in files tree' do
given(:user) { create(:user) }
given(:role) { :developer }
given(:status) { 'success' }
given(:project) { create(:project, :repository) }
describe 'Projects > Files > Download buttons in files tree' do
let(:user) { create(:user) }
let(:role) { :developer }
let(:status) { 'success' }
let(:project) { create(:project, :repository) }
 
given(:pipeline) do
let(:pipeline) do
create(:ci_pipeline,
project: project,
sha: project.commit.sha,
Loading
Loading
@@ -14,14 +14,14 @@ feature 'Download buttons in files tree' do
status: status)
end
 
given!(:build) do
let!(:build) do
create(:ci_build, :success, :artifacts,
pipeline: pipeline,
status: pipeline.status,
name: 'build')
end
 
background do
before do
sign_in(user)
project.add_role(user, role)
end
Loading
Loading
@@ -32,7 +32,7 @@ feature 'Download buttons in files tree' do
visit project_tree_path(project, project.default_branch)
end
 
scenario 'shows download artifacts button' do
it 'shows download artifacts button' do
href = latest_succeeded_project_artifacts_path(project, "#{project.default_branch}/download", job: 'build')
 
expect(page).to have_link "Download '#{build.name}'", href: href
Loading
Loading
require 'spec_helper'
 
feature 'User uses soft wrap whilst editing file', :js do
describe 'Projects > Files > User uses soft wrap whilst editing file', :js do
before do
user = create(:user)
project = create(:project, :repository)
Loading
Loading
@@ -23,7 +23,7 @@ feature 'User uses soft wrap whilst editing file', :js do
 
let(:toggle_button) { find('.soft-wrap-toggle') }
 
scenario 'user clicks the "Soft wrap" button and then "No wrap" button' do
it 'user clicks the "Soft wrap" button and then "No wrap" button' do
wrapped_content_width = get_content_width
toggle_button.click
expect(toggle_button).to have_content 'No wrap'
Loading
Loading
require 'spec_helper'
 
feature 'User wants to edit a file' do
describe 'Projects > Files > User wants to edit a file' do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
let(:commit_params) do
Loading
Loading
@@ -15,14 +15,14 @@ feature 'User wants to edit a file' do
}
end
 
background do
before do
project.add_master(user)
sign_in user
visit project_edit_blob_path(project,
File.join(project.default_branch, '.gitignore'))
end
 
scenario 'file has been updated since the user opened the edit page' do
it 'file has been updated since the user opened the edit page' do
Files::UpdateService.new(project, user, commit_params).execute
 
click_button 'Commit changes'
Loading
Loading
require 'spec_helper'
 
feature 'User views files page' do
describe 'Projects > Files > User views files page' do
let(:user) { create(:user) }
let(:project) { create(:forked_project_with_submodules) }
 
Loading
Loading
@@ -10,7 +10,7 @@ feature 'User views files page' do
visit project_tree_path(project, project.repository.root_ref)
end
 
scenario 'user sees folders and submodules sorted together, followed by files' do
it 'user sees folders and submodules sorted together, followed by files' do
rows = all('td.tree-item-file-name').map(&:text)
tree = project.repository.tree
 
Loading
Loading
require 'spec_helper'
 
feature 'Find file keyboard shortcuts', :js do
describe 'Projects > Files > Find file keyboard shortcuts', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
 
Loading
Loading
require 'spec_helper'
 
feature 'User wants to add a .gitignore file' do
describe 'Projects > Files > User wants to add a .gitignore file' do
before do
user = create(:user)
project = create(:project, :repository)
Loading
Loading
@@ -9,11 +9,11 @@ feature 'User wants to add a .gitignore file' do
visit project_new_blob_path(project, 'master', file_name: '.gitignore')
end
 
scenario 'user can see .gitignore dropdown' do
it 'user can see .gitignore dropdown' do
expect(page).to have_css('.gitignore-selector')
end
 
scenario 'user can pick a .gitignore file from the dropdown', :js do
it 'user can pick a .gitignore file from the dropdown', :js do
find('.js-gitignore-selector').click
wait_for_requests
within '.gitignore-selector' do
Loading
Loading
require 'spec_helper'
 
feature 'User wants to add a .gitlab-ci.yml file' do
describe 'Projects > Files > User wants to add a .gitlab-ci.yml file' do
before do
user = create(:user)
project = create(:project, :repository)
Loading
Loading
@@ -9,11 +9,11 @@ feature 'User wants to add a .gitlab-ci.yml file' do
visit project_new_blob_path(project, 'master', file_name: '.gitlab-ci.yml')
end
 
scenario 'user can see .gitlab-ci.yml dropdown' do
it 'user can see .gitlab-ci.yml dropdown' do
expect(page).to have_css('.gitlab-ci-yml-selector')
end
 
scenario 'user can pick a template from the dropdown', :js do
it 'user can pick a template from the dropdown', :js do
find('.js-gitlab-ci-yml-selector').click
wait_for_requests
within '.gitlab-ci-yml-selector' do
Loading
Loading
require 'spec_helper'
 
feature 'project owner creates a license file', :js do
describe 'Projects > Files > Project owner creates a license file', :js do
let(:project_master) { create(:user) }
let(:project) { create(:project, :repository) }
background do
before do
project.repository.delete_file(project_master, 'LICENSE',
message: 'Remove LICENSE', branch_name: 'master')
project.add_master(project_master)
Loading
Loading
@@ -11,7 +12,7 @@ feature 'project owner creates a license file', :js do
visit project_path(project)
end
 
scenario 'project master creates a license file manually from a template' do
it 'project master creates a license file manually from a template' do
visit project_tree_path(project, project.repository.root_ref)
find('.add-to-tree').click
click_link 'New file'
Loading
Loading
@@ -35,7 +36,7 @@ feature 'project owner creates a license file', :js do
expect(page).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}")
end
 
scenario 'project master creates a license file from the "Add license" link' do
it 'project master creates a license file from the "Add license" link' do
click_link 'Add License'
 
expect(page).to have_content('New file')
Loading
Loading
require 'spec_helper'
 
feature 'project owner sees a link to create a license file in empty project', :js do
describe 'Projects > Files > Project owner sees a link to create a license file in empty project', :js do
let(:project_master) { create(:user) }
let(:project) { create(:project_empty_repo) }
 
background do
before do
project.add_master(project_master)
sign_in(project_master)
end
 
scenario 'project master creates a license file from a template' do
it 'project master creates a license file from a template' do
visit project_path(project)
click_on 'Add License'
expect(page).to have_content('New file')
Loading
Loading
require 'spec_helper'
 
feature 'Template type dropdown selector', :js do
describe 'Projects > Files > Template type dropdown selector', :js do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
 
Loading
Loading
@@ -14,16 +14,16 @@ feature 'Template type dropdown selector', :js do
create_and_edit_file('.random-file.js')
end
 
scenario 'not displayed' do
it 'not displayed' do
check_type_selector_display(false)
end
 
scenario 'selects every template type correctly' do
it 'selects every template type correctly' do
fill_in 'file_path', with: '.gitignore'
try_selecting_all_types
end
 
scenario 'updates toggle value when input matches' do
it 'updates toggle value when input matches' do
fill_in 'file_path', with: '.gitignore'
check_type_selector_toggle_text('.gitignore')
end
Loading
Loading
@@ -34,15 +34,15 @@ feature 'Template type dropdown selector', :js do
visit project_edit_blob_path(project, File.join(project.default_branch, 'LICENSE'))
end
 
scenario 'displayed' do
it 'displayed' do
check_type_selector_display(true)
end
 
scenario 'is displayed when input matches' do
it 'is displayed when input matches' do
check_type_selector_display(true)
end
 
scenario 'selects every template type correctly' do
it 'selects every template type correctly' do
try_selecting_all_types
end
 
Loading
Loading
@@ -51,7 +51,7 @@ feature 'Template type dropdown selector', :js do
click_link 'Preview changes'
end
 
scenario 'type selector is hidden and shown correctly' do
it 'type selector is hidden and shown correctly' do
check_type_selector_display(false)
click_link 'Write'
check_type_selector_display(true)
Loading
Loading
@@ -64,15 +64,15 @@ feature 'Template type dropdown selector', :js do
visit project_new_blob_path(project, 'master', file_name: '.gitignore')
end
 
scenario 'is displayed' do
it 'is displayed' do
check_type_selector_display(true)
end
 
scenario 'toggle is set to the correct value' do
it 'toggle is set to the correct value' do
check_type_selector_toggle_text('.gitignore')
end
 
scenario 'selects every template type correctly' do
it 'selects every template type correctly' do
try_selecting_all_types
end
end
Loading
Loading
@@ -82,15 +82,15 @@ feature 'Template type dropdown selector', :js do
visit project_new_blob_path(project, project.default_branch)
end
 
scenario 'type selector is shown' do
it 'type selector is shown' do
check_type_selector_display(true)
end
 
scenario 'toggle is set to the proper value' do
it 'toggle is set to the proper value' do
check_type_selector_toggle_text('Choose type')
end
 
scenario 'selects every template type correctly' do
it 'selects every template type correctly' do
try_selecting_all_types
end
end
Loading
Loading
require 'spec_helper'
 
feature 'Template Undo Button', :js do
describe 'Projects > Files > Template Undo Button', :js do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
 
Loading
Loading
@@ -15,7 +15,7 @@ feature 'Template Undo Button', :js do
select_file_template('.js-license-selector', 'Apache License 2.0')
end
 
scenario 'reverts template application' do
it 'reverts template application' do
try_template_undo('http://www.apache.org/licenses/', 'Apply a license template')
end
end
Loading
Loading
@@ -27,7 +27,7 @@ feature 'Template Undo Button', :js do
select_file_template('.js-license-selector', 'Apache License 2.0')
end
 
scenario 'reverts template application' do
it 'reverts template application' do
try_template_undo('http://www.apache.org/licenses/', 'Apply a license template')
end
end
Loading
Loading
require 'spec_helper'
 
# This is a regression test for https://gitlab.com/gitlab-org/gitlab-ce/issues/37569
describe 'User browses a tree with a folder containing only a folder' do
describe 'Projects > Files > User browses a tree with a folder containing only a folder' do
let(:project) { create(:project, :empty_repo) }
let(:user) { project.creator }
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment