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:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-12-14 00:09:54 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-12-14 00:09:54 +0300
commit0fea036ba7c8d26ffeecc7f52bf770ea3a88689e (patch)
tree5937f3181e46bdc2c96ba9b530bc66d0ef46311f /spec/frontend
parent46e1fdb8bbdaf149371334f1a1757ba4d68fe020 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
-rw-r--r--spec/frontend/diffs/components/shared/__snapshots__/findings_drawer_spec.js.snap14
-rw-r--r--spec/frontend/diffs/components/shared/findings_drawer_spec.js113
-rw-r--r--spec/frontend/diffs/mock_data/findings_drawer.js42
-rw-r--r--spec/frontend/editor/schema/ci/ci_schema_spec.js6
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/negative_tests/auto_cancel_pipeline.yml4
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/all.yml4
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/none.yml4
-rw-r--r--spec/frontend/environments/folder/environments_folder_app_spec.js10
-rw-r--r--spec/frontend/environments/graphql/resolvers/base_spec.js3
9 files changed, 166 insertions, 34 deletions
diff --git a/spec/frontend/diffs/components/shared/__snapshots__/findings_drawer_spec.js.snap b/spec/frontend/diffs/components/shared/__snapshots__/findings_drawer_spec.js.snap
index d7364e80542..33a268c06cc 100644
--- a/spec/frontend/diffs/components/shared/__snapshots__/findings_drawer_spec.js.snap
+++ b/spec/frontend/diffs/components/shared/__snapshots__/findings_drawer_spec.js.snap
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`FindingsDrawer matches the snapshot with detected badge 1`] = `
+exports[`FindingsDrawer General Rendering matches the snapshot with detected badge 1`] = `
<transition-stub
class="findings-drawer"
name="gl-drawer"
@@ -16,7 +16,7 @@ exports[`FindingsDrawer matches the snapshot with detected badge 1`] = `
class="gl-drawer-title"
>
<h2
- class="drawer-heading gl-font-base gl-mb-0 gl-mt-0"
+ class="drawer-heading gl-font-base gl-mb-0 gl-mt-0 gl-w-28"
>
<svg
aria-hidden="true"
@@ -61,6 +61,7 @@ exports[`FindingsDrawer matches the snapshot with detected badge 1`] = `
>
<li
class="gl-mb-4"
+ data-testid="findings-drawer-title"
>
<p
class="gl-line-height-20"
@@ -219,7 +220,7 @@ exports[`FindingsDrawer matches the snapshot with detected badge 1`] = `
</transition-stub>
`;
-exports[`FindingsDrawer matches the snapshot with dismissed badge 1`] = `
+exports[`FindingsDrawer General Rendering matches the snapshot with dismissed badge 1`] = `
<transition-stub
class="findings-drawer"
name="gl-drawer"
@@ -235,7 +236,7 @@ exports[`FindingsDrawer matches the snapshot with dismissed badge 1`] = `
class="gl-drawer-title"
>
<h2
- class="drawer-heading gl-font-base gl-mb-0 gl-mt-0"
+ class="drawer-heading gl-font-base gl-mb-0 gl-mt-0 gl-w-28"
>
<svg
aria-hidden="true"
@@ -280,6 +281,7 @@ exports[`FindingsDrawer matches the snapshot with dismissed badge 1`] = `
>
<li
class="gl-mb-4"
+ data-testid="findings-drawer-title"
>
<p
class="gl-line-height-20"
@@ -310,9 +312,9 @@ exports[`FindingsDrawer matches the snapshot with dismissed badge 1`] = `
Status
</span>
<span
- class="badge badge-muted badge-pill gl-badge md text-capitalize"
+ class="badge badge-pill badge-warning gl-badge md text-capitalize"
>
- dismissed
+ detected
</span>
</p>
</li>
diff --git a/spec/frontend/diffs/components/shared/findings_drawer_spec.js b/spec/frontend/diffs/components/shared/findings_drawer_spec.js
index a6528978e3b..00b4ca262be 100644
--- a/spec/frontend/diffs/components/shared/findings_drawer_spec.js
+++ b/spec/frontend/diffs/components/shared/findings_drawer_spec.js
@@ -1,3 +1,4 @@
+import { nextTick } from 'vue';
import { GlDrawer } from '@gitlab/ui';
import FindingsDrawer from '~/diffs/components/shared/findings_drawer.vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
@@ -5,41 +6,101 @@ import {
mockFindingDismissed,
mockFindingDetected,
mockProject,
+ mockFindingsMultiple,
} from '../../mock_data/findings_drawer';
-let wrapper;
-const getDrawer = () => wrapper.findComponent(GlDrawer);
-const closeEvent = 'close';
+describe('FindingsDrawer', () => {
+ let wrapper;
-const createWrapper = (finding = mockFindingDismissed) => {
- return mountExtended(FindingsDrawer, {
- propsData: {
- drawer: finding,
- project: mockProject,
- },
- });
-};
+ const findPreviousButton = () => wrapper.findByTestId('findings-drawer-prev-button');
+ const findNextButton = () => wrapper.findByTestId('findings-drawer-next-button');
+ const findTitle = () => wrapper.findByTestId('findings-drawer-title');
+ const createWrapper = (
+ drawer = { findings: [mockFindingDetected], index: 0 },
+ project = mockProject,
+ ) => {
+ return mountExtended(FindingsDrawer, {
+ propsData: {
+ drawer,
+ project,
+ },
+ });
+ };
-describe('FindingsDrawer', () => {
- it('renders without errors', () => {
- wrapper = createWrapper();
- expect(wrapper.exists()).toBe(true);
- });
+ describe('General Rendering', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ });
+ it('renders without errors', () => {
+ expect(wrapper.exists()).toBe(true);
+ });
- it('emits close event when gl-drawer emits close event', () => {
- wrapper = createWrapper();
+ it('emits close event when gl-drawer emits close event', () => {
+ wrapper.findComponent(GlDrawer).vm.$emit('close');
+ expect(wrapper.emitted('close')).toHaveLength(1);
+ });
- getDrawer().vm.$emit(closeEvent);
- expect(wrapper.emitted(closeEvent)).toHaveLength(1);
+ it('matches the snapshot with dismissed badge', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ it('matches the snapshot with detected badge', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
});
- it('matches the snapshot with dismissed badge', () => {
- wrapper = createWrapper();
- expect(wrapper.element).toMatchSnapshot();
+ describe('Prev/Next Buttons with Multiple Items', () => {
+ it('renders prev/next buttons when there are multiple items', () => {
+ wrapper = createWrapper({ findings: mockFindingsMultiple, index: 0 });
+ expect(findPreviousButton().exists()).toBe(true);
+ expect(findNextButton().exists()).toBe(true);
+ });
+
+ it('does not render prev/next buttons when there is only one item', () => {
+ wrapper = createWrapper({ findings: [mockFindingDismissed], index: 0 });
+ expect(findPreviousButton().exists()).toBe(false);
+ expect(findNextButton().exists()).toBe(false);
+ });
+
+ it('calls prev method on prev button click and loops correct activeIndex', async () => {
+ wrapper = createWrapper({ findings: mockFindingsMultiple, index: 0 });
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[0].title}`);
+
+ await findPreviousButton().trigger('click');
+ await nextTick();
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[2].title}`);
+
+ await findPreviousButton().trigger('click');
+ await nextTick();
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[1].title}`);
+ });
+
+ it('calls next method on next button click', async () => {
+ wrapper = createWrapper({ findings: mockFindingsMultiple, index: 0 });
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[0].title}`);
+
+ await findNextButton().trigger('click');
+ await nextTick();
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[1].title}`);
+
+ await findNextButton().trigger('click');
+ await nextTick();
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[2].title}`);
+
+ await findNextButton().trigger('click');
+ await nextTick();
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[0].title}`);
+ });
});
- it('matches the snapshot with detected badge', () => {
- wrapper = createWrapper(mockFindingDetected);
- expect(wrapper.element).toMatchSnapshot();
+ describe('Active Index Handling', () => {
+ it('watcher sets active index on drawer prop change', async () => {
+ wrapper = createWrapper();
+ const newFinding = { findings: mockFindingsMultiple, index: 2 };
+
+ await wrapper.setProps({ drawer: newFinding });
+ await nextTick();
+ expect(findTitle().text()).toBe(`Name ${mockFindingsMultiple[2].title}`);
+ });
});
});
diff --git a/spec/frontend/diffs/mock_data/findings_drawer.js b/spec/frontend/diffs/mock_data/findings_drawer.js
index f6fc33b1dcf..257a3b3e499 100644
--- a/spec/frontend/diffs/mock_data/findings_drawer.js
+++ b/spec/frontend/diffs/mock_data/findings_drawer.js
@@ -31,3 +31,45 @@ export const mockProject = {
nameWithNamespace: 'testname',
fullPath: 'testpath',
};
+
+export const mockFindingsMultiple = [
+ {
+ ...mockFindingDismissed,
+ title: 'Finding 1',
+ severity: 'critical',
+ engineName: 'Engine 1',
+ identifiers: [
+ {
+ ...mockFindingDismissed.identifiers[0],
+ name: 'identifier 1',
+ url: 'https://example.com/identifier1',
+ },
+ ],
+ },
+ {
+ ...mockFindingDetected,
+ title: 'Finding 2',
+ severity: 'medium',
+ engineName: 'Engine 2',
+ identifiers: [
+ {
+ ...mockFindingDetected.identifiers[0],
+ name: 'identifier 2',
+ url: 'https://example.com/identifier2',
+ },
+ ],
+ },
+ {
+ ...mockFindingDetected,
+ title: 'Finding 3',
+ severity: 'medium',
+ engineName: 'Engine 3',
+ identifiers: [
+ {
+ ...mockFindingDetected.identifiers[0],
+ name: 'identifier 3',
+ url: 'https://example.com/identifier3',
+ },
+ ],
+ },
+];
diff --git a/spec/frontend/editor/schema/ci/ci_schema_spec.js b/spec/frontend/editor/schema/ci/ci_schema_spec.js
index 8e7f6e8e00a..7986509074e 100644
--- a/spec/frontend/editor/schema/ci/ci_schema_spec.js
+++ b/spec/frontend/editor/schema/ci/ci_schema_spec.js
@@ -38,6 +38,8 @@ import SecretsYaml from './yaml_tests/positive_tests/secrets.yml';
import ServicesYaml from './yaml_tests/positive_tests/services.yml';
import NeedsParallelMatrixYaml from './yaml_tests/positive_tests/needs_parallel_matrix.yml';
import ScriptYaml from './yaml_tests/positive_tests/script.yml';
+import AutoCancelPipelineOnJobFailureAllYaml from './yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/all.yml';
+import AutoCancelPipelineOnJobFailureNoneYaml from './yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/none.yml';
// YAML NEGATIVE TEST
import ArtifactsNegativeYaml from './yaml_tests/negative_tests/artifacts.yml';
@@ -64,6 +66,7 @@ import NeedsParallelMatrixNumericYaml from './yaml_tests/negative_tests/needs/pa
import NeedsParallelMatrixWrongParallelValueYaml from './yaml_tests/negative_tests/needs/parallel_matrix/wrong_parallel_value.yml';
import NeedsParallelMatrixWrongMatrixValueYaml from './yaml_tests/negative_tests/needs/parallel_matrix/wrong_matrix_value.yml';
import ScriptNegativeYaml from './yaml_tests/negative_tests/script.yml';
+import AutoCancelPipelineNegativeYaml from './yaml_tests/negative_tests/auto_cancel_pipeline.yml';
const ajv = new Ajv({
strictTypes: false,
@@ -107,6 +110,8 @@ describe('positive tests', () => {
SecretsYaml,
NeedsParallelMatrixYaml,
ScriptYaml,
+ AutoCancelPipelineOnJobFailureAllYaml,
+ AutoCancelPipelineOnJobFailureNoneYaml,
}),
)('schema validates %s', (_, input) => {
// We construct a new "JSON" from each main key that is inside a
@@ -152,6 +157,7 @@ describe('negative tests', () => {
NeedsParallelMatrixWrongParallelValueYaml,
NeedsParallelMatrixWrongMatrixValueYaml,
ScriptNegativeYaml,
+ AutoCancelPipelineNegativeYaml,
}),
)('schema validates %s', (_, input) => {
// We construct a new "JSON" from each main key that is inside a
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/auto_cancel_pipeline.yml b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/auto_cancel_pipeline.yml
new file mode 100644
index 00000000000..0ba3e5632e3
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/auto_cancel_pipeline.yml
@@ -0,0 +1,4 @@
+# invalid workflow:auto-cancel:on-job-failure
+workflow:
+ auto_cancel:
+ on_job_failure: unexpected_value
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/all.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/all.yml
new file mode 100644
index 00000000000..bf84ff16f42
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/all.yml
@@ -0,0 +1,4 @@
+# valid workflow:auto-cancel:on-job-failure
+workflow:
+ auto_cancel:
+ on_job_failure: all
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/none.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/none.yml
new file mode 100644
index 00000000000..b99eb50e962
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/auto_cancel_pipeline/on_job_failure/none.yml
@@ -0,0 +1,4 @@
+# valid workflow:auto-cancel:on-job-failure
+workflow:
+ auto_cancel:
+ on_job_failure: none
diff --git a/spec/frontend/environments/folder/environments_folder_app_spec.js b/spec/frontend/environments/folder/environments_folder_app_spec.js
index fbb252fb152..0b76a74e3a0 100644
--- a/spec/frontend/environments/folder/environments_folder_app_spec.js
+++ b/spec/frontend/environments/folder/environments_folder_app_spec.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import { GlSkeletonLoader, GlTab } from '@gitlab/ui';
+import { GlSkeletonLoader, GlTab, GlPagination } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import EnvironmentsFolderAppComponent from '~/environments/folder/environments_folder_app.vue';
import EnvironmentItem from '~/environments/components/new_environment_item.vue';
@@ -62,6 +62,7 @@ describe('EnvironmentsFolderAppComponent', () => {
folderName: mockFolderName,
folderPath: '/gitlab-org/test-project/-/environments/folder/dev',
scope: 'active',
+ page: 1,
},
});
};
@@ -119,5 +120,12 @@ describe('EnvironmentsFolderAppComponent', () => {
expect(modal.props().environment).toEqual(resolvedEnvironment);
expect(modal.props().weight).toBe(1);
});
+
+ it('should render pagination component', () => {
+ const pagination = wrapper.findComponent(GlPagination);
+
+ expect(pagination.props().perPage).toBe(20);
+ expect(pagination.props().totalItems).toBe(2);
+ });
});
});
diff --git a/spec/frontend/environments/graphql/resolvers/base_spec.js b/spec/frontend/environments/graphql/resolvers/base_spec.js
index 244c86fa679..f78146fe48e 100644
--- a/spec/frontend/environments/graphql/resolvers/base_spec.js
+++ b/spec/frontend/environments/graphql/resolvers/base_spec.js
@@ -131,13 +131,14 @@ describe('~/frontend/environments/graphql/resolvers', () => {
describe('folder', () => {
it('should fetch the folder url passed to it', async () => {
mock
- .onGet(ENDPOINT, { params: { per_page: 3, scope: 'available', search: '' } })
+ .onGet(ENDPOINT, { params: { per_page: 3, scope: 'available', search: '', page: 1 } })
.reply(HTTP_STATUS_OK, folder);
const environmentFolder = await mockResolvers.Query.folder(null, {
environment: { folderPath: ENDPOINT },
scope: 'available',
search: '',
+ page: 1,
});
expect(environmentFolder).toEqual(resolvedFolder);