2019-10-12 21:52:04 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-23 00:09:42 +05:30
|
|
|
RSpec.describe 'Group empty states' do
|
2017-08-17 22:00:37 +05:30
|
|
|
let(:group) { create(:group) }
|
|
|
|
let(:user) { create(:group_member, :developer, user: create(:user), group: group ).user }
|
|
|
|
|
|
|
|
before do
|
2022-07-16 23:28:13 +05:30
|
|
|
stub_feature_flags(vue_issues_list: true)
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
sign_in(user)
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
[:issue, :merge_request].each do |issuable|
|
|
|
|
issuable_name = issuable.to_s.humanize.downcase
|
|
|
|
project_relation = issuable == :issue ? :project : :source_project
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
context "for #{issuable_name}s" do
|
|
|
|
let(:path) { public_send(:"#{issuable}s_group_path", group) }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
context 'group has a project' do
|
|
|
|
let(:project) { create(:project, namespace: group) }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
before do
|
2018-11-18 11:00:15 +05:30
|
|
|
project.add_maintainer(user)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
context "the project has #{issuable_name}s" do
|
2019-03-02 22:35:43 +05:30
|
|
|
it 'does not display an empty state' do
|
2018-03-17 18:26:18 +05:30
|
|
|
create(issuable, project_relation => project)
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
visit path
|
2019-03-02 22:35:43 +05:30
|
|
|
expect(page).not_to have_selector('.empty-state')
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
it "displays link to create new #{issuable} when no open #{issuable} is found", :js do
|
2019-03-02 22:35:43 +05:30
|
|
|
create("closed_#{issuable}", project_relation => project)
|
|
|
|
issuable_link_fn = "project_#{issuable}s_path"
|
|
|
|
|
|
|
|
visit public_send(issuable_link_fn, project)
|
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
wait_for_all_requests
|
|
|
|
|
2019-03-02 22:35:43 +05:30
|
|
|
page.within(find('.empty-state')) do
|
|
|
|
expect(page).to have_content(/There are no open #{issuable.to_s.humanize.downcase}/)
|
2020-10-24 23:57:45 +05:30
|
|
|
new_issuable_path = issuable == :issue ? 'new_project_issue_path' : 'project_new_merge_request_path'
|
|
|
|
|
|
|
|
path = public_send(new_issuable_path, project)
|
|
|
|
|
|
|
|
expect(page.find('a')['href']).to have_content(path)
|
2019-03-02 22:35:43 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
it 'displays link to create new issue when the current search gave no results', :js do
|
2019-03-02 22:35:43 +05:30
|
|
|
create(issuable, project_relation => project)
|
|
|
|
|
|
|
|
issuable_link_fn = "project_#{issuable}s_path"
|
|
|
|
|
|
|
|
visit public_send(issuable_link_fn, project, author_username: 'foo', scope: 'all', state: 'opened')
|
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
wait_for_all_requests
|
|
|
|
|
2019-03-02 22:35:43 +05:30
|
|
|
page.within(find('.empty-state')) do
|
|
|
|
expect(page).to have_content(/Sorry, your filter produced no results/)
|
|
|
|
new_issuable_path = issuable == :issue ? 'new_project_issue_path' : 'project_new_merge_request_path'
|
|
|
|
|
|
|
|
path = public_send(new_issuable_path, project)
|
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
expect(page.find('a')['href']).to have_content(path)
|
2019-03-02 22:35:43 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
it "displays conditional text when no closed #{issuable} is found", :js do
|
2019-03-02 22:35:43 +05:30
|
|
|
create(issuable, project_relation => project)
|
|
|
|
|
|
|
|
issuable_link_fn = "project_#{issuable}s_path"
|
|
|
|
|
|
|
|
visit public_send(issuable_link_fn, project, state: 'closed')
|
|
|
|
|
2020-10-24 23:57:45 +05:30
|
|
|
wait_for_all_requests
|
|
|
|
|
2019-03-02 22:35:43 +05:30
|
|
|
page.within(find('.empty-state')) do
|
|
|
|
expect(page).to have_content(/There are no closed #{issuable.to_s.humanize.downcase}/)
|
|
|
|
end
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "the project has no #{issuable_name}s", :js do
|
|
|
|
before do
|
|
|
|
visit path
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'displays an empty state' do
|
|
|
|
expect(page).to have_selector('.empty-state')
|
|
|
|
end
|
|
|
|
|
|
|
|
it "shows a new #{issuable_name} button" do
|
|
|
|
within '.empty-state' do
|
|
|
|
expect(page).to have_content("create #{issuable_name}")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it "the new #{issuable_name} button opens a project dropdown" do
|
2022-07-16 23:28:13 +05:30
|
|
|
click_button 'Toggle project select'
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2022-07-16 23:28:13 +05:30
|
|
|
if issuable == :issue
|
|
|
|
expect(page).to have_button project.name
|
|
|
|
else
|
|
|
|
expect(page).to have_selector('.ajax-project-dropdown')
|
|
|
|
end
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
shared_examples "no projects" do
|
2022-07-16 23:28:13 +05:30
|
|
|
it 'displays an empty state', :js do
|
2018-11-08 19:23:39 +05:30
|
|
|
expect(page).to have_selector('.empty-state')
|
|
|
|
end
|
|
|
|
|
2022-07-16 23:28:13 +05:30
|
|
|
it "does not show a new #{issuable_name} button", :js do
|
2018-11-08 19:23:39 +05:30
|
|
|
within '.empty-state' do
|
|
|
|
expect(page).not_to have_link("create #{issuable_name}")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
context 'group without a project' do
|
2019-10-12 21:52:04 +05:30
|
|
|
context 'group has a subgroup' do
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:subgroup) { create(:group, parent: group) }
|
|
|
|
let(:subgroup_project) { create(:project, namespace: subgroup) }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
context "the project has #{issuable_name}s" do
|
|
|
|
before do
|
|
|
|
create(issuable, project_relation => subgroup_project)
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
visit path
|
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
it 'does not display an empty state' do
|
|
|
|
expect(page).not_to have_selector('.empty-state')
|
|
|
|
end
|
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
context "the project has no #{issuable_name}s" do
|
|
|
|
before do
|
|
|
|
visit path
|
|
|
|
end
|
|
|
|
|
2022-07-16 23:28:13 +05:30
|
|
|
it 'displays an empty state', :js do
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(page).to have_selector('.empty-state')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'group has no subgroups' do
|
|
|
|
before do
|
|
|
|
visit path
|
|
|
|
end
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it_behaves_like "no projects"
|
|
|
|
end
|
|
|
|
end
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
context 'group has only a project with issues disabled' do
|
|
|
|
let(:project_with_issues_disabled) { create(:empty_project, :issues_disabled, group: group) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
visit path
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2018-11-08 19:23:39 +05:30
|
|
|
|
|
|
|
it_behaves_like "no projects"
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|