diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-15 21:12:52 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-15 21:12:52 +0000 |
commit | 1760f824bb6bcac278e95493805dff70a5b2a75b (patch) | |
tree | 3027cf76234f2586cb409e27a6efbd33d5dae7c9 /spec | |
parent | 0f50c47cd7f7b88cc61e954d601b90fe7d12aac3 (diff) | |
download | gitlab-ce-1760f824bb6bcac278e95493805dff70a5b2a75b.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
8 files changed, 181 insertions, 37 deletions
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb index 393108d8407..1779567624c 100644 --- a/spec/features/merge_request/user_posts_notes_spec.rb +++ b/spec/features/merge_request/user_posts_notes_spec.rb @@ -133,7 +133,7 @@ RSpec.describe 'Merge request > User posts notes', :js do describe 'when previewing a note' do it 'shows the toolbar buttons when editing a note' do page.within('.js-main-target-form') do - expect(page).to have_css('.md-header-toolbar.active') + expect(page).to have_css('.md-header-toolbar') end end @@ -141,7 +141,7 @@ RSpec.describe 'Merge request > User posts notes', :js do wait_for_requests find('.js-md-preview-button').click page.within('.js-main-target-form') do - expect(page).not_to have_css('.md-header-toolbar.active') + expect(page).not_to have_css('.md-header-toolbar') end end end diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap index a6f3e00fde1..d82af8f9e63 100644 --- a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap +++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap @@ -38,8 +38,8 @@ exports[`packages_list_app renders 1`] = ` class="gl-font-size-h-display gl-line-height-36 h4" > - There are no packages yet - + There are no packages yet + </h1> <p diff --git a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap index ed96abe24b1..0154486e224 100644 --- a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap +++ b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap @@ -38,8 +38,8 @@ exports[`PackagesListApp renders 1`] = ` class="gl-font-size-h-display gl-line-height-36 h4" > - There are no packages yet - + There are no packages yet + </h1> <p diff --git a/spec/frontend/vue_shared/components/markdown/field_spec.js b/spec/frontend/vue_shared/components/markdown/field_spec.js index 80f94d87588..c7ad47b6ef7 100644 --- a/spec/frontend/vue_shared/components/markdown/field_spec.js +++ b/spec/frontend/vue_shared/components/markdown/field_spec.js @@ -1,10 +1,10 @@ -import { mount } from '@vue/test-utils'; import { nextTick } from 'vue'; import AxiosMockAdapter from 'axios-mock-adapter'; import $ from 'jquery'; import { TEST_HOST, FIXTURES_PATH } from 'spec/test_constants'; import axios from '~/lib/utils/axios_utils'; import MarkdownField from '~/vue_shared/components/markdown/field.vue'; +import { mountExtended } from 'helpers/vue_test_utils_helper'; const markdownPreviewPath = `${TEST_HOST}/preview`; const markdownDocsPath = `${TEST_HOST}/docs`; @@ -12,8 +12,8 @@ const textareaValue = 'testing\n123'; const uploadsPath = 'test/uploads'; function assertMarkdownTabs(isWrite, writeLink, previewLink, wrapper) { - expect(writeLink.element.parentNode.classList.contains('active')).toBe(isWrite); - expect(previewLink.element.parentNode.classList.contains('active')).toBe(!isWrite); + expect(writeLink.element.children[0].classList.contains('active')).toBe(isWrite); + expect(previewLink.element.children[0].classList.contains('active')).toBe(!isWrite); expect(wrapper.find('.md-preview-holder').element.style.display).toBe(isWrite ? 'none' : ''); } @@ -29,14 +29,13 @@ describe('Markdown field component', () => { afterEach(() => { subject.destroy(); - subject = null; axiosMock.restore(); }); function createSubject(lines = []) { // We actually mount a wrapper component so that we can force Vue to rerender classes in order to test a regression // caused by mixing Vanilla JS and Vue. - subject = mount( + subject = mountExtended( { components: { MarkdownField, @@ -72,8 +71,8 @@ describe('Markdown field component', () => { ); } - const getPreviewLink = () => subject.find('.nav-links .js-preview-link'); - const getWriteLink = () => subject.find('.nav-links .js-write-link'); + const getPreviewLink = () => subject.findByTestId('preview-tab'); + const getWriteLink = () => subject.findByTestId('write-tab'); const getMarkdownButton = () => subject.find('.js-md'); const getAllMarkdownButtons = () => subject.findAll('.js-md'); const getVideo = () => subject.find('video'); @@ -107,15 +106,15 @@ describe('Markdown field component', () => { it('sets preview link as active', async () => { previewLink = getPreviewLink(); - previewLink.trigger('click'); + previewLink.vm.$emit('click', { target: {} }); await nextTick(); - expect(previewLink.element.parentNode.classList.contains('active')).toBeTruthy(); + expect(previewLink.element.children[0].classList.contains('active')).toBe(true); }); it('shows preview loading text', async () => { previewLink = getPreviewLink(); - previewLink.trigger('click'); + previewLink.vm.$emit('click', { target: {} }); await nextTick(); expect(subject.find('.md-preview-holder').element.textContent.trim()).toContain('Loading…'); @@ -126,7 +125,7 @@ describe('Markdown field component', () => { previewLink = getPreviewLink(); - previewLink.trigger('click'); + previewLink.vm.$emit('click', { target: {} }); await axios.waitFor(markdownPreviewPath); expect(subject.find('.md-preview-holder').element.innerHTML).toContain(previewHTML); @@ -135,7 +134,7 @@ describe('Markdown field component', () => { it('calls video.pause() on comment input when isSubmitting is changed to true', async () => { previewLink = getPreviewLink(); - previewLink.trigger('click'); + previewLink.vm.$emit('click', { target: {} }); await axios.waitFor(markdownPreviewPath); const video = getVideo(); @@ -151,19 +150,19 @@ describe('Markdown field component', () => { writeLink = getWriteLink(); previewLink = getPreviewLink(); - writeLink.trigger('click'); + writeLink.vm.$emit('click', { target: {} }); await nextTick(); assertMarkdownTabs(true, writeLink, previewLink, subject); - writeLink.trigger('click'); + writeLink.vm.$emit('click', { target: {} }); await nextTick(); assertMarkdownTabs(true, writeLink, previewLink, subject); - previewLink.trigger('click'); + previewLink.vm.$emit('click', { target: {} }); await nextTick(); assertMarkdownTabs(false, writeLink, previewLink, subject); - previewLink.trigger('click'); + previewLink.vm.$emit('click', { target: {} }); await nextTick(); assertMarkdownTabs(false, writeLink, previewLink, subject); diff --git a/spec/frontend/vue_shared/components/markdown/header_spec.js b/spec/frontend/vue_shared/components/markdown/header_spec.js index 70ee72b7e2c..93ce3935fab 100644 --- a/spec/frontend/vue_shared/components/markdown/header_spec.js +++ b/spec/frontend/vue_shared/components/markdown/header_spec.js @@ -1,21 +1,25 @@ -import { shallowMount } from '@vue/test-utils'; import $ from 'jquery'; import { nextTick } from 'vue'; +import { GlTabs } from '@gitlab/ui'; import HeaderComponent from '~/vue_shared/components/markdown/header.vue'; import ToolbarButton from '~/vue_shared/components/markdown/toolbar_button.vue'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; describe('Markdown field header component', () => { let wrapper; const createWrapper = (props) => { - wrapper = shallowMount(HeaderComponent, { + wrapper = shallowMountExtended(HeaderComponent, { propsData: { previewMarkdown: false, ...props, }, + stubs: { GlTabs }, }); }; + const findWriteTab = () => wrapper.findByTestId('write-tab'); + const findPreviewTab = () => wrapper.findByTestId('preview-tab'); const findToolbarButtons = () => wrapper.findAll(ToolbarButton); const findToolbarButtonByProp = (prop, value) => findToolbarButtons() @@ -34,7 +38,6 @@ describe('Markdown field header component', () => { afterEach(() => { wrapper.destroy(); - wrapper = null; }); describe('markdown header buttons', () => { @@ -75,23 +78,26 @@ describe('Markdown field header component', () => { }); }); - it('renders `write` link as active when previewMarkdown is false', () => { - expect(wrapper.find('li:nth-child(1)').classes()).toContain('active'); + it('activates `write` tab when previewMarkdown is false', () => { + expect(findWriteTab().attributes('active')).toBe('true'); + expect(findPreviewTab().attributes('active')).toBeUndefined(); }); - it('renders `preview` link as active when previewMarkdown is true', () => { + it('activates `preview` tab when previewMarkdown is true', () => { createWrapper({ previewMarkdown: true }); - expect(wrapper.find('li:nth-child(2)').classes()).toContain('active'); + expect(findWriteTab().attributes('active')).toBeUndefined(); + expect(findPreviewTab().attributes('active')).toBe('true'); }); - it('emits toggle markdown event when clicking preview', async () => { - wrapper.find('.js-preview-link').trigger('click'); + it('emits toggle markdown event when clicking preview tab', async () => { + const eventData = { target: {} }; + findPreviewTab().vm.$emit('click', eventData); await nextTick(); expect(wrapper.emitted('preview-markdown').length).toEqual(1); - wrapper.find('.js-write-link').trigger('click'); + findWriteTab().vm.$emit('click', eventData); await nextTick(); expect(wrapper.emitted('write-markdown').length).toEqual(1); @@ -109,12 +115,10 @@ describe('Markdown field header component', () => { }); it('blurs preview link after click', () => { - const link = wrapper.find('li:nth-child(2) button'); - jest.spyOn(HTMLElement.prototype, 'blur').mockImplementation(); + const target = { blur: jest.fn() }; + findPreviewTab().vm.$emit('click', { target }); - link.trigger('click'); - - expect(link.element.blur).toHaveBeenCalled(); + expect(target.blur).toHaveBeenCalled(); }); it('renders markdown table template', () => { diff --git a/spec/helpers/storage_helper_spec.rb b/spec/helpers/storage_helper_spec.rb index d0646b30161..82b78ed831c 100644 --- a/spec/helpers/storage_helper_spec.rb +++ b/spec/helpers/storage_helper_spec.rb @@ -50,4 +50,87 @@ RSpec.describe StorageHelper do expect(helper.storage_counters_details(namespace_stats)).to eq(message) end end + + describe "storage_enforcement_banner" do + let_it_be_with_refind(:current_user) { create(:user) } + let_it_be(:free_group) { create(:group) } + let_it_be(:paid_group) { create(:group) } + + before do + allow(helper).to receive(:current_user) { current_user } + allow(Gitlab).to receive(:com?).and_return(true) + allow(paid_group).to receive(:paid?).and_return(true) + end + + describe "#storage_enforcement_banner_info" do + it 'returns nil when namespace is not free' do + expect(storage_enforcement_banner_info(paid_group)).to be(nil) + end + + it 'returns nil when storage_enforcement_date is not set' do + allow(free_group).to receive(:storage_enforcement_date).and_return(nil) + + expect(storage_enforcement_banner_info(free_group)).to be(nil) + end + + it 'returns a hash when storage_enforcement_date is set' do + storage_enforcement_date = Date.today + 30 + allow(free_group).to receive(:storage_enforcement_date).and_return(storage_enforcement_date) + + expect(storage_enforcement_banner_info(free_group)).to eql({ + text: "From #{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in <strong>Group Settings > Usage quotas</strong>.", + variant: 'warning', + callouts_feature_name: 'storage_enforcement_banner_second_enforcement_threshold', + callouts_path: '/-/users/group_callouts', + learn_more_link: '<a rel="noopener noreferrer" target="_blank" href="/help//">Learn more.</a>' + }) + end + + context 'when storage_enforcement_date is set and dismissed callout exists' do + before do + create(:group_callout, + user: current_user, + group_id: free_group.id, + feature_name: 'storage_enforcement_banner_second_enforcement_threshold') + storage_enforcement_date = Date.today + 30 + allow(free_group).to receive(:storage_enforcement_date).and_return(storage_enforcement_date) + end + + it { expect(storage_enforcement_banner_info(free_group)).to be(nil) } + end + + context 'callouts_feature_name' do + let(:days_from_now) { 45 } + + subject do + storage_enforcement_date = Date.today + days_from_now + allow(free_group).to receive(:storage_enforcement_date).and_return(storage_enforcement_date) + + storage_enforcement_banner_info(free_group)[:callouts_feature_name] + end + + it 'returns first callouts_feature_name' do + is_expected.to eq('storage_enforcement_banner_first_enforcement_threshold') + end + + context 'returns second callouts_feature_name' do + let(:days_from_now) { 20 } + + it { is_expected.to eq('storage_enforcement_banner_second_enforcement_threshold') } + end + + context 'returns third callouts_feature_name' do + let(:days_from_now) { 13 } + + it { is_expected.to eq('storage_enforcement_banner_third_enforcement_threshold') } + end + + context 'returns fourth callouts_feature_name' do + let(:days_from_now) { 3 } + + it { is_expected.to eq('storage_enforcement_banner_fourth_enforcement_threshold') } + end + end + end + end end diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb index 3524c810ff4..7c0ae51223b 100644 --- a/spec/models/container_repository_spec.rb +++ b/spec/models/container_repository_spec.rb @@ -339,6 +339,55 @@ RSpec.describe ContainerRepository, :aggregate_failures do end end + context 'when triggering registry API requests' do + let(:repository_state) { nil } + let(:repository) { create(:container_repository, repository_state) } + + shared_examples 'a state machine configured with use_transactions: false' do + it 'executes the registry API request outside of a transaction', :delete do + expect(repository).to receive(:save).and_call_original do + expect(ApplicationRecord.connection.transaction_open?).to be true + end + + expect(repository).to receive(:try_import) do + expect(ApplicationRecord.connection.transaction_open?).to be false + end + + subject + end + end + + context 'when responding to a start_pre_import event' do + subject { repository.start_pre_import } + + it_behaves_like 'a state machine configured with use_transactions: false' + end + + context 'when responding to a retry_pre_import event' do + let(:repository_state) { :import_aborted } + + subject { repository.retry_pre_import } + + it_behaves_like 'a state machine configured with use_transactions: false' + end + + context 'when responding to a start_import event' do + let(:repository_state) { :pre_import_done } + + subject { repository.start_import } + + it_behaves_like 'a state machine configured with use_transactions: false' + end + + context 'when responding to a retry_import event' do + let(:repository_state) { :import_aborted } + + subject { repository.retry_import } + + it_behaves_like 'a state machine configured with use_transactions: false' + end + end + describe '#retry_aborted_migration' do subject { repository.retry_aborted_migration } diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index b6ab6be0ba2..481cae6031b 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -2219,4 +2219,13 @@ RSpec.describe Namespace do end end end + + describe 'storage_enforcement_date' do + let_it_be(:namespace) { create(:group) } + + # Date TBD: https://gitlab.com/gitlab-org/gitlab/-/issues/350632 + it 'returns false' do + expect(namespace.storage_enforcement_date).to be(nil) + end + end end |