Commit 7b8b657c authored by Kyle Wiebers's avatar Kyle Wiebers

Revert "Merge branch 'jnnkl-refactor-manage-via-mr-to-shared-components' into 'master'"

This reverts merge request !59001
parent 3ca18ac9
<script> <script>
import { GlLink, GlTable, GlAlert } from '@gitlab/ui'; import { GlLink, GlTable, GlAlert } from '@gitlab/ui';
import { s__, sprintf } from '~/locale'; import { s__, sprintf } from '~/locale';
import ManageViaMR from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
import { import {
REPORT_TYPE_SAST, REPORT_TYPE_SAST,
REPORT_TYPE_DAST, REPORT_TYPE_DAST,
...@@ -12,8 +11,8 @@ import { ...@@ -12,8 +11,8 @@ import {
REPORT_TYPE_API_FUZZING, REPORT_TYPE_API_FUZZING,
REPORT_TYPE_LICENSE_COMPLIANCE, REPORT_TYPE_LICENSE_COMPLIANCE,
} from '~/vue_shared/security_reports/constants'; } from '~/vue_shared/security_reports/constants';
import ManageSast from './manage_sast.vue';
import { scanners } from './constants'; import { scanners } from './scanners_constants';
import Upgrade from './upgrade.vue'; import Upgrade from './upgrade.vue';
const borderClasses = 'gl-border-b-1! gl-border-b-solid! gl-border-gray-100!'; const borderClasses = 'gl-border-b-1! gl-border-b-solid! gl-border-gray-100!';
...@@ -41,7 +40,7 @@ export default { ...@@ -41,7 +40,7 @@ export default {
}, },
getComponentForItem(item) { getComponentForItem(item) {
const COMPONENTS = { const COMPONENTS = {
[REPORT_TYPE_SAST]: ManageViaMR, [REPORT_TYPE_SAST]: ManageSast,
[REPORT_TYPE_DAST]: Upgrade, [REPORT_TYPE_DAST]: Upgrade,
[REPORT_TYPE_DAST_PROFILES]: Upgrade, [REPORT_TYPE_DAST_PROFILES]: Upgrade,
[REPORT_TYPE_DEPENDENCY_SCANNING]: Upgrade, [REPORT_TYPE_DEPENDENCY_SCANNING]: Upgrade,
...@@ -50,6 +49,7 @@ export default { ...@@ -50,6 +49,7 @@ export default {
[REPORT_TYPE_API_FUZZING]: Upgrade, [REPORT_TYPE_API_FUZZING]: Upgrade,
[REPORT_TYPE_LICENSE_COMPLIANCE]: Upgrade, [REPORT_TYPE_LICENSE_COMPLIANCE]: Upgrade,
}; };
return COMPONENTS[item.type]; return COMPONENTS[item.type];
}, },
}, },
...@@ -95,12 +95,7 @@ export default { ...@@ -95,12 +95,7 @@ export default {
</template> </template>
<template #cell(manage)="{ item }"> <template #cell(manage)="{ item }">
<component <component :is="getComponentForItem(item)" :data-testid="item.type" @error="onError" />
:is="getComponentForItem(item)"
:feature="item"
:data-testid="item.type"
@error="onError"
/>
</template> </template>
</gl-table> </gl-table>
</div> </div>
......
<script>
import { GlButton } from '@gitlab/ui';
import { redirectTo } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import configureSastMutation from '~/security_configuration/graphql/configure_sast.mutation.graphql';
export default {
components: {
GlButton,
},
inject: {
projectPath: {
from: 'projectPath',
default: '',
},
},
data() {
return {
isLoading: false,
};
},
methods: {
async mutate() {
this.isLoading = true;
try {
const { data } = await this.$apollo.mutate({
mutation: configureSastMutation,
variables: {
input: {
projectPath: this.projectPath,
configuration: { global: [], pipeline: [], analyzers: [] },
},
},
});
const { errors, successPath } = data.configureSast;
if (errors.length > 0) {
throw new Error(errors[0]);
}
if (!successPath) {
throw new Error(s__('SecurityConfiguration|SAST merge request creation mutation failed'));
}
redirectTo(successPath);
} catch (e) {
this.$emit('error', e.message);
this.isLoading = false;
}
},
},
};
</script>
<template>
<gl-button :loading="isLoading" variant="success" category="secondary" @click="mutate">{{
s__('SecurityConfiguration|Configure via merge request')
}}</gl-button>
</template>
import { helpPagePath } from '~/helpers/help_page_helper'; import { helpPagePath } from '~/helpers/help_page_helper';
import { __, s__ } from '~/locale'; import { __, s__ } from '~/locale';
import configureSastMutation from '~/security_configuration/graphql/configure_sast.mutation.graphql';
import { import {
REPORT_TYPE_SAST, REPORT_TYPE_SAST,
REPORT_TYPE_DAST, REPORT_TYPE_DAST,
...@@ -135,18 +134,3 @@ export const scanners = [ ...@@ -135,18 +134,3 @@ export const scanners = [
type: REPORT_TYPE_LICENSE_COMPLIANCE, type: REPORT_TYPE_LICENSE_COMPLIANCE,
}, },
]; ];
export const featureToMutationMap = {
[REPORT_TYPE_SAST]: {
mutationId: 'configureSast',
getMutationPayload: (projectPath) => ({
mutation: configureSastMutation,
variables: {
input: {
projectPath,
configuration: { global: [], pipeline: [], analyzers: [] },
},
},
}),
},
};
<script> <script>
import { GlLink, GlSprintf } from '@gitlab/ui'; import { GlLink, GlSprintf } from '@gitlab/ui';
import { UPGRADE_CTA } from './constants'; import { UPGRADE_CTA } from './scanners_constants';
export default { export default {
components: { components: {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui'; import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
import { parseBoolean } from '~/lib/utils/common_utils'; import { parseBoolean } from '~/lib/utils/common_utils';
import { s__, __ } from '~/locale'; import { s__, __ } from '~/locale';
import { scanners } from '~/security_configuration/components/constants'; import { scanners } from '~/security_configuration/components/scanners_constants';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue'; import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import AutoFixSettings from './auto_fix_settings.vue'; import AutoFixSettings from './auto_fix_settings.vue';
......
import { s__ } from '~/locale'; import { s__ } from '~/locale';
import { featureToMutationMap as featureToMutationMapCE } from '~/security_configuration/components/constants';
import { import {
REPORT_TYPE_DEPENDENCY_SCANNING, REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_SECRET_DETECTION, REPORT_TYPE_SECRET_DETECTION,
...@@ -24,21 +23,12 @@ export const CUSTOM_VALUE_MESSAGE = s__( ...@@ -24,21 +23,12 @@ export const CUSTOM_VALUE_MESSAGE = s__(
); );
export const featureToMutationMap = { export const featureToMutationMap = {
...featureToMutationMapCE,
[REPORT_TYPE_DEPENDENCY_SCANNING]: { [REPORT_TYPE_DEPENDENCY_SCANNING]: {
mutationId: 'configureDependencyScanning', type: 'configureDependencyScanning',
getMutationPayload: (projectPath) => ({ mutation: configureDependencyScanningMutation,
mutation: configureDependencyScanningMutation,
variables: {
fullPath: projectPath,
},
}),
}, },
[REPORT_TYPE_SECRET_DETECTION]: { [REPORT_TYPE_SECRET_DETECTION]: {
mutationId: 'configureSecretDetection', type: 'configureSecretDetection',
getMutationPayload: (projectPath) => ({ mutation: configureSecretDetectionMutation,
mutation: configureSecretDetectionMutation,
variables: { fullPath: projectPath },
}),
}, },
}; };
<script> <script>
import { propsUnion } from '~/vue_shared/components/lib/utils/props_utils'; import { propsUnion } from '~/vue_shared/components/lib/utils/props_utils';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
import { import {
REPORT_TYPE_DAST_PROFILES, REPORT_TYPE_DAST_PROFILES,
REPORT_TYPE_DEPENDENCY_SCANNING, REPORT_TYPE_DEPENDENCY_SCANNING,
...@@ -9,6 +8,7 @@ import { ...@@ -9,6 +8,7 @@ import {
} from '~/vue_shared/security_reports/constants'; } from '~/vue_shared/security_reports/constants';
import ManageDastProfiles from './manage_dast_profiles.vue'; import ManageDastProfiles from './manage_dast_profiles.vue';
import ManageGeneric from './manage_generic.vue'; import ManageGeneric from './manage_generic.vue';
import ManageViaMr from './manage_via_mr.vue';
const scannerComponentMap = { const scannerComponentMap = {
[REPORT_TYPE_DAST_PROFILES]: ManageDastProfiles, [REPORT_TYPE_DAST_PROFILES]: ManageDastProfiles,
......
<script> <script>
import { GlButton } from '@gitlab/ui'; import { GlButton } from '@gitlab/ui';
import { featureToMutationMap } from 'ee_else_ce/security_configuration/components/constants';
import { redirectTo } from '~/lib/utils/url_utility'; import { redirectTo } from '~/lib/utils/url_utility';
import { sprintf, s__ } from '~/locale'; import { sprintf, s__ } from '~/locale';
import apolloProvider from '../provider'; import apolloProvider from '../graphql/provider';
import { featureToMutationMap } from './constants';
export default { export default {
apolloProvider, apolloProvider,
components: { components: {
GlButton, GlButton,
}, },
inject: ['projectPath'], inject: {
projectPath: {
from: 'projectPath',
default: '',
},
},
props: { props: {
feature: { feature: {
type: Object, type: Object,
...@@ -31,9 +36,13 @@ export default { ...@@ -31,9 +36,13 @@ export default {
async mutate() { async mutate() {
this.isLoading = true; this.isLoading = true;
try { try {
const mutation = this.featureSettings; const { data } = await this.$apollo.mutate({
const { data } = await this.$apollo.mutate(mutation.getMutationPayload(this.projectPath)); mutation: this.featureSettings.mutation,
const { errors, successPath } = data[mutation.mutationId]; variables: {
fullPath: this.projectPath,
},
});
const { errors, successPath } = data[this.featureSettings.type];
if (errors.length > 0) { if (errors.length > 0) {
throw new Error(errors[0]); throw new Error(errors[0]);
......
...@@ -18,7 +18,6 @@ export const initSecurityConfiguration = (el) => { ...@@ -18,7 +18,6 @@ export const initSecurityConfiguration = (el) => {
containerScanningHelpPath, containerScanningHelpPath,
dependencyScanningHelpPath, dependencyScanningHelpPath,
toggleAutofixSettingEndpoint, toggleAutofixSettingEndpoint,
projectPath,
gitlabCiHistoryPath, gitlabCiHistoryPath,
} = el.dataset; } = el.dataset;
...@@ -27,9 +26,6 @@ export const initSecurityConfiguration = (el) => { ...@@ -27,9 +26,6 @@ export const initSecurityConfiguration = (el) => {
components: { components: {
SecurityConfigurationApp, SecurityConfigurationApp,
}, },
provide: {
projectPath,
},
render(createElement) { render(createElement) {
return createElement(SecurityConfigurationApp, { return createElement(SecurityConfigurationApp, {
props: { props: {
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
- else - else
#js-security-configuration{ data: { **@configuration.to_html_data_attribute, #js-security-configuration{ data: { **@configuration.to_html_data_attribute,
auto_fix_help_path: '/', auto_fix_help_path: '/',
project_path: @project.full_path,
toggle_autofix_setting_endpoint: 'configuration/auto_fix', toggle_autofix_setting_endpoint: 'configuration/auto_fix',
container_scanning_help_path: help_page_path('user/application_security/container_scanning/index'), container_scanning_help_path: help_page_path('user/application_security/container_scanning/index'),
dependency_scanning_help_path: help_page_path('user/application_security/dependency_scanning/index') } } dependency_scanning_help_path: help_page_path('user/application_security/dependency_scanning/index') } }
...@@ -5,7 +5,7 @@ import SecurityConfigurationApp from 'ee/security_configuration/components/app.v ...@@ -5,7 +5,7 @@ import SecurityConfigurationApp from 'ee/security_configuration/components/app.v
import ConfigurationTable from 'ee/security_configuration/components/configuration_table.vue'; import ConfigurationTable from 'ee/security_configuration/components/configuration_table.vue';
import { useLocalStorageSpy } from 'helpers/local_storage_helper'; import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import stubChildren from 'helpers/stub_children'; import stubChildren from 'helpers/stub_children';
import { scanners } from '~/security_configuration/components/constants'; import { scanners } from '~/security_configuration/components/scanners_constants';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue'; import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { generateFeatures } from './helpers'; import { generateFeatures } from './helpers';
......
import { scanners } from '~/security_configuration/components/constants'; import { scanners } from '~/security_configuration/components/scanners_constants';
export const generateFeatures = (n, overrides = {}) => { export const generateFeatures = (n, overrides = {}) => {
return [...Array(n).keys()].map((i) => ({ return [...Array(n).keys()].map((i) => ({
......
...@@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils'; ...@@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import ManageDastProfiles from 'ee/security_configuration/components/manage_dast_profiles.vue'; import ManageDastProfiles from 'ee/security_configuration/components/manage_dast_profiles.vue';
import ManageFeature from 'ee/security_configuration/components/manage_feature.vue'; import ManageFeature from 'ee/security_configuration/components/manage_feature.vue';
import ManageGeneric from 'ee/security_configuration/components/manage_generic.vue'; import ManageGeneric from 'ee/security_configuration/components/manage_generic.vue';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue'; import ManageViaMr from 'ee/security_configuration/components/manage_via_mr.vue';
import { import {
REPORT_TYPE_DAST_PROFILES, REPORT_TYPE_DAST_PROFILES,
REPORT_TYPE_DEPENDENCY_SCANNING, REPORT_TYPE_DEPENDENCY_SCANNING,
......
...@@ -2,13 +2,13 @@ import { GlButton } from '@gitlab/ui'; ...@@ -2,13 +2,13 @@ import { GlButton } from '@gitlab/ui';
import { mount } from '@vue/test-utils'; import { mount } from '@vue/test-utils';
import Vue from 'vue'; import Vue from 'vue';
import VueApollo from 'vue-apollo'; import VueApollo from 'vue-apollo';
import ManageViaMr from 'ee/security_configuration/components/manage_via_mr.vue';
import configureDependencyScanningMutation from 'ee/security_configuration/graphql/configure_dependency_scanning.mutation.graphql'; import configureDependencyScanningMutation from 'ee/security_configuration/graphql/configure_dependency_scanning.mutation.graphql';
import configureSecretDetectionMutation from 'ee/security_configuration/graphql/configure_secret_detection.mutation.graphql'; import configureSecretDetectionMutation from 'ee/security_configuration/graphql/configure_secret_detection.mutation.graphql';
import createMockApollo from 'helpers/mock_apollo_helper'; import createMockApollo from 'helpers/mock_apollo_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper'; import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises'; import waitForPromises from 'helpers/wait_for_promises';
import { redirectTo } from '~/lib/utils/url_utility'; import { redirectTo } from '~/lib/utils/url_utility';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
import { import {
REPORT_TYPE_DEPENDENCY_SCANNING, REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_SECRET_DETECTION, REPORT_TYPE_SECRET_DETECTION,
...@@ -23,12 +23,15 @@ describe('ManageViaMr component', () => { ...@@ -23,12 +23,15 @@ describe('ManageViaMr component', () => {
let wrapper; let wrapper;
const findButton = () => wrapper.findComponent(GlButton); const findButton = () => wrapper.findComponent(GlButton);
describe.each` describe.each`
featureName | featureType | mutation | mutationId featureName | featureType | mutation | mutationType
${'Dependency Scanning'} | ${REPORT_TYPE_DEPENDENCY_SCANNING} | ${configureDependencyScanningMutation} | ${'configureDependencyScanning'} ${'Dependency Scanning'} | ${REPORT_TYPE_DEPENDENCY_SCANNING} | ${configureDependencyScanningMutation} | ${'configureDependencyScanning'}
${'Secret Detection'} | ${REPORT_TYPE_SECRET_DETECTION} | ${configureSecretDetectionMutation} | ${'configureSecretDetection'} ${'Secret Detection'} | ${REPORT_TYPE_SECRET_DETECTION} | ${configureSecretDetectionMutation} | ${'configureSecretDetection'}
`('$featureType', ({ featureName, mutation, featureType, mutationId }) => { `('$featureType', ({ featureName, featureType, mutation, mutationType }) => {
const buildConfigureSecurityFeatureMock = buildConfigureSecurityFeatureMockFactory(mutationId); const buildConfigureSecurityFeatureMock = buildConfigureSecurityFeatureMockFactory(
mutationType,
);
const successHandler = async () => buildConfigureSecurityFeatureMock(); const successHandler = async () => buildConfigureSecurityFeatureMock();
const noSuccessPathHandler = async () => const noSuccessPathHandler = async () =>
buildConfigureSecurityFeatureMock({ buildConfigureSecurityFeatureMock({
...@@ -50,14 +53,11 @@ describe('ManageViaMr component', () => { ...@@ -50,14 +53,11 @@ describe('ManageViaMr component', () => {
wrapper = extendedWrapper( wrapper = extendedWrapper(
mount(ManageViaMr, { mount(ManageViaMr, {
apolloProvider: mockApollo, apolloProvider: mockApollo,
provide: {
projectPath: 'testProjectPath',
},
propsData: { propsData: {
feature: { feature: {
name: featureName, name: featureName,
type: featureType,
configured: isFeatureConfigured, configured: isFeatureConfigured,
type: featureType,
}, },
}, },
}), }),
......
...@@ -10,7 +10,9 @@ import { redirectTo } from '~/lib/utils/url_utility'; ...@@ -10,7 +10,9 @@ import { redirectTo } from '~/lib/utils/url_utility';
import configureSastMutation from '~/security_configuration/graphql/configure_sast.mutation.graphql'; import configureSastMutation from '~/security_configuration/graphql/configure_sast.mutation.graphql';
import { makeEntities, makeSastCiConfiguration } from '../../helpers'; import { makeEntities, makeSastCiConfiguration } from '../../helpers';
jest.mock('~/lib/utils/url_utility'); jest.mock('~/lib/utils/url_utility', () => ({
redirectTo: jest.fn(),
}));
const projectPath = 'group/project'; const projectPath = 'group/project';
const sastAnalyzersDocumentationPath = '/help/sast/analyzers'; const sastAnalyzersDocumentationPath = '/help/sast/analyzers';
......
...@@ -28169,6 +28169,9 @@ msgstr "" ...@@ -28169,6 +28169,9 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request" msgid "SecurityConfiguration|Configure via Merge Request"
msgstr "" msgstr ""
msgid "SecurityConfiguration|Configure via merge request"
msgstr ""
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later." msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr "" msgstr ""
...@@ -28205,6 +28208,9 @@ msgstr "" ...@@ -28205,6 +28208,9 @@ msgstr ""
msgid "SecurityConfiguration|SAST Configuration" msgid "SecurityConfiguration|SAST Configuration"
msgstr "" msgstr ""
msgid "SecurityConfiguration|SAST merge request creation mutation failed"
msgstr ""
msgid "SecurityConfiguration|Security Control" msgid "SecurityConfiguration|Security Control"
msgstr "" msgstr ""
......
import { mount } from '@vue/test-utils'; import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper'; import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import ConfigurationTable from '~/security_configuration/components/configuration_table.vue'; import ConfigurationTable from '~/security_configuration/components/configuration_table.vue';
import { scanners, UPGRADE_CTA } from '~/security_configuration/components/constants'; import { scanners, UPGRADE_CTA } from '~/security_configuration/components/scanners_constants';
import { import {
REPORT_TYPE_SAST, REPORT_TYPE_SAST,
...@@ -12,13 +12,7 @@ describe('Configuration Table Component', () => { ...@@ -12,13 +12,7 @@ describe('Configuration Table Component', () => {
let wrapper; let wrapper;
const createComponent = () => { const createComponent = () => {
wrapper = extendedWrapper( wrapper = extendedWrapper(mount(ConfigurationTable, {}));
mount(ConfigurationTable, {
provide: {
projectPath: 'testProjectPath',
},
}),
);
}; };
const findHelpLinks = () => wrapper.findAll('[data-testid="help-link"]'); const findHelpLinks = () => wrapper.findAll('[data-testid="help-link"]');
...@@ -36,10 +30,8 @@ describe('Configuration Table Component', () => { ...@@ -36,10 +30,8 @@ describe('Configuration Table Component', () => {
expect(wrapper.text()).toContain(scanner.name); expect(wrapper.text()).toContain(scanner.name);
expect(wrapper.text()).toContain(scanner.description); expect(wrapper.text()).toContain(scanner.description);
if (scanner.type === REPORT_TYPE_SAST) { if (scanner.type === REPORT_TYPE_SAST) {
expect(wrapper.findByTestId(scanner.type).text()).toBe('Configure via Merge Request'); expect(wrapper.findByTestId(scanner.type).text()).toBe('Configure via merge request');
} else if (scanner.type === REPORT_TYPE_SECRET_DETECTION) { } else if (scanner.type !== REPORT_TYPE_SECRET_DETECTION) {
expect(wrapper.findByTestId(scanner.type).exists()).toBe(false);
} else {
expect(wrapper.findByTestId(scanner.type).text()).toMatchInterpolatedText(UPGRADE_CTA); expect(wrapper.findByTestId(scanner.type).text()).toMatchInterpolatedText(UPGRADE_CTA);
} }
}); });
......
import { GlButton } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { redirectTo } from '~/lib/utils/url_utility';
import ManageSast from '~/security_configuration/components/manage_sast.vue';
import configureSastMutation from '~/security_configuration/graphql/configure_sast.mutation.graphql';
jest.mock('~/lib/utils/url_utility', () => ({
redirectTo: jest.fn(),
}));
Vue.use(VueApollo);
describe('Manage Sast Component', () => {
let wrapper;
const findButton = () => wrapper.findComponent(GlButton);
const successHandler = async () => {
return {
data: {
configureSast: {
successPath: 'testSuccessPath',
errors: [],
__typename: 'ConfigureSastPayload',
},
},
};
};
const noSuccessPathHandler = async () => {
return {
data: {
configureSast: {
successPath: '',
errors: [],
__typename: 'ConfigureSastPayload',
},
},
};
};
const errorHandler = async () => {
return {
data: {
configureSast: {
successPath: 'testSuccessPath',
errors: ['foo'],
__typename: 'ConfigureSastPayload',
},
},
};
};
const pendingHandler = () => new Promise(() => {});
function createMockApolloProvider(handler) {
const requestHandlers = [[configureSastMutation, handler]];
return createMockApollo(requestHandlers);
}
function createComponent(options = {}) {
const { mockApollo } = options;
wrapper = extendedWrapper(
mount(ManageSast, {
apolloProvider: mockApollo,
}),
);
}
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
it('should render Button with correct text', () => {
createComponent();
expect(findButton().text()).toContain('Configure via merge request');
});
describe('given a successful response', () => {
beforeEach(() => {
const mockApollo = createMockApolloProvider(successHandler);
createComponent({ mockApollo });
});
it('should call redirect helper with correct value', async () => {
await wrapper.trigger('click');
await waitForPromises();
expect(redirectTo).toHaveBeenCalledTimes(1);
expect(redirectTo).toHaveBeenCalledWith('testSuccessPath');
// This is done for UX reasons. If the loading prop is set to false
// on success, then there's a period where the button is clickable
// again. Instead, we want the button to display a loading indicator
// for the remainder of the lifetime of the page (i.e., until the
// browser can start painting the new page it's been redirected to).
expect(findButton().props().loading).toBe(true);
});
});
describe('given a pending response', () => {
beforeEach(() => {
const mockApollo = createMockApolloProvider(pendingHandler);
createComponent({ mockApollo });
});
it('renders spinner correctly', async () => {
expect(findButton().props('loading')).toBe(false);
await wrapper.trigger('click');
await waitForPromises();
expect(findButton().props('loading')).toBe(true);
});
});
describe.each`
handler | message
${noSuccessPathHandler} | ${'SAST merge request creation mutation failed'}
${errorHandler} | ${'foo'}
`('given an error response', ({ handler, message }) => {
beforeEach(() => {
const mockApollo = createMockApolloProvider(handler);
createComponent({ mockApollo });
});
it('should catch and emit error', async () => {
await wrapper.trigger('click');
await waitForPromises();
expect(wrapper.emitted('error')).toEqual([[message]]);
expect(findButton().props('loading')).toBe(false);
});
});
});
import { mount } from '@vue/test-utils'; import { mount } from '@vue/test-utils';
import { UPGRADE_CTA } from '~/security_configuration/components/constants'; import { UPGRADE_CTA } from '~/security_configuration/components/scanners_constants';
import Upgrade from '~/security_configuration/components/upgrade.vue'; import Upgrade from '~/security_configuration/components/upgrade.vue';
const TEST_URL = 'http://www.example.test'; const TEST_URL = 'http://www.example.test';
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment