From 02e4b2d0043b416314ffb76694aff200584352d5 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 25 Sep 2023 15:10:16 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../admin_views_hidden_merge_request_spec.rb | 12 ++--- .../admin_views_hidden_merge_requests_spec.rb | 2 +- spec/frontend/boards/board_card_inner_spec.js | 2 +- .../issuable/components/hidden_badge_spec.js | 45 ++++++++++++++++ .../issuable/components/locked_badge_spec.js | 45 ++++++++++++++++ .../issues/show/components/sticky_header_spec.js | 29 +++------- .../components/header_metadata_spec.js | 52 ++++++------------ .../badges/__snapshots__/beta_badge_spec.js.snap | 21 +++----- .../__snapshots__/experiment_badge_spec.js.snap | 41 ++++++++++++++ .../components/badges/beta_badge_spec.js | 4 +- .../components/badges/experiment_badge_spec.js | 32 +++++++++++ .../components/badges/hover_badge_spec.js | 50 +++++++++++++++++ .../issuable/list/components/issuable_item_spec.js | 2 +- .../show/components/issuable_header_spec.js | 36 ++++--------- spec/helpers/application_helper_spec.rb | 4 +- spec/helpers/issuables_helper_spec.rb | 35 ------------ spec/lib/api/helpers_spec.rb | 21 ++++---- .../importers/pull_request_importer_spec.rb | 62 ++++++++++++++++++++++ spec/models/ci/pipeline_spec.rb | 19 +++---- spec/requests/api/usage_data_spec.rb | 10 ++-- 20 files changed, 355 insertions(+), 169 deletions(-) create mode 100644 spec/frontend/issuable/components/hidden_badge_spec.js create mode 100644 spec/frontend/issuable/components/locked_badge_spec.js create mode 100644 spec/frontend/vue_shared/components/badges/__snapshots__/experiment_badge_spec.js.snap create mode 100644 spec/frontend/vue_shared/components/badges/experiment_badge_spec.js create mode 100644 spec/frontend/vue_shared/components/badges/hover_badge_spec.js (limited to 'spec') diff --git a/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb b/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb index 0dbb42a633b..a20f75be9cf 100644 --- a/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb +++ b/spec/features/merge_request/admin_views_hidden_merge_request_spec.rb @@ -16,12 +16,12 @@ RSpec.describe 'Admin views hidden merge request', feature_category: :insider_th end it 'shows a hidden merge request icon' do - page.within('.detail-page-header-body') do - tooltip = format(_('This %{issuable} is hidden because its author has been banned'), - issuable: _('merge request')) - expect(page).to have_css("div[data-testid='hidden'][title='#{tooltip}']") - expect(page).to have_css('svg[data-testid="spam-icon"]') - end + expect(page).to have_css 'svg[data-testid="spam-icon"]' + + find('svg[data-testid="spam-icon"]').hover + + expect(page).to have_text format(_('This %{issuable} is hidden because its author has been banned.'), + issuable: _('merge request')) end end end diff --git a/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb b/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb index e7727fbb9dc..7e33946f713 100644 --- a/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb +++ b/spec/features/merge_requests/admin_views_hidden_merge_requests_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Admin views hidden merge requests', feature_category: :insider_t it 'shows a hidden merge request icon' do page.within("#merge_request_#{merge_request.id}") do - tooltip = format(_('This %{issuable} is hidden because its author has been banned'), + tooltip = format(_('This %{issuable} is hidden because its author has been banned.'), issuable: _('merge request')) expect(page).to have_css("span[title='#{tooltip}']") expect(page).to have_css('svg[data-testid="spam-icon"]') diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js index 95b5712bab0..179614b08b6 100644 --- a/spec/frontend/boards/board_card_inner_spec.js +++ b/spec/frontend/boards/board_card_inner_spec.js @@ -235,7 +235,7 @@ describe('Board card component', () => { expect(tooltip).toBeDefined(); expect(findHiddenIssueIcon().attributes('title')).toBe( - 'This issue is hidden because its author has been banned', + 'This issue is hidden because its author has been banned.', ); }); }); diff --git a/spec/frontend/issuable/components/hidden_badge_spec.js b/spec/frontend/issuable/components/hidden_badge_spec.js new file mode 100644 index 00000000000..db2248bb2d2 --- /dev/null +++ b/spec/frontend/issuable/components/hidden_badge_spec.js @@ -0,0 +1,45 @@ +import { GlBadge, GlIcon } from '@gitlab/ui'; +import { shallowMount } from '@vue/test-utils'; +import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; +import HiddenBadge from '~/issuable/components/hidden_badge.vue'; + +describe('HiddenBadge component', () => { + let wrapper; + + const mountComponent = () => { + wrapper = shallowMount(HiddenBadge, { + directives: { + GlTooltip: createMockDirective('gl-tooltip'), + }, + propsData: { + issuableType: 'issue', + }, + }); + }; + + const findBadge = () => wrapper.findComponent(GlBadge); + const findIcon = () => wrapper.findComponent(GlIcon); + + beforeEach(() => { + mountComponent(); + }); + + it('renders warning badge', () => { + expect(findBadge().text()).toBe('Hidden'); + expect(findBadge().props('variant')).toEqual('warning'); + }); + + it('renders spam icon', () => { + expect(findIcon().props('name')).toBe('spam'); + }); + + it('has tooltip', () => { + expect(getBinding(wrapper.element, 'gl-tooltip')).not.toBeUndefined(); + }); + + it('has title', () => { + expect(findBadge().attributes('title')).toBe( + 'This issue is hidden because its author has been banned.', + ); + }); +}); diff --git a/spec/frontend/issuable/components/locked_badge_spec.js b/spec/frontend/issuable/components/locked_badge_spec.js new file mode 100644 index 00000000000..73ab6e36ba1 --- /dev/null +++ b/spec/frontend/issuable/components/locked_badge_spec.js @@ -0,0 +1,45 @@ +import { GlBadge, GlIcon } from '@gitlab/ui'; +import { shallowMount } from '@vue/test-utils'; +import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; +import LockedBadge from '~/issuable/components/locked_badge.vue'; + +describe('LockedBadge component', () => { + let wrapper; + + const mountComponent = () => { + wrapper = shallowMount(LockedBadge, { + directives: { + GlTooltip: createMockDirective('gl-tooltip'), + }, + propsData: { + issuableType: 'issue', + }, + }); + }; + + const findBadge = () => wrapper.findComponent(GlBadge); + const findIcon = () => wrapper.findComponent(GlIcon); + + beforeEach(() => { + mountComponent(); + }); + + it('renders warning badge', () => { + expect(findBadge().text()).toBe('Locked'); + expect(findBadge().props('variant')).toEqual('warning'); + }); + + it('renders lock icon', () => { + expect(findIcon().props('name')).toBe('lock'); + }); + + it('has tooltip', () => { + expect(getBinding(wrapper.element, 'gl-tooltip')).not.toBeUndefined(); + }); + + it('has title', () => { + expect(findBadge().attributes('title')).toBe( + 'This issue is locked. Only project members can comment.', + ); + }); +}); diff --git a/spec/frontend/issues/show/components/sticky_header_spec.js b/spec/frontend/issues/show/components/sticky_header_spec.js index dd41e3034eb..a909084956f 100644 --- a/spec/frontend/issues/show/components/sticky_header_spec.js +++ b/spec/frontend/issues/show/components/sticky_header_spec.js @@ -1,6 +1,7 @@ -import { GlIcon } from '@gitlab/ui'; -import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; +import { GlIcon, GlLink } from '@gitlab/ui'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import HiddenBadge from '~/issuable/components/hidden_badge.vue'; +import LockedBadge from '~/issuable/components/locked_badge.vue'; import { issuableStatusText, STATUS_CLOSED, @@ -17,14 +18,12 @@ describe('StickyHeader component', () => { let wrapper; const findConfidentialBadge = () => wrapper.findComponent(ConfidentialityBadge); - const findHiddenBadge = () => wrapper.findByTestId('hidden'); - const findLockedBadge = () => wrapper.findByTestId('locked'); + const findHiddenBadge = () => wrapper.findComponent(HiddenBadge); + const findLockedBadge = () => wrapper.findComponent(LockedBadge); + const findTitle = () => wrapper.findComponent(GlLink); const createComponent = (props = {}) => { wrapper = shallowMountExtended(StickyHeader, { - directives: { - GlTooltip: createMockDirective('gl-tooltip'), - }, propsData: { issuableStatus: STATUS_OPEN, issuableType: TYPE_ISSUE, @@ -90,13 +89,6 @@ describe('StickyHeader component', () => { const lockedBadge = findLockedBadge(); expect(lockedBadge.exists()).toBe(isLocked); - - if (isLocked) { - expect(lockedBadge.attributes('title')).toBe( - 'This issue is locked. Only project members can comment.', - ); - expect(getBinding(lockedBadge.element, 'gl-tooltip')).not.toBeUndefined(); - } }); it.each` @@ -108,18 +100,11 @@ describe('StickyHeader component', () => { const hiddenBadge = findHiddenBadge(); expect(hiddenBadge.exists()).toBe(isHidden); - - if (isHidden) { - expect(hiddenBadge.attributes('title')).toBe( - 'This issue is hidden because its author has been banned', - ); - expect(getBinding(hiddenBadge.element, 'gl-tooltip')).not.toBeUndefined(); - } }); it('shows with title', () => { createComponent(); - const title = wrapper.find('a'); + const title = findTitle(); expect(title.text()).toContain('A sticky issue'); expect(title.attributes('href')).toBe('#top'); diff --git a/spec/frontend/merge_requests/components/header_metadata_spec.js b/spec/frontend/merge_requests/components/header_metadata_spec.js index 2823b4b9d97..64df71e1128 100644 --- a/spec/frontend/merge_requests/components/header_metadata_spec.js +++ b/spec/frontend/merge_requests/components/header_metadata_spec.js @@ -1,5 +1,6 @@ -import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; -import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import { shallowMount } from '@vue/test-utils'; +import HiddenBadge from '~/issuable/components/hidden_badge.vue'; +import LockedBadge from '~/issuable/components/locked_badge.vue'; import HeaderMetadata from '~/merge_requests/components/header_metadata.vue'; import mrStore from '~/mr_notes/stores'; import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue'; @@ -9,21 +10,18 @@ jest.mock('~/mr_notes/stores', () => jest.requireActual('helpers/mocks/mr_notes/ describe('HeaderMetadata component', () => { let wrapper; - const findConfidentialIcon = () => wrapper.findComponent(ConfidentialityBadge); - const findLockedIcon = () => wrapper.findByTestId('locked'); - const findHiddenIcon = () => wrapper.findByTestId('hidden'); + const findConfidentialBadge = () => wrapper.findComponent(ConfidentialityBadge); + const findLockedBadge = () => wrapper.findComponent(LockedBadge); + const findHiddenBadge = () => wrapper.findComponent(HiddenBadge); const renderTestMessage = (renders) => (renders ? 'renders' : 'does not render'); const createComponent = ({ store, provide }) => { - wrapper = shallowMountExtended(HeaderMetadata, { + wrapper = shallowMount(HeaderMetadata, { mocks: { $store: store, }, provide, - directives: { - GlTooltip: createMockDirective('gl-tooltip'), - }, }); }; @@ -51,42 +49,24 @@ describe('HeaderMetadata component', () => { createComponent({ store, provide: { hidden: hiddenStatus } }); }); - it(`${renderTestMessage(lockStatus)} the locked icon`, () => { - const lockedIcon = findLockedIcon(); - - expect(lockedIcon.exists()).toBe(lockStatus); - - if (lockStatus) { - expect(lockedIcon.attributes('title')).toBe( - `This merge request is locked. Only project members can comment.`, - ); - expect(getBinding(lockedIcon.element, 'gl-tooltip')).not.toBeUndefined(); - } - }); - - it(`${renderTestMessage(confidentialStatus)} the confidential icon`, () => { - const confidentialIcon = findConfidentialIcon(); - expect(confidentialIcon.exists()).toBe(confidentialStatus); + it(`${renderTestMessage(confidentialStatus)} the confidential badge`, () => { + const confidentialBadge = findConfidentialBadge(); + expect(confidentialBadge.exists()).toBe(confidentialStatus); if (confidentialStatus && !hiddenStatus) { - expect(confidentialIcon.props()).toMatchObject({ + expect(confidentialBadge.props()).toMatchObject({ workspaceType: 'project', issuableType: 'issue', }); } }); - it(`${renderTestMessage(confidentialStatus)} the hidden icon`, () => { - const hiddenIcon = findHiddenIcon(); - - expect(hiddenIcon.exists()).toBe(hiddenStatus); + it(`${renderTestMessage(lockStatus)} the locked badge`, () => { + expect(findLockedBadge().exists()).toBe(lockStatus); + }); - if (hiddenStatus) { - expect(hiddenIcon.attributes('title')).toBe( - `This merge request is hidden because its author has been banned`, - ); - expect(getBinding(hiddenIcon.element, 'gl-tooltip')).not.toBeUndefined(); - } + it(`${renderTestMessage(hiddenStatus)} the hidden badge`, () => { + expect(findHiddenBadge().exists()).toBe(hiddenStatus); }); }, ); diff --git a/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap b/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap index 359aaacde0b..499a971d791 100644 --- a/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap +++ b/spec/frontend/vue_shared/components/badges/__snapshots__/beta_badge_spec.js.snap @@ -2,22 +2,15 @@ exports[`Beta badge component renders the badge 1`] = `
- Beta - - +

A Beta feature is not production-ready, but is unlikely to change drastically before it's released. We encourage users to try Beta features and provide feedback. @@ -43,6 +36,6 @@ exports[`Beta badge component renders the badge 1`] = ` Is complete or near completion. - +

`; diff --git a/spec/frontend/vue_shared/components/badges/__snapshots__/experiment_badge_spec.js.snap b/spec/frontend/vue_shared/components/badges/__snapshots__/experiment_badge_spec.js.snap new file mode 100644 index 00000000000..4ad70338f3c --- /dev/null +++ b/spec/frontend/vue_shared/components/badges/__snapshots__/experiment_badge_spec.js.snap @@ -0,0 +1,41 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Experiment badge component renders the badge 1`] = ` +
+ + Experiment + +
+

+ An Experiment is a feature that's in the process of being developed. It's not production-ready. We encourage users to try Experimental features and provide feedback. +

+

+ An Experiment: +

+
    +
  • + May be unstable. +
  • +
  • + Can cause data loss. +
  • +
  • + Has no support and might not be documented. +
  • +
  • + Can be removed at any time. +
  • +
+
+
+`; diff --git a/spec/frontend/vue_shared/components/badges/beta_badge_spec.js b/spec/frontend/vue_shared/components/badges/beta_badge_spec.js index c930c6d5708..d826ca5c7c0 100644 --- a/spec/frontend/vue_shared/components/badges/beta_badge_spec.js +++ b/spec/frontend/vue_shared/components/badges/beta_badge_spec.js @@ -1,4 +1,4 @@ -import { shallowMount } from '@vue/test-utils'; +import { mount } from '@vue/test-utils'; import { GlBadge } from '@gitlab/ui'; import BetaBadge from '~/vue_shared/components/badges/beta_badge.vue'; @@ -7,7 +7,7 @@ describe('Beta badge component', () => { const findBadge = () => wrapper.findComponent(GlBadge); const createWrapper = (props = {}) => { - wrapper = shallowMount(BetaBadge, { + wrapper = mount(BetaBadge, { propsData: { ...props }, }); }; diff --git a/spec/frontend/vue_shared/components/badges/experiment_badge_spec.js b/spec/frontend/vue_shared/components/badges/experiment_badge_spec.js new file mode 100644 index 00000000000..3239578a173 --- /dev/null +++ b/spec/frontend/vue_shared/components/badges/experiment_badge_spec.js @@ -0,0 +1,32 @@ +import { mount } from '@vue/test-utils'; +import { GlBadge } from '@gitlab/ui'; +import ExperimentBadge from '~/vue_shared/components/badges/experiment_badge.vue'; + +describe('Experiment badge component', () => { + let wrapper; + + const findBadge = () => wrapper.findComponent(GlBadge); + const createWrapper = (props = {}) => { + wrapper = mount(ExperimentBadge, { + propsData: { ...props }, + }); + }; + + it('renders the badge', () => { + createWrapper(); + + expect(wrapper.element).toMatchSnapshot(); + }); + + it('passes default size to badge', () => { + createWrapper(); + + expect(findBadge().props('size')).toBe('md'); + }); + + it('passes given size to badge', () => { + createWrapper({ size: 'sm' }); + + expect(findBadge().props('size')).toBe('sm'); + }); +}); diff --git a/spec/frontend/vue_shared/components/badges/hover_badge_spec.js b/spec/frontend/vue_shared/components/badges/hover_badge_spec.js new file mode 100644 index 00000000000..68f368215c0 --- /dev/null +++ b/spec/frontend/vue_shared/components/badges/hover_badge_spec.js @@ -0,0 +1,50 @@ +import { mount } from '@vue/test-utils'; +import { GlBadge, GlPopover } from '@gitlab/ui'; +import HoverBadge from '~/vue_shared/components/badges/hover_badge.vue'; + +describe('Hover badge component', () => { + let wrapper; + + const findBadge = () => wrapper.findComponent(GlBadge); + const findPopover = () => wrapper.findComponent(GlPopover); + const createWrapper = ({ props = {}, slots } = {}) => { + wrapper = mount(HoverBadge, { + propsData: { + label: 'Label', + title: 'Title', + ...props, + }, + slots, + }); + }; + + it('passes label to popover', () => { + createWrapper(); + + expect(findBadge().text()).toBe('Label'); + }); + + it('passes title to popover', () => { + createWrapper(); + + expect(findPopover().props('title')).toBe('Title'); + }); + + it('renders the default slot', () => { + createWrapper({ slots: { default: '

This is an awesome content

' } }); + + expect(findPopover().text()).toContain('This is an awesome content'); + }); + + it('passes default size to badge', () => { + createWrapper(); + + expect(findBadge().props('size')).toBe('md'); + }); + + it('passes given size to badge', () => { + createWrapper({ props: { size: 'sm' } }); + + expect(findBadge().props('size')).toBe('sm'); + }); +}); diff --git a/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js b/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js index d353e336977..47da111b604 100644 --- a/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js +++ b/spec/frontend/vue_shared/issuable/list/components/issuable_item_spec.js @@ -352,7 +352,7 @@ describe('IssuableItem', () => { expect(hiddenIcon.props('name')).toBe('spam'); expect(hiddenIcon.attributes()).toMatchObject({ - title: 'This issue is hidden because its author has been banned', + title: 'This issue is hidden because its author has been banned.', arialabel: 'Hidden', }); }); diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js index 3b6f06d835b..03395e5dfc0 100644 --- a/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js +++ b/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js @@ -2,6 +2,8 @@ import { GlBadge, GlButton, GlIcon, GlLink, GlSprintf } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; import { resetHTMLFixture, setHTMLFixture } from 'helpers/fixtures'; import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; +import HiddenBadge from '~/issuable/components/hidden_badge.vue'; +import LockedBadge from '~/issuable/components/locked_badge.vue'; import { STATUS_CLOSED, STATUS_OPEN, STATUS_REOPENED, TYPE_ISSUE } from '~/issues/constants'; import { __ } from '~/locale'; import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue'; @@ -23,8 +25,8 @@ describe('IssuableHeader component', () => { wrapper.findAllComponents(GlIcon).filter((component) => component.props('name') === name); const findIcon = (name) => findGlIconWithName(name).exists() ? findGlIconWithName(name).at(0) : undefined; - const findBlockedIcon = () => findIcon('lock'); - const findHiddenIcon = () => findIcon('spam'); + const findBlockedBadge = () => wrapper.findComponent(LockedBadge); + const findHiddenBadge = () => wrapper.findComponent(HiddenBadge); const findExternalLinkIcon = () => findIcon('external-link'); const findFirstContributionIcon = () => findIcon('first-contribution'); const findComponentTooltip = (component) => getBinding(component.element, 'gl-tooltip'); @@ -111,49 +113,31 @@ describe('IssuableHeader component', () => { }); }); - describe('blocked icon', () => { + describe('blocked badge', () => { it('renders when issuable is blocked', () => { createComponent({ blocked: true }); - expect(findBlockedIcon().props('ariaLabel')).toBe('Blocked'); - }); - - it('has tooltip', () => { - createComponent({ blocked: true }); - - expect(findComponentTooltip(findBlockedIcon())).toBeDefined(); - expect(findBlockedIcon().attributes('title')).toBe( - 'This issue is locked. Only project members can comment.', - ); + expect(findBlockedBadge().props('issuableType')).toBe('issue'); }); it('does not render when issuable is not blocked', () => { createComponent({ blocked: false }); - expect(findBlockedIcon()).toBeUndefined(); + expect(findBlockedBadge().exists()).toBe(false); }); }); - describe('hidden icon', () => { + describe('hidden badge', () => { it('renders when issuable is hidden', () => { createComponent({ isHidden: true }); - expect(findHiddenIcon().props('ariaLabel')).toBe('Hidden'); - }); - - it('has tooltip', () => { - createComponent({ isHidden: true }); - - expect(findComponentTooltip(findHiddenIcon())).toBeDefined(); - expect(findHiddenIcon().attributes('title')).toBe( - 'This issue is hidden because its author has been banned', - ); + expect(findHiddenBadge().props('issuableType')).toBe('issue'); }); it('does not render when issuable is not hidden', () => { createComponent({ isHidden: false }); - expect(findHiddenIcon()).toBeUndefined(); + expect(findHiddenBadge().exists()).toBe(false); }); }); diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 757f832faa4..7cf64c6e049 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -922,14 +922,14 @@ RSpec.describe ApplicationHelper do context 'when resource is an issue' do let_it_be(:resource) { build(:issue) } - let(:expected_title) { 'This issue is hidden because its author has been banned' } + let(:expected_title) { 'This issue is hidden because its author has been banned.' } it_behaves_like 'returns icon with tooltip' end context 'when resource is a merge request' do let_it_be(:resource) { build(:merge_request) } - let(:expected_title) { 'This merge request is hidden because its author has been banned' } + let(:expected_title) { 'This merge request is hidden because its author has been banned.' } it_behaves_like 'returns icon with tooltip' end diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb index 9fe820ccae9..f0377b1cb20 100644 --- a/spec/helpers/issuables_helper_spec.rb +++ b/spec/helpers/issuables_helper_spec.rb @@ -568,41 +568,6 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do end end - describe '#state_name_with_icon' do - let_it_be(:project) { create(:project, :repository) } - - context 'for an issue' do - let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:issue_closed) { create(:issue, :closed, project: project) } - - it 'returns the correct state name and icon when issue is open' do - expect(helper.state_name_with_icon(issue)).to match_array([_('Open'), 'issues']) - end - - it 'returns the correct state name and icon when issue is closed' do - expect(helper.state_name_with_icon(issue_closed)).to match_array([_('Closed'), 'issue-closed']) - end - end - - context 'for a merge request' do - let_it_be(:merge_request) { create(:merge_request, source_project: project) } - let_it_be(:merge_request_merged) { create(:merge_request, :merged, source_project: project) } - let_it_be(:merge_request_closed) { create(:merge_request, :closed, source_project: project) } - - it 'returns the correct state name and icon when merge request is open' do - expect(helper.state_name_with_icon(merge_request)).to match_array([_('Open'), 'merge-request-open']) - end - - it 'returns the correct state name and icon when merge request is merged' do - expect(helper.state_name_with_icon(merge_request_merged)).to match_array([_('Merged'), 'merge']) - end - - it 'returns the correct state name and icon when merge request is closed' do - expect(helper.state_name_with_icon(merge_request_closed)).to match_array([_('Closed'), 'merge-request-close']) - end - end - end - describe '#issuable_type_selector_data' do using RSpec::Parameterized::TableSyntax diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb index dd62343890e..9e7e174f4f0 100644 --- a/spec/lib/api/helpers_spec.rb +++ b/spec/lib/api/helpers_spec.rb @@ -773,21 +773,21 @@ RSpec.describe API::Helpers, feature_category: :shared do end describe '#track_event' do - let(:user_id) { 345 } - let(:namespace_id) { 12 } - let(:project_id) { 56 } + let_it_be(:user) { create(:user) } + let_it_be(:namespace) { create(:namespace) } + let_it_be(:project) { create(:project) } let(:event_name) { 'i_compliance_dashboard' } let(:unknown_event) { 'unknown' } it 'tracks internal event' do expect(Gitlab::InternalEvents).to receive(:track_event).with( event_name, - user_id: user_id, - namespace_id: namespace_id, - project_id: project_id + user: user, + namespace: namespace, + project: project ) - helper.track_event(event_name, user_id: user_id, namespace_id: namespace_id, project_id: project_id) + helper.track_event(event_name, user: user, namespace_id: namespace.id, project_id: project.id) end it 'logs an exception for unknown event' do @@ -797,13 +797,14 @@ RSpec.describe API::Helpers, feature_category: :shared do instance_of(Gitlab::InternalEvents::UnknownEventError), event_name: unknown_event ) - helper.track_event(unknown_event, user_id: user_id, namespace_id: namespace_id, project_id: project_id) + + helper.track_event(unknown_event, user: user, namespace_id: namespace.id, project_id: project.id) end - it 'does not track event for nil user_id' do + it 'does not track event for nil user' do expect(Gitlab::InternalEvents).not_to receive(:track_event) - helper.track_event(unknown_event, user_id: nil, namespace_id: namespace_id, project_id: project_id) + helper.track_event(unknown_event, user: nil, namespace_id: namespace.id, project_id: project.id) end end diff --git a/spec/lib/gitlab/bitbucket_server_import/importers/pull_request_importer_spec.rb b/spec/lib/gitlab/bitbucket_server_import/importers/pull_request_importer_spec.rb index 3c84d888c92..1ae68f9efb8 100644 --- a/spec/lib/gitlab/bitbucket_server_import/importers/pull_request_importer_spec.rb +++ b/spec/lib/gitlab/bitbucket_server_import/importers/pull_request_importer_spec.rb @@ -48,6 +48,68 @@ RSpec.describe Gitlab::BitbucketServerImport::Importers::PullRequestImporter, fe end end + describe 'merge request diff head_commit_sha' do + before do + allow(pull_request).to receive(:source_branch_sha).and_return(source_branch_sha) + end + + context 'when a commit with the source_branch_sha exists' do + let(:source_branch_sha) { project.repository.head_commit.sha } + + it 'is equal to the source_branch_sha' do + importer.execute + + merge_request = project.merge_requests.find_by_iid(pull_request.iid) + + expect(merge_request.merge_request_diffs.first.head_commit_sha).to eq(source_branch_sha) + end + end + + context 'when a commit with the source_branch_sha does not exist' do + let(:source_branch_sha) { 'x' * Commit::MIN_SHA_LENGTH } + + it 'is nil' do + importer.execute + + merge_request = project.merge_requests.find_by_iid(pull_request.iid) + + expect(merge_request.merge_request_diffs.first.head_commit_sha).to be_nil + end + + context 'when a commit containing the sha in the message exists' do + let(:source_branch_sha) { project.repository.head_commit.sha } + + it 'is equal to the sha' do + message = " + Squashed commit of the following: + + commit #{source_branch_sha} + Author: John Smith + Date: Mon Sep 18 15:58:38 2023 +0200 + + My commit message + " + + Files::CreateService.new( + project, + project.creator, + start_branch: 'master', + branch_name: 'master', + commit_message: message, + file_path: 'files/lfs/ruby.rb', + file_content: 'testing' + ).execute + + importer.execute + + merge_request = project.merge_requests.find_by_iid(pull_request.iid) + + expect(merge_request.merge_request_diffs.first.head_commit_sha).to eq(source_branch_sha) + end + end + end + end + it 'logs its progress' do expect(Gitlab::BitbucketServerImport::Logger) .to receive(:info).with(include(message: 'starting', iid: pull_request.iid)).and_call_original diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 7e572e2fdc6..76ebd1dbf5e 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -3250,22 +3250,23 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category: shared_examples 'a method that returns all merge requests for a given pipeline' do let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: pipeline_project, ref: 'master') } + let(:merge_request) do + create( + :merge_request, + source_project: pipeline_project, + target_project: project, + source_branch: pipeline.ref + ) + end it 'returns all merge requests having the same source branch and the pipeline sha' do - merge_request = create(:merge_request, source_project: pipeline_project, target_project: project, source_branch: pipeline.ref) - - create(:merge_request_diff, merge_request: merge_request).tap do |diff| - create(:merge_request_diff_commit, merge_request_diff: diff, sha: pipeline.sha) - end + create(:merge_request_diff_commit, merge_request_diff: merge_request.merge_request_diff, sha: pipeline.sha) expect(pipeline.all_merge_requests).to eq([merge_request]) end it "doesn't return merge requests having the same source branch without the pipeline sha" do - merge_request = create(:merge_request, source_project: pipeline_project, target_project: project, source_branch: pipeline.ref) - create(:merge_request_diff, merge_request: merge_request).tap do |diff| - create(:merge_request_diff_commit, merge_request_diff: diff, sha: 'unrelated') - end + create(:merge_request_diff_commit, merge_request_diff: merge_request.merge_request_diff, sha: 'unrelated') expect(pipeline.all_merge_requests).to be_empty end diff --git a/spec/requests/api/usage_data_spec.rb b/spec/requests/api/usage_data_spec.rb index c8f1e8d6973..d296566853e 100644 --- a/spec/requests/api/usage_data_spec.rb +++ b/spec/requests/api/usage_data_spec.rb @@ -200,6 +200,9 @@ RSpec.describe API::UsageData, feature_category: :service_ping do end context 'with authentication' do + let_it_be(:namespace) { create(:namespace) } + let_it_be(:project) { create(:project) } + before do stub_application_setting(usage_ping_enabled: true) allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(true) @@ -207,11 +210,10 @@ RSpec.describe API::UsageData, feature_category: :service_ping do context 'with correct params' do it 'returns status ok' do - expect(Gitlab::InternalEvents).to receive(:track_event).with(known_event, anything) - # allow other events to also get triggered - allow(Gitlab::InternalEvents).to receive(:track_event) + expect(Gitlab::InternalEvents).to receive(:track_event) + .with(known_event, user: user, namespace: namespace, project: project) - post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id } + post api(endpoint, user), params: { event: known_event, namespace_id: namespace.id, project_id: project.id } expect(response).to have_gitlab_http_status(:ok) end -- cgit v1.2.3