summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-02-15 21:12:52 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-02-15 21:12:52 +0000
commit1760f824bb6bcac278e95493805dff70a5b2a75b (patch)
tree3027cf76234f2586cb409e27a6efbd33d5dae7c9 /spec
parent0f50c47cd7f7b88cc61e954d601b90fe7d12aac3 (diff)
downloadgitlab-ce-1760f824bb6bcac278e95493805dff70a5b2a75b.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb4
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap4
-rw-r--r--spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap4
-rw-r--r--spec/frontend/vue_shared/components/markdown/field_spec.js31
-rw-r--r--spec/frontend/vue_shared/components/markdown/header_spec.js34
-rw-r--r--spec/helpers/storage_helper_spec.rb83
-rw-r--r--spec/models/container_repository_spec.rb49
-rw-r--r--spec/models/namespace_spec.rb9
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 &gt; 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