diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-29 18:10:35 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-29 18:10:35 +0300 |
commit | 6407b5a4c13e34323d50ac3a39fda74e54d09306 (patch) | |
tree | 1461aebeda6e0b5359283a41381f780ab639f821 /spec | |
parent | 1a8b381312dc666a93c1bc3879ad15b1350de300 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
17 files changed, 295 insertions, 23 deletions
diff --git a/spec/frontend/clusters_list/components/agent_table_spec.js b/spec/frontend/clusters_list/components/agent_table_spec.js index 5088069d015..0f68a69458e 100644 --- a/spec/frontend/clusters_list/components/agent_table_spec.js +++ b/spec/frontend/clusters_list/components/agent_table_spec.js @@ -36,6 +36,7 @@ describe('AgentTable', () => { const findStatusIcon = (at) => findStatusText(at).findComponent(GlIcon); const findLastContactText = (at) => wrapper.findAllByTestId('cluster-agent-last-contact').at(at); const findVersionText = (at) => wrapper.findAllByTestId('cluster-agent-version').at(at); + const findAgentId = (at) => wrapper.findAllByTestId('cluster-agent-id').at(at); const findConfiguration = (at) => wrapper.findAllByTestId('cluster-agent-configuration-link').at(at); const findDeleteAgentButton = () => wrapper.findAllComponents(DeleteAgentButton); @@ -66,6 +67,17 @@ describe('AgentTable', () => { }); it.each` + agentGraphQLId | agentId | lineNumber + ${'gid://gitlab/Clusters::Agent/1'} | ${'1'} | ${0} + ${'gid://gitlab/Clusters::Agent/2'} | ${'2'} | ${1} + `( + 'displays agent id as "$agentId" for "$agentGraphQLId" at line $lineNumber', + ({ agentId, lineNumber }) => { + expect(findAgentId(lineNumber).text()).toBe(agentId); + }, + ); + + it.each` status | iconName | lineNumber ${'Never connected'} | ${'status-neutral'} | ${0} ${'Connected'} | ${'status-success'} | ${1} diff --git a/spec/frontend/clusters_list/components/mock_data.js b/spec/frontend/clusters_list/components/mock_data.js index b5d25c780b6..af1fb496118 100644 --- a/spec/frontend/clusters_list/components/mock_data.js +++ b/spec/frontend/clusters_list/components/mock_data.js @@ -19,7 +19,7 @@ export const connectedTimeInactive = new Date(connectedTimeNow.getTime() - ACTIV export const clusterAgents = [ { name: 'agent-1', - id: 'agent-1-id', + id: 'gid://gitlab/Clusters::Agent/1', configFolder: { webPath: '/agent/full/path', }, @@ -30,7 +30,7 @@ export const clusterAgents = [ }, { name: 'agent-2', - id: 'agent-2-id', + id: 'gid://gitlab/Clusters::Agent/2', webPath: '/agent-2', status: 'active', lastContact: connectedTimeNow.getTime(), @@ -54,7 +54,7 @@ export const clusterAgents = [ }, { name: 'agent-3', - id: 'agent-3-id', + id: 'gid://gitlab/Clusters::Agent/3', webPath: '/agent-3', status: 'inactive', lastContact: connectedTimeInactive.getTime(), @@ -75,7 +75,7 @@ export const clusterAgents = [ }, { name: 'agent-4', - id: 'agent-4-id', + id: 'gid://gitlab/Clusters::Agent/4', webPath: '/agent-4', status: 'inactive', lastContact: connectedTimeInactive.getTime(), @@ -99,7 +99,7 @@ export const clusterAgents = [ }, { name: 'agent-5', - id: 'agent-5-id', + id: 'gid://gitlab/Clusters::Agent/5', webPath: '/agent-5', status: 'inactive', lastContact: connectedTimeInactive.getTime(), @@ -123,7 +123,7 @@ export const clusterAgents = [ }, { name: 'agent-6', - id: 'agent-6-id', + id: 'gid://gitlab/Clusters::Agent/6', webPath: '/agent-6', status: 'inactive', lastContact: connectedTimeInactive.getTime(), @@ -144,7 +144,7 @@ export const clusterAgents = [ }, { name: 'agent-7', - id: 'agent-7-id', + id: 'gid://gitlab/Clusters::Agent/7', webPath: '/agent-7', status: 'inactive', lastContact: connectedTimeInactive.getTime(), @@ -165,7 +165,7 @@ export const clusterAgents = [ }, { name: 'agent-8', - id: 'agent-8-id', + id: 'gid://gitlab/Clusters::Agent/8', webPath: '/agent-8', status: 'inactive', lastContact: connectedTimeInactive.getTime(), @@ -186,7 +186,7 @@ export const clusterAgents = [ }, { name: 'agent-9', - id: 'agent-9-id', + id: 'gid://gitlab/Clusters::Agent/9', webPath: '/agent-9', status: 'inactive', lastContact: connectedTimeInactive.getTime(), diff --git a/spec/frontend/diffs/components/commit_item_spec.js b/spec/frontend/diffs/components/commit_item_spec.js index 4b4b6351d3f..3c092296130 100644 --- a/spec/frontend/diffs/components/commit_item_spec.js +++ b/spec/frontend/diffs/components/commit_item_spec.js @@ -1,4 +1,5 @@ import { mount } from '@vue/test-utils'; +import { GlFormCheckbox } from '@gitlab/ui'; import getDiffWithCommit from 'test_fixtures/merge_request_diffs/with_commit.json'; import { TEST_HOST } from 'helpers/test_constants'; import { trimText } from 'helpers/text_helper'; @@ -28,6 +29,7 @@ describe('diffs/components/commit_item', () => { const getCommitterElement = () => wrapper.find('.committer'); const getCommitActionsElement = () => wrapper.find('.commit-actions'); const getCommitPipelineStatus = () => wrapper.findComponent(CommitPipelineStatus); + const getCommitCheckbox = () => wrapper.findComponent(GlFormCheckbox); const mountComponent = (propsData) => { wrapper = mount(Component, { @@ -168,4 +170,24 @@ describe('diffs/components/commit_item', () => { expect(getCommitPipelineStatus().exists()).toBe(true); }); }); + + describe('when commit is selectable', () => { + beforeEach(() => { + mountComponent({ + commit: { ...commit }, + isSelectable: true, + }); + }); + + it('renders checkbox', () => { + expect(getCommitCheckbox().exists()).toBe(true); + }); + + it('emits "handleCheckboxChange" event on change', () => { + expect(wrapper.emitted('handleCheckboxChange')).toBeUndefined(); + getCommitCheckbox().vm.$emit('change'); + + expect(wrapper.emitted('handleCheckboxChange')[0]).toEqual([true]); + }); + }); }); diff --git a/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb b/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb index f33cb4ab7f6..b1051c1387b 100644 --- a/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb +++ b/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb @@ -83,6 +83,16 @@ RSpec.describe Sidebars::Concerns::SuperSidebarPanel, feature_category: :navigat expect(uncategorized_menu.renderable_items).to eq([]) end + it 'replaces placeholder Menu Items in the defined super_sidebar_parent' do + menu_foo.insert_item_before(:exists, nil_menu_item) + allow(menu_item).to receive(:item_id).and_return(:nil_item) + + subject.transform_old_menus(current_menus, menu_bar) + + expect(menu_foo.renderable_items).to eq([menu_item, existing_item]) + expect(uncategorized_menu.renderable_items).to eq([]) + end + it 'adds Menu Items to defined super_sidebar_parent, before super_sidebar_before' do allow(menu_item).to receive(:super_sidebar_before).and_return(:exists) subject.transform_old_menus(current_menus, menu_bar) diff --git a/spec/lib/sidebars/menu_spec.rb b/spec/lib/sidebars/menu_spec.rb index 7577eeb8478..74ed344dd24 100644 --- a/spec/lib/sidebars/menu_spec.rb +++ b/spec/lib/sidebars/menu_spec.rb @@ -238,6 +238,47 @@ RSpec.describe Sidebars::Menu, feature_category: :navigation do end end + describe '#replace_placeholder' do + let(:item1) { Sidebars::NilMenuItem.new(item_id: :foo1) } + let(:item2) { Sidebars::MenuItem.new(item_id: :foo2, title: 'foo2', link: 'foo2', active_routes: {}) } + let(:item3) { Sidebars::NilMenuItem.new(item_id: :foo3) } + + subject { menu.instance_variable_get(:@items) } + + before do + menu.add_item(item1) + menu.add_item(item2) + menu.add_item(item3) + end + + context 'when a NilMenuItem reference element exists' do + it 'replaces the reference element with the provided item' do + item = Sidebars::MenuItem.new(item_id: :foo1, title: 'target', active_routes: {}, link: 'target') + menu.replace_placeholder(item) + + expect(subject).to eq [item, item2, item3] + end + end + + context 'when a MenuItem reference element exists' do + it 'does not replace the reference element and adds to the end of the list' do + item = Sidebars::MenuItem.new(item_id: :foo2, title: 'target', active_routes: {}, link: 'target') + menu.replace_placeholder(item) + + expect(subject).to eq [item1, item2, item3, item] + end + end + + context 'when reference element does not exist' do + it 'adds the element to the end of the list' do + item = Sidebars::MenuItem.new(item_id: :new_element, title: 'target', active_routes: {}, link: 'target') + menu.replace_placeholder(item) + + expect(subject).to eq [item1, item2, item3, item] + end + end + end + describe '#remove_element' do let(:item1) { Sidebars::MenuItem.new(title: 'foo1', link: 'foo1', active_routes: {}, item_id: :foo1) } let(:item2) { Sidebars::MenuItem.new(title: 'foo2', link: 'foo2', active_routes: {}, item_id: :foo2) } diff --git a/spec/lib/sidebars/projects/menus/repository_menu_spec.rb b/spec/lib/sidebars/projects/menus/repository_menu_spec.rb index b0631aacdb9..1aa0ea30d0a 100644 --- a/spec/lib/sidebars/projects/menus/repository_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/repository_menu_spec.rb @@ -6,7 +6,11 @@ RSpec.describe Sidebars::Projects::Menus::RepositoryMenu, feature_category: :sou let_it_be(:project) { create(:project, :repository) } let(:user) { project.first_owner } - let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project, current_ref: 'master') } + let(:is_super_sidebar) { false } + let(:context) do + Sidebars::Projects::Context.new(current_user: user, container: project, current_ref: 'master', + is_super_sidebar: is_super_sidebar) + end subject { described_class.new(context) } @@ -36,9 +40,8 @@ RSpec.describe Sidebars::Projects::Menus::RepositoryMenu, feature_category: :sou end context 'for menu items' do - shared_examples_for 'repository menu item link for' do |item_id| + shared_examples_for 'repository menu item link for' do let(:ref) { 'master' } - let(:item_id) { item_id } subject { described_class.new(context).renderable_items.find { |e| e.item_id == item_id }.link } using RSpec::Parameterized::TableSyntax @@ -77,10 +80,34 @@ RSpec.describe Sidebars::Projects::Menus::RepositoryMenu, feature_category: :sou end end + shared_examples_for 'repository menu item with different super sidebar title' do |title, super_sidebar_title| + subject { described_class.new(context).renderable_items.find { |e| e.item_id == item_id } } + + specify do + expect(subject.title).to eq(title) + end + + context 'when inside the super sidebar' do + let(:is_super_sidebar) { true } + + specify do + expect(subject.title).to eq(super_sidebar_title) + end + end + end + + describe 'Files' do + let_it_be(:item_id) { :files } + + it_behaves_like 'repository menu item with different super sidebar title', + _('Files'), + _('Repository') + end + describe 'Commits' do let_it_be(:item_id) { :commits } - it_behaves_like 'repository menu item link for', :commits do + it_behaves_like 'repository menu item link for' do let(:route) { "/#{project.full_path}/-/commits/#{ref}" } end end @@ -103,16 +130,22 @@ RSpec.describe Sidebars::Projects::Menus::RepositoryMenu, feature_category: :sou project.project_feature.update!(analytics_access_level: ProjectFeature::ENABLED) end - it_behaves_like 'repository menu item link for', :contributors do + it_behaves_like 'repository menu item link for' do let(:route) { "/#{project.full_path}/-/graphs/#{ref}" } end end end describe 'Network' do - it_behaves_like 'repository menu item link for', :graphs do + let_it_be(:item_id) { :graphs } + + it_behaves_like 'repository menu item link for' do let(:route) { "/#{project.full_path}/-/network/#{ref}" } end + + it_behaves_like 'repository menu item with different super sidebar title', + _('Graph'), + _('Repository graph') end end end diff --git a/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb b/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb index c5fd407dae9..9d50eb6f817 100644 --- a/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb @@ -13,8 +13,7 @@ RSpec.describe Sidebars::Projects::Menus::SnippetsMenu, feature_category: :navig let(:menu) { subject } let(:extra_attrs) do { - super_sidebar_parent: ::Sidebars::Projects::Menus::RepositoryMenu, - super_sidebar_before: :contributors, + super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::CodeMenu, item_id: :project_snippets } end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb new file mode 100644 index 00000000000..b8d74665042 --- /dev/null +++ b/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Projects::SuperSidebarMenus::AnalyzeMenu, feature_category: :navigation do + subject { described_class.new({}) } + + let(:items) { subject.instance_variable_get(:@items) } + + it 'has title and sprite_icon' do + expect(subject.title).to eq(s_("Navigation|Analyze")) + expect(subject.sprite_icon).to eq("chart") + end + + it 'defines list of NilMenuItem placeholders' do + expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem]) + expect(items.map(&:item_id)).to eq([ + :dashboards_analytics, + :cycle_analytics, + :contributors, + :ci_cd_analytics, + :repository_analytics, + :code_review, + :merge_requests, + :issues, + :insights + ]) + end +end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/build_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/build_menu_spec.rb new file mode 100644 index 00000000000..96e54d358c5 --- /dev/null +++ b/spec/lib/sidebars/projects/super_sidebar_menus/build_menu_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Projects::SuperSidebarMenus::BuildMenu, feature_category: :navigation do + subject { described_class.new({}) } + + it 'has title and sprite_icon' do + expect(subject.title).to eq(s_("Navigation|Build")) + expect(subject.sprite_icon).to eq("rocket") + end +end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb new file mode 100644 index 00000000000..e307ff91234 --- /dev/null +++ b/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Projects::SuperSidebarMenus::CodeMenu, feature_category: :navigation do + subject { described_class.new({}) } + + let(:items) { subject.instance_variable_get(:@items) } + + it 'has title and sprite_icon' do + expect(subject.title).to eq(s_("Navigation|Code")) + expect(subject.sprite_icon).to eq("code") + end + + it 'defines list of NilMenuItem placeholders' do + expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem]) + expect(items.map(&:item_id)).to eq([ + :files, + :branches, + :commits, + :tags, + :graphs, + :compare, + :project_snippets, + :file_locks + ]) + end +end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/manage_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/manage_menu_spec.rb new file mode 100644 index 00000000000..8c5f7aaaf36 --- /dev/null +++ b/spec/lib/sidebars/projects/super_sidebar_menus/manage_menu_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Projects::SuperSidebarMenus::ManageMenu, feature_category: :navigation do + subject { described_class.new({}) } + + it 'has title and sprite_icon' do + expect(subject.title).to eq(s_("Navigation|Manage")) + expect(subject.sprite_icon).to eq("users") + end +end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb new file mode 100644 index 00000000000..6398e20efd0 --- /dev/null +++ b/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Projects::SuperSidebarMenus::MonitorMenu, feature_category: :navigation do + subject { described_class.new({}) } + + it 'has title and sprite_icon' do + expect(subject.title).to eq(s_("Navigation|Monitor")) + expect(subject.sprite_icon).to eq("monitor") + end +end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/operations_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/operations_menu_spec.rb index df3f7e6cdab..54d4dcce264 100644 --- a/spec/lib/sidebars/projects/super_sidebar_menus/operations_menu_spec.rb +++ b/spec/lib/sidebars/projects/super_sidebar_menus/operations_menu_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::OperationsMenu, feature_ca subject { described_class.new({}) } it 'has title and sprite_icon' do - expect(subject.title).to eq(_("Operations")) + expect(subject.title).to eq(s_("Navigation|Operate")) expect(subject.sprite_icon).to eq("deployments") end end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb index 3917d26f6f2..5f6f6e4f6c2 100644 --- a/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb +++ b/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::PlanMenu, feature_category subject { described_class.new({}) } it 'has title and sprite_icon' do - expect(subject.title).to eq(_("Plan")) + expect(subject.title).to eq(s_("Navigation|Plan")) expect(subject.sprite_icon).to eq("planning") end end diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/secure_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/secure_menu_spec.rb new file mode 100644 index 00000000000..b68b33941c3 --- /dev/null +++ b/spec/lib/sidebars/projects/super_sidebar_menus/secure_menu_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Projects::SuperSidebarMenus::SecureMenu, feature_category: :navigation do + subject { described_class.new({}) } + + let(:items) { subject.instance_variable_get(:@items) } + + it 'has title and sprite_icon' do + expect(subject.title).to eq(s_("Navigation|Secure")) + expect(subject.sprite_icon).to eq("shield") + end + + it 'defines list of NilMenuItem placeholders' do + expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem]) + expect(items.map(&:item_id)).to eq([ + :discover_project_security, + :audit_events, + :dashboard, + :vulnerability_report, + :on_demand_scans, + :scan_policies, + :dependency_list, + :license_compliance, + :configuration + ]) + end +end diff --git a/spec/lib/sidebars/projects/super_sidebar_panel_spec.rb b/spec/lib/sidebars/projects/super_sidebar_panel_spec.rb index d6fc3fd8fe1..30a3612b3aa 100644 --- a/spec/lib/sidebars/projects/super_sidebar_panel_spec.rb +++ b/spec/lib/sidebars/projects/super_sidebar_panel_spec.rb @@ -26,13 +26,16 @@ RSpec.describe Sidebars::Projects::SuperSidebarPanel, feature_category: :navigat let(:category_menu) do [ Sidebars::StaticMenu, + Sidebars::Projects::SuperSidebarMenus::ManageMenu, Sidebars::Projects::SuperSidebarMenus::PlanMenu, - Sidebars::Projects::Menus::RepositoryMenu, - Sidebars::Projects::Menus::CiCdMenu, - Sidebars::Projects::Menus::SecurityComplianceMenu, + Sidebars::Projects::SuperSidebarMenus::CodeMenu, + Sidebars::Projects::SuperSidebarMenus::BuildMenu, + Sidebars::Projects::SuperSidebarMenus::SecureMenu, Sidebars::Projects::SuperSidebarMenus::OperationsMenu, + Sidebars::Projects::SuperSidebarMenus::MonitorMenu, + Sidebars::Projects::SuperSidebarMenus::AnalyzeMenu, + Sidebars::Projects::Menus::CiCdMenu, Sidebars::Projects::Menus::MonitorMenu, - Sidebars::Projects::Menus::AnalyticsMenu, Sidebars::UncategorizedMenu, Sidebars::Projects::Menus::SettingsMenu ] diff --git a/spec/rubocop/cop/rspec/feature_category_on_shared_examples_spec.rb b/spec/rubocop/cop/rspec/feature_category_on_shared_examples_spec.rb new file mode 100644 index 00000000000..6b337471f0a --- /dev/null +++ b/spec/rubocop/cop/rspec/feature_category_on_shared_examples_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require 'rubocop_spec_helper' +require 'rspec-parameterized' + +require_relative '../../../../rubocop/cop/rspec/feature_category_on_shared_examples' + +RSpec.describe RuboCop::Cop::RSpec::FeatureCategoryOnSharedExamples, feature_category: :tooling do + it 'flags feature category in shared example' do + expect_offense(<<~RUBY) + RSpec.shared_examples 'foo', feature_category: :shared do + ^^^^^^^^^^^^^^^^^^^^^^^^^ Shared examples should not have feature category set + end + + shared_examples 'foo', feature_category: :shared do + ^^^^^^^^^^^^^^^^^^^^^^^^^ Shared examples should not have feature category set + end + RUBY + end + + it 'does not flag if feature category is missing' do + expect_no_offenses(<<~RUBY) + RSpec.shared_examples 'foo' do + end + + shared_examples 'foo', some: :tag do + end + RUBY + end +end |