Skip to content
Snippets Groups Projects
Commit bfc52e17 authored by Artur Fedorov's avatar Artur Fedorov
Browse files

Merge branch 'create-integration-tests' into 'master'

Create security orchestration integration test foundation

See merge request https://gitlab.com/gitlab-org/gitlab/-/merge_requests/138893



Merged-by: default avatarArtur Fedorov <afedorov@gitlab.com>
Approved-by: default avatarArtur Fedorov <afedorov@gitlab.com>
Reviewed-by: default avatarAlexander Turinske <aturinske@gitlab.com>
Reviewed-by: default avatarArtur Fedorov <afedorov@gitlab.com>
Co-authored-by: default avatarAlexander Turinske <aturinske@gitlab.com>
parents 9b868de6 feeb518c
No related branches found
No related tags found
No related merge requests found
Showing
with 359 additions and 0 deletions
Loading
Loading
@@ -6,6 +6,8 @@ import { DEFAULT_ASSIGNED_POLICY_PROJECT } from './constants';
import { decomposeApprovers } from './utils';
 
export default (el, namespaceType) => {
if (!el) return null;
const {
assignedPolicyProject,
disableScanPolicyUpdate,
Loading
Loading
Loading
Loading
@@ -11,6 +11,8 @@ const apolloProvider = new VueApollo({
});
 
export default (el, namespaceType) => {
if (!el) return null;
const {
assignedPolicyProject,
disableSecurityPolicyProject,
Loading
Loading
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { mount } from '@vue/test-utils';
import createMockApollo from 'helpers/mock_apollo_helper';
import {
projectScanExecutionPolicies,
groupScanExecutionPolicies,
projectScanResultPolicies,
groupScanResultPolicies,
} from 'ee_jest/security_orchestration/mocks/mock_apollo';
import { mockScanExecutionPoliciesResponse } from 'ee_jest/security_orchestration/mocks/mock_scan_execution_policy_data';
import { mockScanResultPoliciesResponse } from 'ee_jest/security_orchestration/mocks/mock_scan_result_policy_data';
import ListHeader from 'ee/security_orchestration/components/policies/list_header.vue';
import ListComponent from 'ee/security_orchestration/components/policies/list_component.vue';
import App from 'ee/security_orchestration/components/policies/app.vue';
import projectScanExecutionPoliciesQuery from 'ee/security_orchestration/graphql/queries/project_scan_execution_policies.query.graphql';
import groupScanExecutionPoliciesQuery from 'ee/security_orchestration/graphql/queries/group_scan_execution_policies.query.graphql';
import projectScanResultPoliciesQuery from 'ee/security_orchestration/graphql/queries/project_scan_result_policies.query.graphql';
import groupScanResultPoliciesQuery from 'ee/security_orchestration/graphql/queries/group_scan_result_policies.query.graphql';
import { DEFAULT_PROVIDE } from './mocks';
Vue.use(VueApollo);
const projectScanExecutionPoliciesSpy = projectScanExecutionPolicies(
mockScanExecutionPoliciesResponse,
);
const groupScanExecutionPoliciesSpy = groupScanExecutionPolicies(mockScanExecutionPoliciesResponse);
const projectScanResultPoliciesSpy = projectScanResultPolicies(mockScanResultPoliciesResponse);
const groupScanResultPoliciesSpy = groupScanResultPolicies(mockScanResultPoliciesResponse);
const defaultRequestHandlers = {
projectScanExecutionPolicies: projectScanExecutionPoliciesSpy,
groupScanExecutionPolicies: groupScanExecutionPoliciesSpy,
projectScanResultPolicies: projectScanResultPoliciesSpy,
groupScanResultPolicies: groupScanResultPoliciesSpy,
};
describe('Policies List', () => {
let wrapper;
let requestHandlers;
const findPoliciesHeader = () => wrapper.findComponent(ListHeader);
const findPoliciesList = () => wrapper.findComponent(ListComponent);
const createWrapper = ({ handlers = [] } = {}) => {
requestHandlers = {
...defaultRequestHandlers,
...handlers,
};
wrapper = mount(App, {
provide: {
...DEFAULT_PROVIDE,
},
apolloProvider: createMockApollo([
[projectScanExecutionPoliciesQuery, requestHandlers.projectScanExecutionPolicies],
[groupScanExecutionPoliciesQuery, requestHandlers.groupScanExecutionPolicies],
[projectScanResultPoliciesQuery, requestHandlers.projectScanResultPolicies],
[groupScanResultPoliciesQuery, requestHandlers.groupScanResultPolicies],
]),
});
};
describe('default', () => {
beforeEach(() => {
createWrapper();
});
it('renders the page correctly', () => {
expect(findPoliciesHeader().exists()).toBe(true);
expect(findPoliciesList().exists()).toBe(true);
});
});
});
import initPoliciesList from 'ee/security_orchestration/security_policies_list';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import { NAMESPACE_TYPES } from 'ee/security_orchestration/constants';
import { DEFAULT_PROVIDE } from './mocks';
const EMPTY_DIV = document.createElement('div');
const TEST_DATASET = {
disableSecurityPolicyProject: 'false',
disableScanPolicyUpdate: 'false',
};
describe('Policies List', () => {
let vm;
let root;
beforeEach(() => {
root = document.createElement('div');
document.body.appendChild(root);
setWindowLocation(`${TEST_HOST}/-/security/policies`);
});
afterEach(() => {
if (vm) {
vm.$destroy();
}
root.remove();
});
const createComponent = ({ data, type }) => {
const el = document.createElement('div');
Object.assign(el.dataset, { ...DEFAULT_PROVIDE, ...TEST_DATASET, ...data });
root.appendChild(el);
vm = initPoliciesList(el, type);
};
const createEmptyComponent = () => {
vm = initPoliciesList(null, null);
};
describe('default states', () => {
it('sets up project-level', () => {
createComponent({
data: { namespacePath: 'path/to/project' },
type: NAMESPACE_TYPES.PROJECT,
});
expect(root).not.toStrictEqual(EMPTY_DIV);
});
it('sets up group-level', () => {
createComponent({ data: { namespacePath: 'path/to/group' }, type: NAMESPACE_TYPES.GROUP });
expect(root).not.toStrictEqual(EMPTY_DIV);
});
});
describe('error states', () => {
it('does not have an element', () => {
createEmptyComponent();
expect(root).toStrictEqual(EMPTY_DIV);
});
});
});
import { NAMESPACE_TYPES } from 'ee/security_orchestration/constants';
export const DEFAULT_PROVIDE = {
assignedPolicyProject: null,
disableSecurityPolicyProject: false,
disableScanPolicyUpdate: false,
documentationPath: 'path/to/docs',
emptyFilterSvgPath: 'path/to/svg',
emptyListSvgPath: 'path/to/list.svg',
namespacePath: 'path/to/namespace',
namespaceType: NAMESPACE_TYPES.PROJECT,
newPolicyPath: '/-/security/policies/new',
};
import initPolicyEditorApp from 'ee/security_orchestration/policy_editor';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import { NAMESPACE_TYPES } from 'ee/security_orchestration/constants';
import { DEFAULT_PROVIDE } from './mocks';
const EMPTY_DIV = document.createElement('div');
const TEST_DATASET = {
assignedPolicyProject:
'{"id":"gid://gitlab/Project/19","name":"Policies - Project","full_path":"gitlab-org/policies-project","branch":"main"}',
disableSecurityPolicyProject: 'false',
disableScanPolicyUpdate: 'false',
globalGroupApproversEnabled: 'true',
maxActiveScanExecutionPoliciesReached: 'false',
maxActiveScanResultPoliciesReached: 'false',
maxScanExecutionPoliciesAllowed: '5',
maxScanResultPoliciesAllowed: '5',
roleApproverTypes: '["developer", "maintainer", "owner"]',
softwareLicenses: '["3dfx Glide License"]',
timezones:
'[{"identifier":"Etc/GMT+12","name":"International Date Line West","abbr":"-12","offset":-43200,"formatted_offset":"-12:00"}]',
};
describe('Policy Editor', () => {
let vm;
let root;
beforeEach(() => {
root = document.createElement('div');
document.body.appendChild(root);
setWindowLocation(`${TEST_HOST}/-/security/policies/new`);
});
afterEach(() => {
if (vm) {
vm.$destroy();
}
root.remove();
});
const createComponent = ({ data, type }) => {
const el = document.createElement('div');
Object.assign(el.dataset, { ...DEFAULT_PROVIDE, ...TEST_DATASET, ...data });
root.appendChild(el);
vm = initPolicyEditorApp(el, type);
};
const createEmptyComponent = () => {
vm = initPolicyEditorApp(null, null);
};
describe('default states', () => {
it('sets up project-level', () => {
createComponent({
data: { namespacePath: 'path/to/project' },
type: NAMESPACE_TYPES.PROJECT,
});
expect(root).not.toStrictEqual(EMPTY_DIV);
});
it('sets up group-level', () => {
createComponent({ data: { namespacePath: 'path/to/group' }, type: NAMESPACE_TYPES.GROUP });
expect(root).not.toStrictEqual(EMPTY_DIV);
});
});
describe('error states', () => {
it('does not have an element', () => {
createEmptyComponent();
expect(root).toStrictEqual(EMPTY_DIV);
});
});
});
import { NAMESPACE_TYPES } from 'ee/security_orchestration/constants';
export const DEFAULT_PROVIDE = {
disableScanPolicyUpdate: false,
disableSecurityPolicyProject: false,
policyEditorEmptyStateSvgPath: 'path/to/svg',
namespaceId: 1,
namespacePath: 'path/to/project',
namespaceType: NAMESPACE_TYPES.PROJECT,
scanPolicyDocumentationPath: 'path/to/policy-docs',
scanResultPolicyApprovers: {
user: [{ id: 1, username: 'the.one', state: 'active' }],
group: [],
role: [],
},
assignedPolicyProject: {},
createAgentHelpPath: 'path/to/agent-docs',
globalGroupApproversEnabled: false,
maxActiveScanExecutionPoliciesReached: false,
maxActiveScanResultPoliciesReached: false,
maxScanExecutionPoliciesAllowed: 5,
maxScanResultPoliciesAllowed: 5,
policiesPath: 'path/to/policies',
policyType: 'scan_execution',
roleApproverTypes: [],
rootNamespacePath: 'path/to/root',
parsedSoftwareLicenses: [],
timezones: [],
};
import { GlEmptyState } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import App from 'ee/security_orchestration/components/policy_editor/app.vue';
import { DEFAULT_ASSIGNED_POLICY_PROJECT } from 'ee/security_orchestration/constants';
import ScanAction from 'ee/security_orchestration/components/policy_editor/scan_execution/action/scan_action.vue';
import RuleSection from 'ee/security_orchestration/components/policy_editor/scan_execution/rule/rule_section.vue';
import { DEFAULT_PROVIDE } from './mocks';
describe('Policy Editor', () => {
let wrapper;
const createWrapper = ({ propsData = {}, provide = {}, glFeatures = {} } = {}) => {
wrapper = mountExtended(App, {
propsData: {
assignedPolicyProject: DEFAULT_ASSIGNED_POLICY_PROJECT,
...propsData,
},
provide: {
...DEFAULT_PROVIDE,
glFeatures,
...provide,
},
});
};
const findSelectScanExecutionPolicyButton = () =>
wrapper.findByTestId('select-policy-scan_execution_policy');
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
const findScanAction = () => wrapper.findComponent(ScanAction);
const findRuleSection = () => wrapper.findComponent(RuleSection);
beforeEach(() => {
createWrapper();
findSelectScanExecutionPolicyButton().vm.$emit('click');
});
afterEach(() => {
window.gon = {};
});
describe('rendering', () => {
it('renders the page correctly', () => {
expect(findEmptyState().exists()).toBe(false);
expect(findScanAction().exists()).toBe(true);
expect(findRuleSection().exists()).toBe(true);
});
});
});
import { GlEmptyState } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import App from 'ee/security_orchestration/components/policy_editor/app.vue';
import SettingsSection from 'ee/security_orchestration/components/policy_editor/scan_result/settings/settings_section.vue';
import { DEFAULT_ASSIGNED_POLICY_PROJECT } from 'ee/security_orchestration/constants';
import ActionSection from 'ee/security_orchestration/components/policy_editor/scan_result/action/action_section.vue';
import RuleSection from 'ee/security_orchestration/components/policy_editor/scan_result/rule/rule_section.vue';
import { DEFAULT_PROVIDE } from './mocks';
describe('Policy Editor', () => {
let wrapper;
const createWrapper = ({ propsData = {}, provide = {}, glFeatures = {} } = {}) => {
wrapper = mountExtended(App, {
propsData: {
assignedPolicyProject: DEFAULT_ASSIGNED_POLICY_PROJECT,
...propsData,
},
provide: {
...DEFAULT_PROVIDE,
glFeatures,
...provide,
},
});
};
const findSelectScanResultPolicyButton = () =>
wrapper.findByTestId('select-policy-scan_result_policy');
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
const findActionSection = () => wrapper.findComponent(ActionSection);
const findRuleSection = () => wrapper.findComponent(RuleSection);
const findSettingsSection = () => wrapper.findComponent(SettingsSection);
beforeEach(() => {
createWrapper();
findSelectScanResultPolicyButton().vm.$emit('click');
});
afterEach(() => {
window.gon = {};
});
describe('rendering', () => {
it('renders the page correctly', () => {
expect(findEmptyState().exists()).toBe(false);
expect(findActionSection().exists()).toBe(true);
expect(findRuleSection().exists()).toBe(true);
expect(findSettingsSection().exists()).toBe(false);
});
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment