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
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/frontend/behaviors/markdown/render_metrics_spec.js54
-rw-r--r--spec/frontend/monitoring/components/embeds/embed_group_spec.js163
-rw-r--r--spec/frontend/monitoring/components/embeds/metric_embed_spec.js (renamed from spec/frontend/monitoring/embed/embed_spec.js)6
-rw-r--r--spec/frontend/monitoring/components/embeds/mock_data.js (renamed from spec/frontend/monitoring/embed/mock_data.js)33
-rw-r--r--spec/frontend/monitoring/components/panel_type_spec.js72
-rw-r--r--spec/frontend/monitoring/mock_data.js17
-rw-r--r--spec/frontend/monitoring/store/embed_group/actions_spec.js16
-rw-r--r--spec/frontend/monitoring/store/embed_group/getters_spec.js19
-rw-r--r--spec/frontend/monitoring/store/embed_group/mutations_spec.js16
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb79
-rw-r--r--spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb2
-rw-r--r--spec/lib/gitlab/database/batch_count_spec.rb8
12 files changed, 385 insertions, 100 deletions
diff --git a/spec/frontend/behaviors/markdown/render_metrics_spec.js b/spec/frontend/behaviors/markdown/render_metrics_spec.js
index 9157d2a8448..3f7beeb817b 100644
--- a/spec/frontend/behaviors/markdown/render_metrics_spec.js
+++ b/spec/frontend/behaviors/markdown/render_metrics_spec.js
@@ -1,37 +1,49 @@
-import Vue from 'vue';
import { TEST_HOST } from 'helpers/test_constants';
import renderMetrics from '~/behaviors/markdown/render_metrics';
-const originalExtend = Vue.extend;
+const mockEmbedGroup = jest.fn();
-describe('Render metrics for Gitlab Flavoured Markdown', () => {
- const container = {
- Metrics() {},
- };
-
- let spyExtend;
-
- beforeEach(() => {
- Vue.extend = () => container.Metrics;
- spyExtend = jest.spyOn(Vue, 'extend');
- });
+jest.mock('vue', () => ({ extend: () => mockEmbedGroup }));
+jest.mock('~/monitoring/components/embeds/embed_group.vue', () => jest.fn());
+jest.mock('~/monitoring/stores/embed_group/', () => ({ createStore: jest.fn() }));
- afterEach(() => {
- Vue.extend = originalExtend;
- });
+const getElements = () => Array.from(document.getElementsByClassName('js-render-metrics'));
+describe('Render metrics for Gitlab Flavoured Markdown', () => {
it('does nothing when no elements are found', () => {
renderMetrics([]);
- expect(spyExtend).not.toHaveBeenCalled();
+ expect(mockEmbedGroup).not.toHaveBeenCalled();
});
it('renders a vue component when elements are found', () => {
- const element = document.createElement('div');
- element.setAttribute('data-dashboard-url', TEST_HOST);
+ document.body.innerHTML = `<div class="js-render-metrics" data-dashboard-url="${TEST_HOST}"></div>`;
- renderMetrics([element]);
+ renderMetrics(getElements());
+
+ expect(mockEmbedGroup).toHaveBeenCalledTimes(1);
+ expect(mockEmbedGroup).toHaveBeenCalledWith(
+ expect.objectContaining({ propsData: { urls: [`${TEST_HOST}`] } }),
+ );
+ });
- expect(spyExtend).toHaveBeenCalled();
+ it('takes sibling metrics and groups them under a shared parent', () => {
+ document.body.innerHTML = `
+ <p><span>Hello</span></p>
+ <div class="js-render-metrics" data-dashboard-url="${TEST_HOST}/1"></div>
+ <div class="js-render-metrics" data-dashboard-url="${TEST_HOST}/2"></div>
+ <p><span>Hello</span></p>
+ <div class="js-render-metrics" data-dashboard-url="${TEST_HOST}/3"></div>
+ `;
+
+ renderMetrics(getElements());
+
+ expect(mockEmbedGroup).toHaveBeenCalledTimes(2);
+ expect(mockEmbedGroup).toHaveBeenCalledWith(
+ expect.objectContaining({ propsData: { urls: [`${TEST_HOST}/1`, `${TEST_HOST}/2`] } }),
+ );
+ expect(mockEmbedGroup).toHaveBeenCalledWith(
+ expect.objectContaining({ propsData: { urls: [`${TEST_HOST}/3`] } }),
+ );
});
});
diff --git a/spec/frontend/monitoring/components/embeds/embed_group_spec.js b/spec/frontend/monitoring/components/embeds/embed_group_spec.js
new file mode 100644
index 00000000000..54d21def603
--- /dev/null
+++ b/spec/frontend/monitoring/components/embeds/embed_group_spec.js
@@ -0,0 +1,163 @@
+import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
+import Vuex from 'vuex';
+import { GlButton, GlCard } from '@gitlab/ui';
+import { TEST_HOST } from 'helpers/test_constants';
+import EmbedGroup from '~/monitoring/components/embeds/embed_group.vue';
+import MetricEmbed from '~/monitoring/components/embeds/metric_embed.vue';
+import {
+ addModuleAction,
+ initialEmbedGroupState,
+ singleEmbedProps,
+ dashboardEmbedProps,
+ multipleEmbedProps,
+} from './mock_data';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('Embed Group', () => {
+ let wrapper;
+ let store;
+ const metricsWithDataGetter = jest.fn();
+
+ function mountComponent({ urls = [TEST_HOST], shallow = true, stubs } = {}) {
+ const mountMethod = shallow ? shallowMount : mount;
+ wrapper = mountMethod(EmbedGroup, {
+ localVue,
+ store,
+ propsData: {
+ urls,
+ },
+ stubs,
+ });
+ }
+
+ beforeEach(() => {
+ store = new Vuex.Store({
+ modules: {
+ embedGroup: {
+ namespaced: true,
+ actions: { addModule: jest.fn() },
+ getters: { metricsWithData: metricsWithDataGetter },
+ state: initialEmbedGroupState,
+ },
+ },
+ });
+ store.registerModule = jest.fn();
+ jest.spyOn(store, 'dispatch');
+ });
+
+ afterEach(() => {
+ metricsWithDataGetter.mockReset();
+ if (wrapper) {
+ wrapper.destroy();
+ }
+ });
+
+ describe('interactivity', () => {
+ it('hides the component when no chart data is loaded', () => {
+ metricsWithDataGetter.mockReturnValue([]);
+ mountComponent();
+
+ expect(wrapper.find(GlCard).isVisible()).toBe(false);
+ });
+
+ it('shows the component when chart data is loaded', () => {
+ metricsWithDataGetter.mockReturnValue([1]);
+ mountComponent();
+
+ expect(wrapper.find(GlCard).isVisible()).toBe(true);
+ });
+
+ it('is expanded by default', () => {
+ metricsWithDataGetter.mockReturnValue([1]);
+ mountComponent({ shallow: false, stubs: { MetricEmbed: '<div />' } });
+
+ expect(wrapper.find('.card-body').classes()).not.toContain('d-none');
+ });
+
+ it('collapses when clicked', done => {
+ metricsWithDataGetter.mockReturnValue([1]);
+ mountComponent({ shallow: false, stubs: { MetricEmbed: '<div />' } });
+
+ wrapper.find(GlButton).trigger('click');
+
+ wrapper.vm.$nextTick(() => {
+ expect(wrapper.find('.card-body').classes()).toContain('d-none');
+ done();
+ });
+ });
+ });
+
+ describe('single metrics', () => {
+ beforeEach(() => {
+ metricsWithDataGetter.mockReturnValue([1]);
+ mountComponent();
+ });
+
+ it('renders an Embed component', () => {
+ expect(wrapper.find(MetricEmbed).exists()).toBe(true);
+ });
+
+ it('passes the correct props to the Embed component', () => {
+ expect(wrapper.find(MetricEmbed).props()).toEqual(singleEmbedProps());
+ });
+
+ it('adds the monitoring dashboard module', () => {
+ expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/0');
+ });
+ });
+
+ describe('dashboard metrics', () => {
+ beforeEach(() => {
+ metricsWithDataGetter.mockReturnValue([2]);
+ mountComponent();
+ });
+
+ it('passes the correct props to the dashboard Embed component', () => {
+ expect(wrapper.find(MetricEmbed).props()).toEqual(dashboardEmbedProps());
+ });
+
+ it('adds the monitoring dashboard module', () => {
+ expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/0');
+ });
+ });
+
+ describe('multiple metrics', () => {
+ beforeEach(() => {
+ metricsWithDataGetter.mockReturnValue([1, 1]);
+ mountComponent({ urls: [TEST_HOST, TEST_HOST] });
+ });
+
+ it('creates Embed components', () => {
+ expect(wrapper.findAll(MetricEmbed)).toHaveLength(2);
+ });
+
+ it('passes the correct props to the Embed components', () => {
+ expect(wrapper.findAll(MetricEmbed).wrappers.map(item => item.props())).toEqual(
+ multipleEmbedProps(),
+ );
+ });
+
+ it('adds multiple monitoring dashboard modules', () => {
+ expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/0');
+ expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/1');
+ });
+ });
+
+ describe('button text', () => {
+ it('has a singular label when there is one embed', () => {
+ metricsWithDataGetter.mockReturnValue([1]);
+ mountComponent({ shallow: false, stubs: { MetricEmbed: '<div />' } });
+
+ expect(wrapper.find(GlButton).text()).toBe('Hide chart');
+ });
+
+ it('has a plural label when there are multiple embeds', () => {
+ metricsWithDataGetter.mockReturnValue([2]);
+ mountComponent({ shallow: false, stubs: { MetricEmbed: '<div />' } });
+
+ expect(wrapper.find(GlButton).text()).toBe('Hide charts');
+ });
+ });
+});
diff --git a/spec/frontend/monitoring/embed/embed_spec.js b/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
index 850092c4a72..d0fe22cefec 100644
--- a/spec/frontend/monitoring/embed/embed_spec.js
+++ b/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
@@ -2,20 +2,20 @@ import { createLocalVue, shallowMount } from '@vue/test-utils';
import Vuex from 'vuex';
import PanelType from 'ee_else_ce/monitoring/components/panel_type.vue';
import { TEST_HOST } from 'helpers/test_constants';
-import Embed from '~/monitoring/components/embed.vue';
+import MetricEmbed from '~/monitoring/components/embeds/metric_embed.vue';
import { groups, initialState, metricsData, metricsWithData } from './mock_data';
const localVue = createLocalVue();
localVue.use(Vuex);
-describe('Embed', () => {
+describe('MetricEmbed', () => {
let wrapper;
let store;
let actions;
let metricsWithDataGetter;
function mountComponent() {
- wrapper = shallowMount(Embed, {
+ wrapper = shallowMount(MetricEmbed, {
localVue,
store,
propsData: {
diff --git a/spec/frontend/monitoring/embed/mock_data.js b/spec/frontend/monitoring/components/embeds/mock_data.js
index da8eb8c0fc4..9cf66e52d22 100644
--- a/spec/frontend/monitoring/embed/mock_data.js
+++ b/spec/frontend/monitoring/components/embeds/mock_data.js
@@ -1,3 +1,5 @@
+import { TEST_HOST } from 'helpers/test_constants';
+
export const metricsWithData = ['15_metric_a', '16_metric_b'];
export const groups = [
@@ -52,3 +54,34 @@ export const initialState = () => ({
},
useDashboardEndpoint: true,
});
+
+export const initialEmbedGroupState = () => ({
+ modules: [],
+});
+
+export const singleEmbedProps = () => ({
+ dashboardUrl: TEST_HOST,
+ containerClass: 'col-lg-12',
+ namespace: 'monitoringDashboard/0',
+});
+
+export const dashboardEmbedProps = () => ({
+ dashboardUrl: TEST_HOST,
+ containerClass: 'col-lg-6',
+ namespace: 'monitoringDashboard/0',
+});
+
+export const multipleEmbedProps = () => [
+ {
+ dashboardUrl: TEST_HOST,
+ containerClass: 'col-lg-6',
+ namespace: 'monitoringDashboard/0',
+ },
+ {
+ dashboardUrl: TEST_HOST,
+ containerClass: 'col-lg-6',
+ namespace: 'monitoringDashboard/1',
+ },
+];
+
+export const addModuleAction = 'embedGroup/addModule';
diff --git a/spec/frontend/monitoring/components/panel_type_spec.js b/spec/frontend/monitoring/components/panel_type_spec.js
index 927d93ab697..782a276a91b 100644
--- a/spec/frontend/monitoring/components/panel_type_spec.js
+++ b/spec/frontend/monitoring/components/panel_type_spec.js
@@ -8,8 +8,17 @@ import PanelType from '~/monitoring/components/panel_type.vue';
import EmptyChart from '~/monitoring/components/charts/empty_chart.vue';
import TimeSeriesChart from '~/monitoring/components/charts/time_series.vue';
import AnomalyChart from '~/monitoring/components/charts/anomaly.vue';
-import { anomalyMockGraphData, graphDataPrometheusQueryRange } from 'jest/monitoring/mock_data';
-import { createStore } from '~/monitoring/stores';
+import {
+ anomalyMockGraphData,
+ graphDataPrometheusQueryRange,
+ mockLogsHref,
+ mockLogsPath,
+ mockNamespace,
+ mockNamespacedData,
+ mockTimeRange,
+} from 'jest/monitoring/mock_data';
+import { createStore, monitoringDashboard } from '~/monitoring/stores';
+import { createStore as createEmbedGroupStore } from '~/monitoring/stores/embed_group';
global.IS_EE = true;
global.URL.createObjectURL = jest.fn();
@@ -29,6 +38,7 @@ describe('Panel Type component', () => {
const exampleText = 'example_text';
const findCopyLink = () => wrapper.find({ ref: 'copyChartLink' });
+ const findTimeChart = () => wrapper.find({ ref: 'timeChart' });
const createWrapper = props => {
wrapper = shallowMount(PanelType, {
@@ -99,8 +109,6 @@ describe('Panel Type component', () => {
});
describe('when graph data is available', () => {
- const findTimeChart = () => wrapper.find({ ref: 'timeChart' });
-
beforeEach(() => {
createWrapper({
graphData: graphDataPrometheusQueryRange,
@@ -242,10 +250,6 @@ describe('Panel Type component', () => {
});
describe('View Logs dropdown item', () => {
- const mockLogsPath = '/path/to/logs';
- const mockTimeRange = { duration: { seconds: 120 } };
-
- const findTimeChart = () => wrapper.find({ ref: 'timeChart' });
const findViewLogsLink = () => wrapper.find({ ref: 'viewLogsLink' });
beforeEach(() => {
@@ -292,8 +296,7 @@ describe('Panel Type component', () => {
state.timeRange = mockTimeRange;
return wrapper.vm.$nextTick(() => {
- const href = `${mockLogsPath}?duration_seconds=${mockTimeRange.duration.seconds}`;
- expect(findViewLogsLink().attributes('href')).toMatch(href);
+ expect(findViewLogsLink().attributes('href')).toMatch(mockLogsHref);
});
});
@@ -388,4 +391,53 @@ describe('Panel Type component', () => {
});
});
});
+
+ describe('when using dynamic modules', () => {
+ const { mockDeploymentData, mockProjectPath } = mockNamespacedData;
+
+ beforeEach(() => {
+ store = createEmbedGroupStore();
+ store.registerModule(mockNamespace, monitoringDashboard);
+ store.state.embedGroup.modules.push(mockNamespace);
+
+ wrapper = shallowMount(PanelType, {
+ propsData: {
+ graphData: graphDataPrometheusQueryRange,
+ namespace: mockNamespace,
+ },
+ store,
+ mocks,
+ });
+ });
+
+ it('handles namespaced time range and logs path state', () => {
+ store.state[mockNamespace].timeRange = mockTimeRange;
+ store.state[mockNamespace].logsPath = mockLogsPath;
+
+ return wrapper.vm.$nextTick().then(() => {
+ expect(wrapper.find({ ref: 'viewLogsLink' }).attributes().href).toBe(mockLogsHref);
+ });
+ });
+
+ it('handles namespaced deployment data state', () => {
+ store.state[mockNamespace].deploymentData = mockDeploymentData;
+
+ return wrapper.vm.$nextTick().then(() => {
+ expect(findTimeChart().props().deploymentData).toEqual(mockDeploymentData);
+ });
+ });
+
+ it('handles namespaced project path state', () => {
+ store.state[mockNamespace].projectPath = mockProjectPath;
+
+ return wrapper.vm.$nextTick().then(() => {
+ expect(findTimeChart().props().projectPath).toBe(mockProjectPath);
+ });
+ });
+
+ it('it renders a time series chart with no errors', () => {
+ expect(wrapper.find(TimeSeriesChart).isVueInstance()).toBe(true);
+ expect(wrapper.find(TimeSeriesChart).exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/monitoring/mock_data.js b/spec/frontend/monitoring/mock_data.js
index 284b7a0997f..58693723624 100644
--- a/spec/frontend/monitoring/mock_data.js
+++ b/spec/frontend/monitoring/mock_data.js
@@ -750,3 +750,20 @@ export const barMockData = {
},
],
};
+
+export const baseNamespace = 'monitoringDashboard';
+
+export const mockNamespace = `${baseNamespace}/1`;
+
+export const mockNamespaces = [`${baseNamespace}/1`, `${baseNamespace}/2`];
+
+export const mockTimeRange = { duration: { seconds: 120 } };
+
+export const mockNamespacedData = {
+ mockDeploymentData: ['mockDeploymentData'],
+ mockProjectPath: '/mockProjectPath',
+};
+
+export const mockLogsPath = '/mockLogsPath';
+
+export const mockLogsHref = `${mockLogsPath}?duration_seconds=${mockTimeRange.duration.seconds}`;
diff --git a/spec/frontend/monitoring/store/embed_group/actions_spec.js b/spec/frontend/monitoring/store/embed_group/actions_spec.js
new file mode 100644
index 00000000000..5bdfc506cff
--- /dev/null
+++ b/spec/frontend/monitoring/store/embed_group/actions_spec.js
@@ -0,0 +1,16 @@
+// import store from '~/monitoring/stores/embed_group';
+import * as actions from '~/monitoring/stores/embed_group/actions';
+import * as types from '~/monitoring/stores/embed_group/mutation_types';
+import { mockNamespace } from '../../mock_data';
+
+describe('Embed group actions', () => {
+ describe('addModule', () => {
+ it('adds a module to the store', () => {
+ const commit = jest.fn();
+
+ actions.addModule({ commit }, mockNamespace);
+
+ expect(commit).toHaveBeenCalledWith(types.ADD_MODULE, mockNamespace);
+ });
+ });
+});
diff --git a/spec/frontend/monitoring/store/embed_group/getters_spec.js b/spec/frontend/monitoring/store/embed_group/getters_spec.js
new file mode 100644
index 00000000000..e3241e41f5e
--- /dev/null
+++ b/spec/frontend/monitoring/store/embed_group/getters_spec.js
@@ -0,0 +1,19 @@
+import { metricsWithData } from '~/monitoring/stores/embed_group/getters';
+import { mockNamespaces } from '../../mock_data';
+
+describe('Embed group getters', () => {
+ describe('metricsWithData', () => {
+ it('correctly sums the number of metrics with data', () => {
+ const mockMetric = {};
+ const state = {
+ modules: mockNamespaces,
+ };
+ const rootGetters = {
+ [`${mockNamespaces[0]}/metricsWithData`]: () => [mockMetric],
+ [`${mockNamespaces[1]}/metricsWithData`]: () => [mockMetric, mockMetric],
+ };
+
+ expect(metricsWithData(state, null, null, rootGetters)).toEqual([1, 2]);
+ });
+ });
+});
diff --git a/spec/frontend/monitoring/store/embed_group/mutations_spec.js b/spec/frontend/monitoring/store/embed_group/mutations_spec.js
new file mode 100644
index 00000000000..a1d04e23e41
--- /dev/null
+++ b/spec/frontend/monitoring/store/embed_group/mutations_spec.js
@@ -0,0 +1,16 @@
+import state from '~/monitoring/stores/embed_group/state';
+import mutations from '~/monitoring/stores/embed_group/mutations';
+import * as types from '~/monitoring/stores/embed_group/mutation_types';
+import { mockNamespace } from '../../mock_data';
+
+describe('Embed group mutations', () => {
+ describe('ADD_MODULE', () => {
+ it('should add a module', () => {
+ const stateCopy = state();
+
+ mutations[types.ADD_MODULE](stateCopy, mockNamespace);
+
+ expect(stateCopy.modules).toEqual([mockNamespace]);
+ });
+ });
+});
diff --git a/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb
index 4c4359ad5d2..b5f0783cb42 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb
@@ -45,7 +45,7 @@ describe Gitlab::Ci::Pipeline::Chain::Config::Content do
subject.perform!
expect(pipeline.config_source).to eq 'auto_devops_source'
- template = Gitlab::Template::GitlabCiYmlTemplate.find('Beta/Auto-DevOps')
+ template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
expect(command.config_content).to eq(template.content)
end
end
@@ -78,7 +78,7 @@ describe Gitlab::Ci::Pipeline::Chain::Config::Content do
expect(pipeline.config_source).to eq 'auto_devops_source'
expect(pipeline.pipeline_config).to be_nil
- template = Gitlab::Template::GitlabCiYmlTemplate.find('Beta/Auto-DevOps')
+ template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
expect(command.config_content).to eq(template.content)
end
end
@@ -91,7 +91,7 @@ describe Gitlab::Ci::Pipeline::Chain::Config::Content do
expect(pipeline.config_source).to eq 'auto_devops_source'
expect(pipeline.pipeline_config).to be_nil
- template = Gitlab::Template::GitlabCiYmlTemplate.find('Beta/Auto-DevOps')
+ template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
expect(command.config_content).to eq(template.content)
end
end
@@ -122,34 +122,13 @@ describe Gitlab::Ci::Pipeline::Chain::Config::Content do
expect(project).to receive(:auto_devops_enabled?).and_return(true)
end
- context 'when beta is enabled' do
- before do
- stub_feature_flags(auto_devops_beta: true)
- end
-
- it 'returns the content of AutoDevops template' do
- subject.perform!
-
- expect(pipeline.config_source).to eq 'auto_devops_source'
- expect(pipeline.pipeline_config).to be_nil
- template = Gitlab::Template::GitlabCiYmlTemplate.find('Beta/Auto-DevOps')
- expect(command.config_content).to eq(template.content)
- end
- end
-
- context 'when beta is disabled' do
- before do
- stub_feature_flags(auto_devops_beta: false)
- end
-
- it 'returns the content of AutoDevops template' do
- subject.perform!
+ it 'returns the content of AutoDevops template' do
+ subject.perform!
- expect(pipeline.config_source).to eq 'auto_devops_source'
- expect(pipeline.pipeline_config).to be_nil
- template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
- expect(command.config_content).to eq(template.content)
- end
+ expect(pipeline.config_source).to eq 'auto_devops_source'
+ expect(pipeline.pipeline_config).to be_nil
+ template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
+ expect(command.config_content).to eq(template.content)
end
end
@@ -285,7 +264,7 @@ describe Gitlab::Ci::Pipeline::Chain::Config::Content do
<<~EOY
---
include:
- - template: Beta/Auto-DevOps.gitlab-ci.yml
+ - template: Auto-DevOps.gitlab-ci.yml
EOY
end
@@ -293,40 +272,12 @@ describe Gitlab::Ci::Pipeline::Chain::Config::Content do
expect(project).to receive(:auto_devops_enabled?).and_return(true)
end
- context 'when beta is enabled' do
- before do
- stub_feature_flags(auto_devops_beta: true)
- end
-
- it 'builds root config including the auto-devops template' do
- subject.perform!
-
- expect(pipeline.config_source).to eq 'auto_devops_source'
- expect(pipeline.pipeline_config.content).to eq(config_content_result)
- expect(command.config_content).to eq(config_content_result)
- end
- end
-
- context 'when beta is disabled' do
- before do
- stub_feature_flags(auto_devops_beta: false)
- end
-
- let(:config_content_result) do
- <<~EOY
- ---
- include:
- - template: Auto-DevOps.gitlab-ci.yml
- EOY
- end
-
- it 'builds root config including the auto-devops template' do
- subject.perform!
+ it 'builds root config including the auto-devops template' do
+ subject.perform!
- expect(pipeline.config_source).to eq 'auto_devops_source'
- expect(pipeline.pipeline_config.content).to eq(config_content_result)
- expect(command.config_content).to eq(config_content_result)
- end
+ expect(pipeline.config_source).to eq 'auto_devops_source'
+ expect(pipeline.pipeline_config.content).to eq(config_content_result)
+ expect(command.config_content).to eq(config_content_result)
end
end
diff --git a/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
index 12600d97b2f..0c5d172f17c 100644
--- a/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
@@ -133,8 +133,6 @@ describe 'Auto-DevOps.gitlab-ci.yml' do
end
with_them do
- subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Beta/Auto-DevOps') }
-
let(:user) { create(:admin) }
let(:project) { create(:project, :custom_repo, files: files) }
let(:service) { Ci::CreatePipelineService.new(project, user, ref: 'master' ) }
diff --git a/spec/lib/gitlab/database/batch_count_spec.rb b/spec/lib/gitlab/database/batch_count_spec.rb
index 0731791d9b0..b126d8579fc 100644
--- a/spec/lib/gitlab/database/batch_count_spec.rb
+++ b/spec/lib/gitlab/database/batch_count_spec.rb
@@ -90,5 +90,13 @@ describe Gitlab::Database::BatchCount do
[1, 2, 4, 5, 6].each { |i| expect(described_class.batch_distinct_count(model, column, batch_size: i)).to eq(2) }
end
+
+ it 'counts with a start and finish' do
+ expect(described_class.batch_distinct_count(model, column, start: model.minimum(column), finish: model.maximum(column))).to eq(2)
+ end
+
+ it 'counts with User min and max as start and finish' do
+ expect(described_class.batch_distinct_count(model, column, start: User.minimum(:id), finish: User.maximum(:id))).to eq(2)
+ end
end
end