summaryrefslogtreecommitdiff
path: root/spec/frontend
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-03-08 18:09:12 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-03-08 18:09:12 +0000
commit0179dc40d71c2549d787d2f5fa7ba6dc6efae376 (patch)
tree9709db4077ec0f3f471e9b8094b0de67a3ab947c /spec/frontend
parent770d6dbfa7111324f994f12664a2036c7121602a (diff)
downloadgitlab-ce-0179dc40d71c2549d787d2f5fa7ba6dc6efae376.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
-rw-r--r--spec/frontend/diffs/utils/file_reviews_spec.js10
-rw-r--r--spec/frontend/reports/components/grouped_test_reports_app_spec.js21
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js56
-rw-r--r--spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js101
4 files changed, 135 insertions, 53 deletions
diff --git a/spec/frontend/diffs/utils/file_reviews_spec.js b/spec/frontend/diffs/utils/file_reviews_spec.js
index a58c19a7245..230ec12409c 100644
--- a/spec/frontend/diffs/utils/file_reviews_spec.js
+++ b/spec/frontend/diffs/utils/file_reviews_spec.js
@@ -49,11 +49,11 @@ describe('File Review(s) utilities', () => {
it.each`
mrReviews | files | fileReviews
- ${{}} | ${[file1, file2]} | ${[false, false]}
- ${{ abc: ['123'] }} | ${[file1, file2]} | ${[true, false]}
- ${{ abc: ['098'] }} | ${[file1, file2]} | ${[false, true]}
- ${{ def: ['123'] }} | ${[file1, file2]} | ${[false, false]}
- ${{ abc: ['123'], def: ['098'] }} | ${[]} | ${[]}
+ ${{}} | ${[file1, file2]} | ${{ 123: false, '098': false }}
+ ${{ abc: ['123'] }} | ${[file1, file2]} | ${{ 123: true, '098': false }}
+ ${{ abc: ['098'] }} | ${[file1, file2]} | ${{ 123: false, '098': true }}
+ ${{ def: ['123'] }} | ${[file1, file2]} | ${{ 123: false, '098': false }}
+ ${{ abc: ['123'], def: ['098'] }} | ${[]} | ${{}}
`(
'returns $fileReviews based on the diff files in state and the existing reviews $reviews',
({ mrReviews, files, fileReviews }) => {
diff --git a/spec/frontend/reports/components/grouped_test_reports_app_spec.js b/spec/frontend/reports/components/grouped_test_reports_app_spec.js
index 693cdb5fccd..b3784b1d525 100644
--- a/spec/frontend/reports/components/grouped_test_reports_app_spec.js
+++ b/spec/frontend/reports/components/grouped_test_reports_app_spec.js
@@ -295,6 +295,27 @@ describe('Grouped test reports app', () => {
});
});
+ describe('with a report parsing errors', () => {
+ beforeEach(() => {
+ const reports = failedReport;
+ reports.suites[0].suite_errors = {
+ head: 'JUnit XML parsing failed: 2:24: FATAL: attributes construct error',
+ base: 'JUnit data parsing failed: string not matched',
+ };
+ setReports(reports);
+ mountComponent();
+ });
+
+ it('renders the error messages', () => {
+ expect(findSummaryDescription().text()).toContain(
+ 'JUnit XML parsing failed: 2:24: FATAL: attributes construct error',
+ );
+ expect(findSummaryDescription().text()).toContain(
+ 'JUnit data parsing failed: string not matched',
+ );
+ });
+ });
+
describe('with error', () => {
beforeEach(() => {
mockStore.state.isLoading = false;
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
index f252257651e..5ec719b17d6 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
@@ -1,9 +1,8 @@
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
-import { trimText } from 'helpers/text_helper';
import axios from '~/lib/utils/axios_utils';
import ArtifactsApp from '~/vue_merge_request_widget/components/artifacts_list_app.vue';
-import Deployment from '~/vue_merge_request_widget/components/deployment/deployment.vue';
+import DeploymentList from '~/vue_merge_request_widget/components/deployment/deployment_list.vue';
import MrWidgetPipeline from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue';
import MrWidgetPipelineContainer from '~/vue_merge_request_widget/components/mr_widget_pipeline_container.vue';
import { mockStore } from '../mock_data';
@@ -30,6 +29,8 @@ describe('MrWidgetPipelineContainer', () => {
wrapper.destroy();
});
+ const findDeploymentList = () => wrapper.findComponent(DeploymentList);
+
describe('when pre merge', () => {
beforeEach(() => {
factory();
@@ -57,6 +58,9 @@ describe('MrWidgetPipelineContainer', () => {
const deployments = wrapper.findAll('.mr-widget-extension .js-pre-deployment');
+ expect(findDeploymentList().exists()).toBe(true);
+ expect(findDeploymentList().props('deployments')).toBe(mockStore.deployments);
+
expect(deployments.wrappers.map((x) => x.props())).toEqual(expectedProps);
});
});
@@ -102,6 +106,8 @@ describe('MrWidgetPipelineContainer', () => {
const deployments = wrapper.findAll('.mr-widget-extension .js-post-deployment');
+ expect(findDeploymentList().exists()).toBe(true);
+ expect(findDeploymentList().props('deployments')).toBe(mockStore.postMergeDeployments);
expect(deployments.wrappers.map((x) => x.props())).toEqual(expectedProps);
});
});
@@ -113,50 +119,4 @@ describe('MrWidgetPipelineContainer', () => {
expect(wrapper.find(ArtifactsApp).isVisible()).toBe(true);
});
});
- describe('with many deployments', () => {
- let deployments;
- let collapsibleExtension;
-
- beforeEach(() => {
- deployments = [
- ...mockStore.deployments,
- ...mockStore.deployments.map((deployment) => ({
- ...deployment,
- id: deployment.id + mockStore.deployments.length,
- })),
- ];
- factory({
- mr: {
- ...mockStore,
- deployments,
- },
- });
- collapsibleExtension = wrapper.find('[data-testid="mr-collapsed-deployments"]');
- });
-
- it('renders them collapsed', () => {
- expect(collapsibleExtension.exists()).toBe(true);
- expect(trimText(collapsibleExtension.text())).toBe(
- `${deployments.length} environments impacted. View all environments.`,
- );
- });
-
- it('shows them when clicked', async () => {
- const expectedProps = deployments.map((dep) =>
- expect.objectContaining({
- deployment: dep,
- showMetrics: false,
- }),
- );
- await collapsibleExtension.find('button').trigger('click');
-
- const deploymentWrappers = collapsibleExtension.findAllComponents(Deployment);
-
- expect(deploymentWrappers.wrappers.map((x) => x.props())).toEqual(expectedProps);
- deploymentWrappers.wrappers.forEach((x) => {
- expect(x.text()).toEqual(expect.any(String));
- expect(x.text()).not.toBe('');
- });
- });
- });
});
diff --git a/spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js b/spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js
new file mode 100644
index 00000000000..dd0c483b28a
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/deployment/deployment_list_spec.js
@@ -0,0 +1,101 @@
+import { mount } from '@vue/test-utils';
+import { zip } from 'lodash';
+import { trimText } from 'helpers/text_helper';
+import Deployment from '~/vue_merge_request_widget/components/deployment/deployment.vue';
+import DeploymentList from '~/vue_merge_request_widget/components/deployment/deployment_list.vue';
+import MrCollapsibleExtension from '~/vue_merge_request_widget/components/mr_collapsible_extension.vue';
+import { mockStore } from '../mock_data';
+
+const DEFAULT_PROPS = {
+ showVisualReviewAppLink: false,
+ hasDeploymentMetrics: false,
+ deploymentClass: 'js-pre-deployment',
+};
+
+describe('~/vue_merge_request_widget/components/deployment/deployment_list.vue', () => {
+ let wrapper;
+ let propsData;
+
+ const factory = (props = {}) => {
+ propsData = {
+ ...DEFAULT_PROPS,
+ deployments: mockStore.deployments,
+ ...props,
+ };
+ wrapper = mount(DeploymentList, {
+ propsData,
+ });
+ };
+
+ afterEach(() => {
+ wrapper?.destroy?.();
+ wrapper = null;
+ });
+
+ describe('with few deployments', () => {
+ beforeEach(() => {
+ factory();
+ });
+
+ it('shows all deployments', () => {
+ const deploymentWrappers = wrapper.findAllComponents(Deployment);
+ expect(wrapper.findComponent(MrCollapsibleExtension).exists()).toBe(false);
+ expect(deploymentWrappers).toHaveLength(propsData.deployments.length);
+
+ zip(deploymentWrappers.wrappers, propsData.deployments).forEach(
+ ([deploymentWrapper, deployment]) => {
+ expect(deploymentWrapper.props('deployment')).toEqual(deployment);
+ expect(deploymentWrapper.props()).toMatchObject({
+ showVisualReviewApp: DEFAULT_PROPS.showVisualReviewAppLink,
+ showMetrics: DEFAULT_PROPS.hasDeploymentMetrics,
+ });
+ expect(deploymentWrapper.classes(DEFAULT_PROPS.deploymentClass)).toBe(true);
+ expect(deploymentWrapper.text()).toEqual(expect.any(String));
+ expect(deploymentWrapper.text()).not.toBe('');
+ },
+ );
+ });
+ });
+ describe('with many deployments', () => {
+ let deployments;
+ let collapsibleExtension;
+
+ beforeEach(() => {
+ deployments = [
+ ...mockStore.deployments,
+ ...mockStore.deployments.map((deployment) => ({
+ ...deployment,
+ id: deployment.id + mockStore.deployments.length,
+ })),
+ ];
+ factory({ deployments });
+
+ collapsibleExtension = wrapper.findComponent(MrCollapsibleExtension);
+ });
+
+ it('shows collapsed deployments', () => {
+ expect(collapsibleExtension.exists()).toBe(true);
+ expect(trimText(collapsibleExtension.text())).toBe(
+ `${deployments.length} environments impacted. View all environments.`,
+ );
+ });
+ it('shows all deployments on click', async () => {
+ await collapsibleExtension.find('button').trigger('click');
+ const deploymentWrappers = wrapper.findAllComponents(Deployment);
+ expect(deploymentWrappers).toHaveLength(deployments.length);
+
+ zip(deploymentWrappers.wrappers, propsData.deployments).forEach(
+ ([deploymentWrapper, deployment]) => {
+ expect(deploymentWrapper.props('deployment')).toEqual(deployment);
+ expect(deploymentWrapper.props()).toMatchObject({
+ showVisualReviewApp: DEFAULT_PROPS.showVisualReviewAppLink,
+ showMetrics: DEFAULT_PROPS.hasDeploymentMetrics,
+ });
+ expect(deploymentWrapper.classes(DEFAULT_PROPS.deploymentClass)).toBe(true);
+ expect(deploymentWrapper.text()).toEqual(expect.any(String));
+ expect(deploymentWrapper.text()).not.toBe('');
+ },
+ );
+ });
+ });
+});