Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/banzai/reference_parser/base_parser.rb2
-rw-r--r--spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js4
-rw-r--r--spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js24
-rw-r--r--spec/frontend/diffs/components/diff_stats_spec.js14
-rw-r--r--spec/frontend/error_tracking/components/error_details_spec.js15
-rw-r--r--spec/frontend/error_tracking_settings/components/app_spec.js4
-rw-r--r--spec/frontend/mr_popover/mr_popover_spec.js7
-rw-r--r--spec/frontend/reports/components/report_item_spec.js5
-rw-r--r--spec/frontend/repository/components/last_commit_spec.js32
-rw-r--r--spec/frontend/vue_shared/components/commit_spec.js13
-rw-r--r--spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js7
-rw-r--r--spec/lib/banzai/reference_parser/base_parser_spec.rb6
-rwxr-xr-x[-rw-r--r--]vendor/gitignore/C++.gitignore0
-rwxr-xr-x[-rw-r--r--]vendor/gitignore/Java.gitignore0
15 files changed, 100 insertions, 37 deletions
diff --git a/lib/banzai/reference_parser/base_parser.rb b/lib/banzai/reference_parser/base_parser.rb
index 8419769085a..9160c0e14cf 100644
--- a/lib/banzai/reference_parser/base_parser.rb
+++ b/lib/banzai/reference_parser/base_parser.rb
@@ -177,7 +177,7 @@ module Banzai
collection.where(id: to_query).each { |row| cache[row.id] = row }
end
- cache.values_at(*ids).compact
+ ids.uniq.map { |id| cache[id] }.compact
else
collection.where(id: ids)
end
diff --git a/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js b/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js
index 956bee7def8..76b262a5196 100644
--- a/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js
+++ b/spec/frontend/create_cluster/eks_cluster/components/cluster_form_dropdown_spec.js
@@ -216,6 +216,8 @@ describe('ClusterFormDropdown', () => {
$(dropdownEl).trigger('shown.bs.dropdown');
- expect(vm.find(DropdownSearchInput).props('focused')).toBe(true);
+ return vm.vm.$nextTick(() => {
+ expect(vm.find(DropdownSearchInput).props('focused')).toBe(true);
+ });
});
});
diff --git a/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js b/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js
index d3992c6751c..6c069de8af8 100644
--- a/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js
+++ b/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js
@@ -197,7 +197,9 @@ describe('EksClusterConfigurationForm', () => {
it('sets RoleDropdown hasErrors to true when loading roles failed', () => {
rolesState.loadingItemsError = new Error();
- expect(findRoleDropdown().props('hasErrors')).toEqual(true);
+ return Vue.nextTick().then(() => {
+ expect(findRoleDropdown().props('hasErrors')).toEqual(true);
+ });
});
it('sets isLoadingRegions to RegionDropdown loading property', () => {
@@ -215,7 +217,9 @@ describe('EksClusterConfigurationForm', () => {
it('sets loadingRegionsError to RegionDropdown error property', () => {
regionsState.loadingItemsError = new Error();
- expect(findRegionDropdown().props('hasErrors')).toEqual(true);
+ return Vue.nextTick().then(() => {
+ expect(findRegionDropdown().props('hasErrors')).toEqual(true);
+ });
});
it('disables KeyPairDropdown when no region is selected', () => {
@@ -245,7 +249,9 @@ describe('EksClusterConfigurationForm', () => {
it('sets KeyPairDropdown hasErrors to true when loading key pairs fails', () => {
keyPairsState.loadingItemsError = new Error();
- expect(findKeyPairDropdown().props('hasErrors')).toEqual(true);
+ return Vue.nextTick().then(() => {
+ expect(findKeyPairDropdown().props('hasErrors')).toEqual(true);
+ });
});
it('disables VpcDropdown when no region is selected', () => {
@@ -275,7 +281,9 @@ describe('EksClusterConfigurationForm', () => {
it('sets VpcDropdown hasErrors to true when loading vpcs fails', () => {
vpcsState.loadingItemsError = new Error();
- expect(findVpcDropdown().props('hasErrors')).toEqual(true);
+ return Vue.nextTick().then(() => {
+ expect(findVpcDropdown().props('hasErrors')).toEqual(true);
+ });
});
it('disables SubnetDropdown when no vpc is selected', () => {
@@ -305,7 +313,9 @@ describe('EksClusterConfigurationForm', () => {
it('sets SubnetDropdown hasErrors to true when loading subnets fails', () => {
subnetsState.loadingItemsError = new Error();
- expect(findSubnetDropdown().props('hasErrors')).toEqual(true);
+ return Vue.nextTick().then(() => {
+ expect(findSubnetDropdown().props('hasErrors')).toEqual(true);
+ });
});
it('disables SecurityGroupDropdown when no vpc is selected', () => {
@@ -335,7 +345,9 @@ describe('EksClusterConfigurationForm', () => {
it('sets SecurityGroupDropdown hasErrors to true when loading security groups fails', () => {
securityGroupsState.loadingItemsError = new Error();
- expect(findSecurityGroupDropdown().props('hasErrors')).toEqual(true);
+ return Vue.nextTick().then(() => {
+ expect(findSecurityGroupDropdown().props('hasErrors')).toEqual(true);
+ });
});
describe('when region is selected', () => {
diff --git a/spec/frontend/diffs/components/diff_stats_spec.js b/spec/frontend/diffs/components/diff_stats_spec.js
index 984b3026209..4482abf18c1 100644
--- a/spec/frontend/diffs/components/diff_stats_spec.js
+++ b/spec/frontend/diffs/components/diff_stats_spec.js
@@ -1,4 +1,5 @@
import { shallowMount } from '@vue/test-utils';
+import Icon from '~/vue_shared/components/icon.vue';
import DiffStats from '~/diffs/components/diff_stats.vue';
describe('diff_stats', () => {
@@ -22,9 +23,16 @@ describe('diff_stats', () => {
diffFilesLength: 300,
},
});
- const additions = wrapper.find('icon-stub[name="file-addition"]').element.parentNode;
- const deletions = wrapper.find('icon-stub[name="file-deletion"]').element.parentNode;
- const filesChanged = wrapper.find('icon-stub[name="doc-code"]').element.parentNode;
+
+ const findIcon = name =>
+ wrapper
+ .findAll(Icon)
+ .filter(c => c.attributes('name') === name)
+ .at(0).element.parentNode;
+
+ const additions = findIcon('file-addition');
+ const deletions = findIcon('file-deletion');
+ const filesChanged = findIcon('doc-code');
expect(additions.textContent).toContain('100');
expect(deletions.textContent).toContain('200');
diff --git a/spec/frontend/error_tracking/components/error_details_spec.js b/spec/frontend/error_tracking/components/error_details_spec.js
index 9847bec6f6c..eefaff4aba7 100644
--- a/spec/frontend/error_tracking/components/error_details_spec.js
+++ b/spec/frontend/error_tracking/components/error_details_spec.js
@@ -1,6 +1,6 @@
import { createLocalVue, shallowMount } from '@vue/test-utils';
import Vuex from 'vuex';
-import { GlLoadingIcon, GlLink, GlBadge } from '@gitlab/ui';
+import { GlLoadingIcon, GlLink, GlBadge, GlFormInput } from '@gitlab/ui';
import LoadingButton from '~/vue_shared/components/loading_button.vue';
import Stacktrace from '~/error_tracking/components/stacktrace.vue';
import ErrorDetails from '~/error_tracking/components/error_details.vue';
@@ -14,6 +14,11 @@ describe('ErrorDetails', () => {
let actions;
let getters;
+ const findInput = name => {
+ const inputs = wrapper.findAll(GlFormInput).filter(c => c.attributes('name') === name);
+ return inputs.length ? inputs.at(0) : inputs;
+ };
+
function mountComponent() {
wrapper = shallowMount(ErrorDetails, {
stubs: { LoadingButton },
@@ -136,15 +141,15 @@ describe('ErrorDetails', () => {
});
it('should send sentry_issue_identifier', () => {
- const sentryErrorIdInput = wrapper.find(
- 'glforminput-stub[name="issue[sentry_issue_attributes][sentry_issue_identifier]"',
+ const sentryErrorIdInput = findInput(
+ 'issue[sentry_issue_attributes][sentry_issue_identifier]',
);
expect(sentryErrorIdInput.attributes('value')).toBe('129381');
});
it('should set the form values with title and description', () => {
- const csrfTokenInput = wrapper.find('glforminput-stub[name="authenticity_token"]');
- const issueTitleInput = wrapper.find('glforminput-stub[name="issue[title]"]');
+ const csrfTokenInput = findInput('authenticity_token');
+ const issueTitleInput = findInput('issue[title]');
const issueDescriptionInput = wrapper.find('input[name="issue[description]"]');
expect(csrfTokenInput.attributes('value')).toBe('fakeToken');
expect(issueTitleInput.attributes('value')).toContain(wrapper.vm.issueTitle);
diff --git a/spec/frontend/error_tracking_settings/components/app_spec.js b/spec/frontend/error_tracking_settings/components/app_spec.js
index 0b86aad5b3e..5c3efa24551 100644
--- a/spec/frontend/error_tracking_settings/components/app_spec.js
+++ b/spec/frontend/error_tracking_settings/components/app_spec.js
@@ -57,7 +57,9 @@ describe('error tracking settings app', () => {
it('disables the button when saving', () => {
store.state.settingsLoading = true;
- expect(wrapper.find('.js-error-tracking-button').attributes('disabled')).toBeTruthy();
+ return wrapper.vm.$nextTick(() => {
+ expect(wrapper.find('.js-error-tracking-button').attributes('disabled')).toBeTruthy();
+ });
});
});
});
diff --git a/spec/frontend/mr_popover/mr_popover_spec.js b/spec/frontend/mr_popover/mr_popover_spec.js
index 909824be92b..0c0d4c73d91 100644
--- a/spec/frontend/mr_popover/mr_popover_spec.js
+++ b/spec/frontend/mr_popover/mr_popover_spec.js
@@ -1,5 +1,6 @@
import { shallowMount } from '@vue/test-utils';
import MRPopover from '~/mr_popover/components/mr_popover';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
describe('MR Popover', () => {
let wrapper;
@@ -23,7 +24,9 @@ describe('MR Popover', () => {
it('shows skeleton-loader while apollo is loading', () => {
wrapper.vm.$apollo.loading = true;
- expect(wrapper.element).toMatchSnapshot();
+ return wrapper.vm.$nextTick().then(() => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
});
describe('loaded state', () => {
@@ -58,7 +61,7 @@ describe('MR Popover', () => {
});
return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.contains('ciicon-stub')).toBe(false);
+ expect(wrapper.contains(CiIcon)).toBe(false);
});
});
});
diff --git a/spec/frontend/reports/components/report_item_spec.js b/spec/frontend/reports/components/report_item_spec.js
index bacbb399513..6aac07984e3 100644
--- a/spec/frontend/reports/components/report_item_spec.js
+++ b/spec/frontend/reports/components/report_item_spec.js
@@ -1,6 +1,7 @@
import { shallowMount } from '@vue/test-utils';
import { STATUS_SUCCESS } from '~/reports/constants';
import ReportItem from '~/reports/components/report_item.vue';
+import IssueStatusIcon from '~/reports/components/issue_status_icon.vue';
import { componentNames } from '~/reports/components/issue_body';
describe('ReportItem', () => {
@@ -15,7 +16,7 @@ describe('ReportItem', () => {
},
});
- expect(wrapper.find('issuestatusicon-stub').exists()).toBe(false);
+ expect(wrapper.find(IssueStatusIcon).exists()).toBe(false);
});
it('shows status icon when unspecified', () => {
@@ -27,7 +28,7 @@ describe('ReportItem', () => {
},
});
- expect(wrapper.find('issuestatusicon-stub').exists()).toBe(true);
+ expect(wrapper.find(IssueStatusIcon).exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/repository/components/last_commit_spec.js b/spec/frontend/repository/components/last_commit_spec.js
index c00cdeee05b..855837d8746 100644
--- a/spec/frontend/repository/components/last_commit_spec.js
+++ b/spec/frontend/repository/components/last_commit_spec.js
@@ -66,39 +66,51 @@ describe('Repository last commit component', () => {
it('renders commit widget', () => {
factory();
- expect(vm.element).toMatchSnapshot();
+ return vm.vm.$nextTick(() => {
+ expect(vm.element).toMatchSnapshot();
+ });
});
it('renders short commit ID', () => {
factory();
- expect(vm.find('.label-monospace').text()).toEqual('12345678');
+ return vm.vm.$nextTick(() => {
+ expect(vm.find('.label-monospace').text()).toEqual('12345678');
+ });
});
it('hides pipeline components when pipeline does not exist', () => {
factory(createCommitData({ pipeline: null }));
- expect(vm.find('.js-commit-pipeline').exists()).toBe(false);
+ return vm.vm.$nextTick(() => {
+ expect(vm.find('.js-commit-pipeline').exists()).toBe(false);
+ });
});
it('renders pipeline components', () => {
factory();
- expect(vm.find('.js-commit-pipeline').exists()).toBe(true);
+ return vm.vm.$nextTick(() => {
+ expect(vm.find('.js-commit-pipeline').exists()).toBe(true);
+ });
});
it('hides author component when author does not exist', () => {
factory(createCommitData({ author: null }));
- expect(vm.find('.js-user-link').exists()).toBe(false);
- expect(vm.find(UserAvatarLink).exists()).toBe(false);
+ return vm.vm.$nextTick(() => {
+ expect(vm.find('.js-user-link').exists()).toBe(false);
+ expect(vm.find(UserAvatarLink).exists()).toBe(false);
+ });
});
it('does not render description expander when description is null', () => {
factory(createCommitData({ description: null }));
- expect(vm.find('.text-expander').exists()).toBe(false);
- expect(vm.find('.commit-row-description').exists()).toBe(false);
+ return vm.vm.$nextTick(() => {
+ expect(vm.find('.text-expander').exists()).toBe(false);
+ expect(vm.find('.commit-row-description').exists()).toBe(false);
+ });
});
it('expands commit description when clicking expander', () => {
@@ -113,6 +125,8 @@ describe('Repository last commit component', () => {
it('renders the signature HTML as returned by the backend', () => {
factory(createCommitData({ signatureHtml: '<button>Verified</button>' }));
- expect(vm.element).toMatchSnapshot();
+ return vm.vm.$nextTick().then(() => {
+ expect(vm.element).toMatchSnapshot();
+ });
});
});
diff --git a/spec/frontend/vue_shared/components/commit_spec.js b/spec/frontend/vue_shared/components/commit_spec.js
index 34f3a54fce2..3607d4a0fd3 100644
--- a/spec/frontend/vue_shared/components/commit_spec.js
+++ b/spec/frontend/vue_shared/components/commit_spec.js
@@ -7,6 +7,11 @@ describe('Commit component', () => {
let props;
let wrapper;
+ const findIcon = name => {
+ const icons = wrapper.findAll(Icon).filter(c => c.attributes('name') === name);
+ return icons.length ? icons.at(0) : icons;
+ };
+
const findUserAvatar = () => wrapper.find(UserAvatarLink);
const createComponent = propsData => {
@@ -71,7 +76,7 @@ describe('Commit component', () => {
});
it('should render a tag icon if it represents a tag', () => {
- expect(wrapper.find('icon-stub[name="tag"]').exists()).toBe(true);
+ expect(findIcon('tag').exists()).toBe(true);
});
it('should render a link to the ref url', () => {
@@ -89,7 +94,7 @@ describe('Commit component', () => {
});
it('should render icon for commit', () => {
- expect(wrapper.find('icon-stub[name="commit"]').exists()).toBe(true);
+ expect(findIcon('commit').exists()).toBe(true);
});
describe('Given commit title and author props', () => {
@@ -162,7 +167,7 @@ describe('Commit component', () => {
expect(refEl.attributes('title')).toBe(props.commitRef.name);
- expect(wrapper.find('icon-stub[name="branch"]').exists()).toBe(true);
+ expect(findIcon('branch').exists()).toBe(true);
});
});
@@ -195,7 +200,7 @@ describe('Commit component', () => {
expect(refEl.attributes('title')).toBe(props.mergeRequestRef.title);
- expect(wrapper.find('icon-stub[name="git-merge"]').exists()).toBe(true);
+ expect(findIcon('git-merge').exists()).toBe(true);
});
});
diff --git a/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js b/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js
index 0d0e4ae4349..ffdeb25439c 100644
--- a/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js
+++ b/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js
@@ -49,7 +49,9 @@ describe('DropdownSearchInputComponent', () => {
wrapper.setProps({ focused: true });
- expect(inputEl.focus).toHaveBeenCalled();
+ return wrapper.vm.$nextTick().then(() => {
+ expect(inputEl.focus).toHaveBeenCalled();
+ });
});
});
});
diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
index 9f0cdc651b6..491e672b0e4 100644
--- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
+++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
@@ -147,9 +147,12 @@ describe('UserAvatarList', () => {
it('with collapse clicked, it renders avatars up to breakpoint', () => {
clickButton();
- const links = wrapper.findAll(UserAvatarLink);
- expect(links.length).toEqual(TEST_BREAKPOINT);
+ return wrapper.vm.$nextTick(() => {
+ const links = wrapper.findAll(UserAvatarLink);
+
+ expect(links.length).toEqual(TEST_BREAKPOINT);
+ });
});
});
});
diff --git a/spec/lib/banzai/reference_parser/base_parser_spec.rb b/spec/lib/banzai/reference_parser/base_parser_spec.rb
index 7897164d985..b1002c1db25 100644
--- a/spec/lib/banzai/reference_parser/base_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/base_parser_spec.rb
@@ -312,6 +312,12 @@ describe Banzai::ReferenceParser::BaseParser do
expect(subject.collection_objects_for_ids(Project, [project.id]))
.to eq([project])
end
+
+ it 'will not overflow the stack' do
+ ids = 1.upto(1_000_000).to_a
+
+ expect { subject.collection_objects_for_ids(User, ids) }.not_to raise_error
+ end
end
end
diff --git a/vendor/gitignore/C++.gitignore b/vendor/gitignore/C++.gitignore
index 259148fa18f..259148fa18f 100644..100755
--- a/vendor/gitignore/C++.gitignore
+++ b/vendor/gitignore/C++.gitignore
diff --git a/vendor/gitignore/Java.gitignore b/vendor/gitignore/Java.gitignore
index a1c2a238a96..a1c2a238a96 100644..100755
--- a/vendor/gitignore/Java.gitignore
+++ b/vendor/gitignore/Java.gitignore