aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openecomp-ui/package.json3
-rw-r--r--openecomp-ui/resources/scss/_modules.scss2
-rw-r--r--openecomp-ui/resources/scss/modules/_softwareProductValidationPage.scss80
-rw-r--r--openecomp-ui/resources/scss/modules/_softwareProductValidationResultsPage.scss4
-rw-r--r--openecomp-ui/src/nfvo-components/input/validation/Input.jsx1
-rw-r--r--openecomp-ui/src/nfvo-utils/i18n/en.json25
-rw-r--r--openecomp-ui/src/nfvo-utils/unCamelCaseString.js29
-rw-r--r--openecomp-ui/src/sdc-app/common/helpers/ConfigHelper.js27
-rw-r--r--openecomp-ui/src/sdc-app/common/helpers/ScreensHelper.js12
-rw-r--r--openecomp-ui/src/sdc-app/config/config.json1
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/OnboardingActionHelper.js56
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/OnboardingConstants.js6
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/OnboardingPunchOut.jsx57
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/OnboardingView.jsx19
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProduct.js17
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductReducer.js4
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidation.js89
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationActionHelper.js160
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationConstants.js36
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationReducer.js66
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationView.jsx387
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputs.js28
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputsView.jsx297
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetup.js32
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetupView.jsx320
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js28
-rw-r--r--openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx207
-rw-r--r--openecomp-ui/src/sdc-app/punch-outs.js1
-rw-r--r--openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductFactory.js62
-rw-r--r--openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js498
-rw-r--r--openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationResultsFactory.js163
-rw-r--r--openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationActionHelper.test.js108
-rw-r--r--openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationInputView.test.js97
-rw-r--r--openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationView.test.js122
-rw-r--r--openecomp-ui/test/softwareProduct/validationResults/SoftwareProductValidationResultsView.test.js96
-rw-r--r--openecomp-ui/webpack.config.js3
36 files changed, 3104 insertions, 39 deletions
diff --git a/openecomp-ui/package.json b/openecomp-ui/package.json
index 57a3d2b4a9..4ce2c77582 100644
--- a/openecomp-ui/package.json
+++ b/openecomp-ui/package.json
@@ -47,7 +47,8 @@
"redux": "^3.7.2",
"sdc-ui": "1.6.62",
"uuid-js": "^0.7.5",
- "validator": "^4.3.0"
+ "validator": "^4.3.0",
+ "react-checkbox-tree": "1.4.1"
},
"devDependencies": {
"babel-core": "^6.24.0",
diff --git a/openecomp-ui/resources/scss/_modules.scss b/openecomp-ui/resources/scss/_modules.scss
index ad33275b6d..6668f4c61b 100644
--- a/openecomp-ui/resources/scss/_modules.scss
+++ b/openecomp-ui/resources/scss/_modules.scss
@@ -27,3 +27,5 @@
@import 'modules/softwareProductDeployment';
@import 'modules/versionsPage';
@import 'modules/mergeEditor';
+@import "modules/_softwareProductValidationPage";
+@import "modules/_softwareProductValidationResultsPage";
diff --git a/openecomp-ui/resources/scss/modules/_softwareProductValidationPage.scss b/openecomp-ui/resources/scss/modules/_softwareProductValidationPage.scss
new file mode 100644
index 0000000000..3f944057cd
--- /dev/null
+++ b/openecomp-ui/resources/scss/modules/_softwareProductValidationPage.scss
@@ -0,0 +1,80 @@
+
+.vsp-validation-view {
+ position: relative;
+ .validation-tabs {
+ .sdc-tabs-list {
+ padding-left: 28px;
+ background-color: $tlv-gray;
+ box-shadow: none;
+ border-bottom: 1px solid $light-gray;
+ .sdc-tab {
+ @extend .heading-2;
+ padding-top: 10px;
+ margin-top: 0;
+ &.sdc-tab-active {
+ color: $blue;
+ font-weight: bold;
+ }
+ }
+ }
+ .sdc-tab-content {
+ margin-top: 0;
+ }
+ }
+
+ .validation-view-title {
+ padding-bottom: 5px;
+ font-size: 16px;
+ }
+
+ .validation-view-tab {
+ padding: 30px 60px 70px 60px;
+ }
+
+ .validation-setup-checkbox-tree-section {
+ //height: 260px;
+ clear: both;
+ }
+
+ .validation-setup-selected-tests {
+ height: 160px;
+ width: 100%;
+ border: solid;
+ }
+
+ .validation-setup-available-tests-section {
+ height: 160px;
+ width: 100%;
+ overflow: auto;
+ clear: both;
+ border: solid;
+ }
+
+ .validation-setup-available-tests-section::-webkit-scrollbar {
+ height: 8px;
+ width: 14px;
+ }
+
+ .div-clear-both {
+ clear: both;
+ }
+
+ .validation-view-controllers {
+ position: absolute;
+ right: 40px;
+ top: 10px;
+ display: flex;
+
+ .proceed-to-validation-results-btn {
+ margin-right: 30px;
+ }
+ .change-tabs-btn {
+ width: 191px;
+ margin-right: 36px;
+ height: 36px;
+ }
+ }
+ .validation-setup-checkbox-tree-section label {
+ margin-bottom: 0px;
+ }
+}
diff --git a/openecomp-ui/resources/scss/modules/_softwareProductValidationResultsPage.scss b/openecomp-ui/resources/scss/modules/_softwareProductValidationResultsPage.scss
new file mode 100644
index 0000000000..9ff3696dcb
--- /dev/null
+++ b/openecomp-ui/resources/scss/modules/_softwareProductValidationResultsPage.scss
@@ -0,0 +1,4 @@
+
+.validation-results-test-result-label {
+ padding-left: 10px
+}
diff --git a/openecomp-ui/src/nfvo-components/input/validation/Input.jsx b/openecomp-ui/src/nfvo-components/input/validation/Input.jsx
index f3279b0b6d..b27ba1db3b 100644
--- a/openecomp-ui/src/nfvo-components/input/validation/Input.jsx
+++ b/openecomp-ui/src/nfvo-components/input/validation/Input.jsx
@@ -89,6 +89,7 @@ class Input extends React.Component {
inputRef={input => (this.input = input)}
type={type}
data-test-id={this.props['data-test-id']}
+ placeholder={this.props.placeholder || ''}
/>
)}
{type === 'number' && (
diff --git a/openecomp-ui/src/nfvo-utils/i18n/en.json b/openecomp-ui/src/nfvo-utils/i18n/en.json
index 4634c37ebf..1ad23b7a1a 100644
--- a/openecomp-ui/src/nfvo-utils/i18n/en.json
+++ b/openecomp-ui/src/nfvo-utils/i18n/en.json
@@ -631,6 +631,27 @@
"VNF Header Vendor" : "Vendor",
"VNF Header Desc" : "Description",
"VNF Header Action" : "Action",
-
- "GENERIC_ERROR": "An error has occurred. Please contact your System Administrator for further assistance."
+
+ "GENERIC_ERROR": "An error has occurred. Please contact your System Administrator for further assistance.",
+
+ "VSP ID" : "VSP ID",
+ "VSP Version" : "VSP Version",
+ "BACK" : "BACK",
+ "NEXT" : "NEXT",
+ "Validation Results" : "Validation Results",
+ "Validation" : "Validation",
+ "Setup": "Setup",
+ "Inputs": "Inputs",
+ "Certifications Query": "Certifications Query",
+ "No Certifications Query are Available": "No Certifications Query are Available",
+ "Selected Certifications Query": "Selected Certifications Query",
+ "Compliance Checks": "Compliance Checks",
+ "No Compliance Checks are Available": "No Compliance Checks are Available",
+ "Selected Compliance Tests": "Selected Compliance Tests",
+ "Value Should Be Minimum of {minLength} characters and a Maximum of {maxLength} characters": "Value Should Be Minimum of {minLength} characters and a Maximum of {maxLength} characters",
+ "{title} Inputs :": "{title} Inputs :",
+ "Scenario: {scenario} | Status: {status}": "Scenario: {scenario} | Status: {status}",
+ "{title} results are not available": "{title} results are not available",
+ "Test Results": "Test Results",
+ "No Validation Checks Performed": "No Validation Checks Performed"
}
diff --git a/openecomp-ui/src/nfvo-utils/unCamelCaseString.js b/openecomp-ui/src/nfvo-utils/unCamelCaseString.js
new file mode 100644
index 0000000000..656f65fbc0
--- /dev/null
+++ b/openecomp-ui/src/nfvo-utils/unCamelCaseString.js
@@ -0,0 +1,29 @@
+/*!
+ * Copyright (C) 2019 Vodafone Group.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+function unCamelCaseString(message) {
+ return message
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
+ .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
+ .replace(/^./, function(str) {
+ return str.toUpperCase();
+ });
+}
+
+let unCamelCasedString = str => {
+ return unCamelCaseString(str);
+};
+
+export default unCamelCasedString;
diff --git a/openecomp-ui/src/sdc-app/common/helpers/ConfigHelper.js b/openecomp-ui/src/sdc-app/common/helpers/ConfigHelper.js
new file mode 100644
index 0000000000..3e09ffe288
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/common/helpers/ConfigHelper.js
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import RestAPIUtil from 'nfvo-utils/RestAPIUtil.js';
+import Configuration from 'sdc-app/config/Configuration.js';
+
+const restPrefix = Configuration.get('defaultRestOnboardingPrefix');
+
+const ConfigHelper = {
+ fetchVspConfig() {
+ return RestAPIUtil.get(`${restPrefix}/v1.0/externaltesting/config`);
+ }
+};
+
+export default ConfigHelper;
diff --git a/openecomp-ui/src/sdc-app/common/helpers/ScreensHelper.js b/openecomp-ui/src/sdc-app/common/helpers/ScreensHelper.js
index fbf0239ffb..58f47957de 100644
--- a/openecomp-ui/src/sdc-app/common/helpers/ScreensHelper.js
+++ b/openecomp-ui/src/sdc-app/common/helpers/ScreensHelper.js
@@ -197,6 +197,18 @@ const ScreensHelper = {
vspProps
);
break;
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION:
+ OnboardingActionHelper.navigateToSoftwareProductValidation(
+ dispatch,
+ vspProps
+ );
+ break;
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS:
+ OnboardingActionHelper.navigateToSoftwareProductValidationResults(
+ dispatch,
+ vspProps
+ );
+ break;
case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
OnboardingActionHelper.navigateToSoftwareProductDependencies(
dispatch,
diff --git a/openecomp-ui/src/sdc-app/config/config.json b/openecomp-ui/src/sdc-app/config/config.json
index 2e94d8672f..784f19a1fc 100644
--- a/openecomp-ui/src/sdc-app/config/config.json
+++ b/openecomp-ui/src/sdc-app/config/config.json
@@ -5,6 +5,7 @@
"appContextPath": "/onboarding",
"defaultRestPrefix": "/onboarding-api",
"defaultRestCatalogPrefix": "/sdc1/feProxy/rest",
+ "defaultRestOnboardingPrefix": "/sdc1/feProxy/onboarding-api",
"defaultWebsocketProtocol": "wss",
"defaultWebsocketPort": "8181",
"defaultDebugWebsocketPort": "9000",
diff --git a/openecomp-ui/src/sdc-app/onboarding/OnboardingActionHelper.js b/openecomp-ui/src/sdc-app/onboarding/OnboardingActionHelper.js
index c3cf8b292f..8385da750f 100644
--- a/openecomp-ui/src/sdc-app/onboarding/OnboardingActionHelper.js
+++ b/openecomp-ui/src/sdc-app/onboarding/OnboardingActionHelper.js
@@ -48,6 +48,8 @@ import { actionTypes as filterActionTypes } from './onboard/filter/FilterConstan
import FeaturesActionHelper from 'sdc-app/features/FeaturesActionHelper.js';
import { notificationActions } from 'nfvo-components/notification/NotificationsConstants.js';
import i18n from 'nfvo-utils/i18n/i18n.js';
+import SoftwareProductValidationActionHelper from './softwareProduct/validation/SoftwareProductValidationActionHelper.js';
+import { actionTypes as modalActionTypes } from 'nfvo-components/modal/GlobalModalConstants.js';
function setCurrentScreen(dispatch, screen, props = {}) {
dispatch({
@@ -88,6 +90,13 @@ const OnboardingActionHelper = {
});
},
+ saveIsValidationDisabled(dispatch, { isValidationDisabled }) {
+ SoftwareProductValidationActionHelper.setIsVspValidationDisabled(
+ dispatch,
+ { isValidationDisabled }
+ );
+ },
+
autoSaveBeforeNavigate(
dispatch,
{ softwareProductId, version, vspComponentId, dataToSave }
@@ -381,6 +390,53 @@ const OnboardingActionHelper = {
});
},
+ navigateToSoftwareProductValidation(
+ dispatch,
+ { softwareProductId, version, status }
+ ) {
+ SoftwareProductValidationActionHelper.fetchVspChecks(dispatch)
+ .then(() => {
+ SoftwareProductValidationActionHelper.setCertificationChecked(
+ dispatch,
+ []
+ );
+ SoftwareProductValidationActionHelper.setComplianceChecked(
+ dispatch,
+ []
+ );
+ setCurrentScreen(
+ dispatch,
+ enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION,
+ {
+ softwareProductId,
+ version,
+ status
+ }
+ );
+ })
+ .catch(error => {
+ dispatch({
+ type: modalActionTypes.GLOBAL_MODAL_ERROR,
+ data: {
+ title: 'ERROR',
+ msg: error.responseJSON.message,
+ cancelButtonText: i18n('OK')
+ }
+ });
+ });
+ },
+
+ navigateToSoftwareProductValidationResults(
+ dispatch,
+ { softwareProductId, version, status }
+ ) {
+ setCurrentScreen(
+ dispatch,
+ enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS,
+ { softwareProductId, version, status }
+ );
+ },
+
navigateToSoftwareProductDependencies(
dispatch,
{ softwareProductId, version, status }
diff --git a/openecomp-ui/src/sdc-app/onboarding/OnboardingConstants.js b/openecomp-ui/src/sdc-app/onboarding/OnboardingConstants.js
index 97e82ef9b0..cf8ff12387 100644
--- a/openecomp-ui/src/sdc-app/onboarding/OnboardingConstants.js
+++ b/openecomp-ui/src/sdc-app/onboarding/OnboardingConstants.js
@@ -53,6 +53,8 @@ const breadcrumbsEnum = {
SOFTWARE_PRODUCT_PROCESSES: 'SOFTWARE_PRODUCT_PROCESSES',
SOFTWARE_PRODUCT_DEPLOYMENT: 'SOFTWARE_PRODUCT_DEPLOYMENT',
SOFTWARE_PRODUCT_NETWORKS: 'SOFTWARE_PRODUCT_NETWORKS',
+ SOFTWARE_PRODUCT_VALIDATION: 'SOFTWARE_PRODUCT_VALIDATION',
+ SOFTWARE_PRODUCT_VALIDATION_RESULTS: 'SOFTWARE_PRODUCT_VALIDATION_RESULTS',
SOFTWARE_PRODUCT_DEPENDENCIES: 'SOFTWARE_PRODUCT_DEPENDENCIES',
SOFTWARE_PRODUCT_ACTIVITY_LOG: 'SOFTWARE_PRODUCT_ACTIVITY_LOG',
SOFTWARE_PRODUCT_COMPONENTS: 'SOFTWARE_PRODUCT_COMPONENTS',
@@ -97,6 +99,10 @@ export const enums = keyMirror({
SOFTWARE_PRODUCT_DEPLOYMENT:
breadcrumbsEnum.SOFTWARE_PRODUCT_DEPLOYMENT,
SOFTWARE_PRODUCT_NETWORKS: breadcrumbsEnum.SOFTWARE_PRODUCT_NETWORKS,
+ SOFTWARE_PRODUCT_VALIDATION:
+ breadcrumbsEnum.SOFTWARE_PRODUCT_VALIDATION,
+ SOFTWARE_PRODUCT_VALIDATION_RESULTS:
+ breadcrumbsEnum.SOFTWARE_PRODUCT_VALIDATION_RESULTS,
SOFTWARE_PRODUCT_DEPENDENCIES:
breadcrumbsEnum.SOFTWARE_PRODUCT_DEPENDENCIES,
SOFTWARE_PRODUCT_ACTIVITY_LOG:
diff --git a/openecomp-ui/src/sdc-app/onboarding/OnboardingPunchOut.jsx b/openecomp-ui/src/sdc-app/onboarding/OnboardingPunchOut.jsx
index a73501468c..d50fcccf09 100644
--- a/openecomp-ui/src/sdc-app/onboarding/OnboardingPunchOut.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/OnboardingPunchOut.jsx
@@ -26,7 +26,7 @@ import Application from 'sdc-app/Application.jsx';
import store from 'sdc-app/AppStore.js';
import Configuration from 'sdc-app/config/Configuration.js';
import ScreensHelper from 'sdc-app/common/helpers/ScreensHelper.js';
-
+import ConfigHelper from 'sdc-app/common/helpers/ConfigHelper.js';
import {
onboardingMethod as onboardingMethodTypes,
onboardingOriginTypes
@@ -38,9 +38,32 @@ import { AppContainer } from 'react-hot-loader';
import HeatSetupActionHelper from './softwareProduct/attachments/setup/HeatSetupActionHelper.js';
import { actionTypes, enums, screenTypes } from './OnboardingConstants.js';
+import { actionTypes as modalActionTypes } from 'nfvo-components/modal/GlobalModalConstants.js';
import OnboardingActionHelper from './OnboardingActionHelper.js';
import Onboarding from './Onboarding.js';
+ConfigHelper.fetchVspConfig()
+ .then(response => {
+ let dispatch = action => store.dispatch(action);
+ OnboardingActionHelper.saveIsValidationDisabled(dispatch, {
+ isValidationDisabled:
+ response.enabled === undefined || response.enabled === ''
+ ? true
+ : !response.enabled
+ });
+ })
+ .catch(error => {
+ let dispatch = action => store.dispatch(action);
+ dispatch({
+ type: modalActionTypes.GLOBAL_MODAL_ERROR,
+ data: {
+ title: i18n('ERROR'),
+ msg: error.message || error.responseJSON.message,
+ cancelButtonText: i18n('OK')
+ }
+ });
+ });
+
export default class OnboardingPunchOut {
render({ options: { data, apiRoot, apiHeaders }, onEvent }, element) {
if (!this.unsubscribeFromStore) {
@@ -360,7 +383,8 @@ export default class OnboardingPunchOut {
softwareProductEditor: {
data: currentSoftwareProduct = { onboardingMethod: '' }
},
- softwareProductComponents: { componentsList }
+ softwareProductComponents: { componentsList },
+ softwareProductValidation: { isValidationDisabled }
},
licenseModel: {
licenseModelEditor: { data: currentLicenseModel = {} }
@@ -373,7 +397,8 @@ export default class OnboardingPunchOut {
currentScreen,
currentSoftwareProduct,
currentLicenseModel,
- componentsList
+ componentsList,
+ isValidationDisabled
};
if (
@@ -402,7 +427,8 @@ export default class OnboardingPunchOut {
itemId,
currentSoftwareProduct,
currentLicenseModel,
- componentsList
+ componentsList,
+ isValidationDisabled
}) {
let {
onboardingMethod,
@@ -553,6 +579,8 @@ export default class OnboardingPunchOut {
case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
case enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT:
case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION:
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS:
case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
@@ -578,6 +606,10 @@ export default class OnboardingPunchOut {
enums.BREADCRUMS.SOFTWARE_PRODUCT_DEPLOYMENT,
[enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS]:
enums.BREADCRUMS.SOFTWARE_PRODUCT_NETWORKS,
+ [enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION]:
+ enums.BREADCRUMS.SOFTWARE_PRODUCT_VALIDATION,
+ [enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS]:
+ enums.BREADCRUMS.SOFTWARE_PRODUCT_VALIDATION_RESULTS,
[enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES]:
enums.BREADCRUMS.SOFTWARE_PRODUCT_DEPENDENCIES,
[enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS]:
@@ -676,6 +708,18 @@ export default class OnboardingPunchOut {
{
key:
enums.BREADCRUMS
+ .SOFTWARE_PRODUCT_VALIDATION,
+ displayText: i18n('Validation')
+ },
+ {
+ key:
+ enums.BREADCRUMS
+ .SOFTWARE_PRODUCT_VALIDATION_RESULTS,
+ displayText: i18n('Validation Results')
+ },
+ {
+ key:
+ enums.BREADCRUMS
.SOFTWARE_PRODUCT_DEPENDENCIES,
displayText: i18n('Components Dependencies')
},
@@ -719,6 +763,11 @@ export default class OnboardingPunchOut {
case enums.BREADCRUMS
.SOFTWARE_PRODUCT_DEPENDENCIES:
return componentsList.length > 1;
+ case enums.BREADCRUMS
+ .SOFTWARE_PRODUCT_VALIDATION:
+ case enums.BREADCRUMS
+ .SOFTWARE_PRODUCT_VALIDATION_RESULTS:
+ return !isValidationDisabled;
default:
return true;
}
diff --git a/openecomp-ui/src/sdc-app/onboarding/OnboardingView.jsx b/openecomp-ui/src/sdc-app/onboarding/OnboardingView.jsx
index 7156e2e253..d4358909d5 100644
--- a/openecomp-ui/src/sdc-app/onboarding/OnboardingView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/OnboardingView.jsx
@@ -31,6 +31,8 @@ import SoftwareProductAttachments from './softwareProduct/attachments/SoftwarePr
import SoftwareProductProcesses from './softwareProduct/processes/SoftwareProductProcesses.js';
import SoftwareProductDeployment from './softwareProduct/deployment/SoftwareProductDeployment.js';
import SoftwareProductNetworks from './softwareProduct/networks/SoftwareProductNetworks.js';
+import SoftwareProductValidation from './softwareProduct/validation/SoftwareProductValidation.js';
+import SoftwareProductValidationResults from './softwareProduct/validationResults/SoftwareProductValidationResults.js';
import SoftwareProductDependencies from './softwareProduct/dependencies/SoftwareProductDependencies.js';
import SoftwareProductComponentsList from './softwareProduct/components/SoftwareProductComponents.js';
@@ -145,6 +147,8 @@ export default class OnboardingView extends React.Component {
case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
case enums.SCREEN.SOFTWARE_PRODUCT_DEPLOYMENT:
case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION:
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS:
case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENT_PROCESSES:
@@ -205,6 +209,21 @@ export default class OnboardingView extends React.Component {
/>
);
case enums.SCREEN
+ .SOFTWARE_PRODUCT_VALIDATION:
+ return (
+ <SoftwareProductValidation
+ className="no-padding-content-area"
+ {...props}
+ />
+ );
+ case enums.SCREEN
+ .SOFTWARE_PRODUCT_VALIDATION_RESULTS:
+ return (
+ <SoftwareProductValidationResults
+ {...props}
+ />
+ );
+ case enums.SCREEN
.SOFTWARE_PRODUCT_DEPENDENCIES:
return (
<SoftwareProductDependencies
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProduct.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProduct.js
index d3d7b96a5d..1362165d1f 100644
--- a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProduct.js
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProduct.js
@@ -140,6 +140,7 @@ const buildNavigationBarProps = ({
candidateOnboardingOrigin,
onboardingOrigin
} = currentSoftwareProduct;
+ let { isValidationDisabled } = softwareProduct.softwareProductValidation;
const groups = [
{
id: id,
@@ -177,6 +178,20 @@ const buildNavigationBarProps = ({
meta
},
{
+ id: enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION,
+ name: i18n('Validation'),
+ disabled: false,
+ hidden: isValidationDisabled,
+ meta
+ },
+ {
+ id: enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS,
+ name: i18n('Validation Results'),
+ disabled: false,
+ hidden: isValidationDisabled,
+ meta
+ },
+ {
id: enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS,
name: i18n('Attachments'),
disabled: false,
@@ -586,6 +601,8 @@ const mapActionsToProps = (
case enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS:
case enums.SCREEN.SOFTWARE_PRODUCT_PROCESSES:
case enums.SCREEN.SOFTWARE_PRODUCT_NETWORKS:
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION:
+ case enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS:
case enums.SCREEN.SOFTWARE_PRODUCT_DEPENDENCIES:
case enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG:
case enums.SCREEN.SOFTWARE_PRODUCT_COMPONENTS:
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductReducer.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductReducer.js
index fd4f02cde1..7b8c426964 100644
--- a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductReducer.js
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductReducer.js
@@ -25,6 +25,7 @@ import { actionTypes as heatSetupActionTypes } from './attachments/setup/HeatSet
import SoftwareProductCreationReducer from './creation/SoftwareProductCreationReducer.js';
import SoftwareProductDetailsReducer from './details/SoftwareProductDetailsReducer.js';
import SoftwareProductProcessesListReducer from './processes/SoftwareProductProcessesListReducer.js';
+import SoftwareProductValidationReducer from './validation/SoftwareProductValidationReducer.js';
import SoftwareProductProcessesEditorReducer from './processes/SoftwareProductProcessesEditorReducer.js';
import SoftwareProductDeploymentListReducer from './deployment/SoftwareProductDeploymentListReducer.js';
import SoftwareProductDeploymentEditorReducer from './deployment/editor/SoftwareProductDeploymentEditorReducer.js';
@@ -74,6 +75,9 @@ export default combineReducers({
softwareProductEditor: createPlainDataReducer(
SoftwareProductDetailsReducer
),
+ softwareProductValidation: createPlainDataReducer(
+ SoftwareProductValidationReducer
+ ),
softwareProductProcesses: combineReducers({
processesList: SoftwareProductProcessesListReducer,
processesEditor: createPlainDataReducer(
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidation.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidation.js
new file mode 100644
index 0000000000..a6237e878a
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidation.js
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { connect } from 'react-redux';
+import SoftwareProductValidationView from './SoftwareProductValidationView.jsx';
+import SoftwareProductValidationActionHelper from './SoftwareProductValidationActionHelper.js';
+
+export const mapStateToProps = ({ softwareProduct }) => {
+ let { softwareProductValidation } = softwareProduct;
+ return {
+ softwareProductValidation
+ };
+};
+
+export const mapActionsToProps = dispatch => {
+ return {
+ onErrorThrown: msg => {
+ SoftwareProductValidationActionHelper.onErrorThrown(dispatch, msg);
+ },
+
+ onTestSubmit: (softwareProductId, version, status, tests) => {
+ SoftwareProductValidationActionHelper.navigateToSoftwareProductValidationResults(
+ dispatch,
+ {
+ softwareProductId,
+ version,
+ status,
+ tests
+ }
+ );
+ },
+
+ setVspTestsMap: map => {
+ SoftwareProductValidationActionHelper.setVspTestsMap(dispatch, map);
+ },
+
+ setActiveTab: activeTab => {
+ SoftwareProductValidationActionHelper.setActiveTab(
+ dispatch,
+ activeTab
+ );
+ },
+
+ setComplianceChecked: ({ checked }) => {
+ SoftwareProductValidationActionHelper.setComplianceChecked(
+ dispatch,
+ checked
+ );
+ },
+
+ setCertificationChecked: ({ checked }) => {
+ SoftwareProductValidationActionHelper.setCertificationChecked(
+ dispatch,
+ checked
+ );
+ },
+
+ setTestsRequest: (request, info) => {
+ SoftwareProductValidationActionHelper.setTestsRequest(
+ dispatch,
+ request,
+ info
+ );
+ },
+
+ setGeneralInfo: info => {
+ SoftwareProductValidationActionHelper.setGeneralInfo(
+ dispatch,
+ info
+ );
+ }
+ };
+};
+
+export default connect(mapStateToProps, mapActionsToProps, null, {
+ withRef: true
+})(SoftwareProductValidationView);
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationActionHelper.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationActionHelper.js
new file mode 100644
index 0000000000..d19416a2aa
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationActionHelper.js
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import RestAPIUtil from 'nfvo-utils/RestAPIUtil.js';
+import Configuration from 'sdc-app/config/Configuration.js';
+import getValue from 'nfvo-utils/getValue.js';
+import { actionTypes } from './SoftwareProductValidationConstants.js';
+import ScreensHelper from 'sdc-app/common/helpers/ScreensHelper.js';
+import { enums, screenTypes } from 'sdc-app/onboarding/OnboardingConstants.js';
+import { actionTypes as modalActionTypes } from 'nfvo-components/modal/GlobalModalConstants.js';
+import i18n from 'nfvo-utils/i18n/i18n.js';
+
+function postVSPCertificationChecks(tests) {
+ const restPrefix = Configuration.get('restPrefix');
+ return RestAPIUtil.post(
+ `${restPrefix}/v1.0/externaltesting/executions`,
+ getValue(tests)
+ );
+}
+
+function fetchVspChecks() {
+ const restPrefix = Configuration.get('restPrefix');
+ return RestAPIUtil.get(`${restPrefix}/v1.0/externaltesting/testcasetree`);
+}
+
+const SoftwareProductValidationActionHelper = {
+ navigateToSoftwareProductValidationResults(
+ dispatch,
+ { softwareProductId, version, status, tests }
+ ) {
+ postVSPCertificationChecks(tests)
+ .then(response => {
+ dispatch({
+ type: actionTypes.POST_VSP_TESTS,
+ vspTestResults: response
+ });
+ ScreensHelper.loadScreen(dispatch, {
+ screen: enums.SCREEN.SOFTWARE_PRODUCT_VALIDATION_RESULTS,
+ screenType: screenTypes.SOFTWARE_PRODUCT,
+ props: {
+ softwareProductId,
+ version,
+ status
+ }
+ });
+ })
+ .catch(error => {
+ let errMessage = error.message || error.responseJSON.message;
+ let title = error.responseJSON
+ ? error.responseJSON.status
+ : i18n('Error');
+ dispatch({
+ type: modalActionTypes.GLOBAL_MODAL_ERROR,
+ data: {
+ title: title,
+ msg: errMessage,
+ cancelButtonText: i18n('OK')
+ }
+ });
+ });
+ },
+
+ fetchVspChecks(dispatch) {
+ return new Promise((resolve, reject) => {
+ fetchVspChecks()
+ .then(response => {
+ dispatch({
+ type: actionTypes.FETCH_VSP_CHECKS,
+ vspChecks: response
+ });
+ resolve(response);
+ })
+ .catch(error => {
+ reject(error);
+ });
+ });
+ },
+
+ setActiveTab(dispatch, { activeTab }) {
+ dispatch({
+ type: actionTypes.SET_ACTIVE_TAB,
+ activeTab
+ });
+ },
+
+ onErrorThrown(dispatch, msg) {
+ dispatch({
+ type: modalActionTypes.GLOBAL_MODAL_ERROR,
+ data: {
+ title: i18n('Error'),
+ modalComponentName: i18n('Error'),
+ modalComponentProps: {
+ onClose: () =>
+ dispatch({
+ type: modalActionTypes.GLOBAL_MODAL_CLOSE
+ })
+ },
+ msg: msg,
+ cancelButtonText: i18n('OK')
+ }
+ });
+ },
+
+ setVspTestsMap(dispatch, map) {
+ dispatch({
+ type: actionTypes.SET_VSP_TESTS_MAP,
+ vspTestsMap: map
+ });
+ },
+
+ setComplianceChecked(dispatch, checked) {
+ dispatch({
+ type: actionTypes.SET_COMPLIANCE_CHECKED,
+ complianceChecked: checked
+ });
+ },
+
+ setCertificationChecked(dispatch, checked) {
+ dispatch({
+ type: actionTypes.SET_CERTIFICATION_CHECKED,
+ certificationChecked: checked
+ });
+ },
+
+ setTestsRequest(dispatch, request, info) {
+ dispatch({
+ type: actionTypes.SET_TESTS_REQUEST,
+ testsRequest: request,
+ generalInfo: info
+ });
+ },
+
+ setGeneralInfo(dispatch, info) {
+ dispatch({
+ type: actionTypes.SET_GENERAL_INFO,
+ generalInfo: info
+ });
+ },
+
+ setIsVspValidationDisabled(dispatch, { isValidationDisabled }) {
+ dispatch({
+ type: actionTypes.SET_VSP_VALIDATION_DISABLED,
+ isValidationDisabled: isValidationDisabled
+ });
+ }
+};
+
+export default SoftwareProductValidationActionHelper;
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationConstants.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationConstants.js
new file mode 100644
index 0000000000..2dc5a1cc43
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationConstants.js
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import keyMirror from 'nfvo-utils/KeyMirror.js';
+
+export const tabsMapping = {
+ SETUP: 1,
+ INPUTS: 2
+};
+
+export const actionTypes = keyMirror(
+ {
+ POST_VSP_TESTS: null,
+ FETCH_VSP_CHECKS: null,
+ SET_ACTIVE_TAB: null,
+ SET_VSP_TESTS_MAP: null,
+ SET_COMPLIANCE_CHECKED: null,
+ SET_CERTIFICATION_CHECKED: null,
+ SET_TESTS_REQUEST: null,
+ SET_GENERAL_INFO: null,
+ SET_VSP_VALIDATION_DISABLED: null
+ },
+ 'SoftwareProductValidation'
+);
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationReducer.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationReducer.js
new file mode 100644
index 0000000000..4513e23205
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationReducer.js
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { actionTypes } from './SoftwareProductValidationConstants.js';
+
+export default (state = {}, action) => {
+ switch (action.type) {
+ case actionTypes.POST_VSP_TESTS:
+ return {
+ ...state,
+ vspTestResults: action.vspTestResults
+ };
+ case actionTypes.FETCH_VSP_CHECKS:
+ return {
+ ...state,
+ vspChecks: action.vspChecks
+ };
+ case actionTypes.SET_ACTIVE_TAB:
+ return { ...state, activeTab: action.activeTab };
+ case actionTypes.SET_VSP_TESTS_MAP:
+ return {
+ ...state,
+ vspTestsMap: action.vspTestsMap
+ };
+ case actionTypes.SET_COMPLIANCE_CHECKED:
+ return {
+ ...state,
+ complianceChecked: action.complianceChecked
+ };
+ case actionTypes.SET_CERTIFICATION_CHECKED:
+ return {
+ ...state,
+ certificationChecked: action.certificationChecked
+ };
+ case actionTypes.SET_TESTS_REQUEST:
+ return {
+ ...state,
+ testsRequest: action.testsRequest,
+ generalInfo: action.generalInfo
+ };
+ case actionTypes.SET_GENERAL_INFO:
+ return {
+ ...state,
+ generalInfo: action.generalInfo
+ };
+ case actionTypes.SET_VSP_VALIDATION_DISABLED:
+ return {
+ ...state,
+ isValidationDisabled: action.isValidationDisabled
+ };
+ default:
+ return state;
+ }
+};
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationView.jsx b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationView.jsx
new file mode 100644
index 0000000000..8611c41937
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationView.jsx
@@ -0,0 +1,387 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+import i18n from 'nfvo-utils/i18n/i18n.js';
+import Button from 'sdc-ui/lib/react/Button.js';
+import { Tab, Tabs } from 'sdc-ui/lib/react';
+import { tabsMapping } from './SoftwareProductValidationConstants.js';
+import VspValidationInputs from './inputs/VspValidationInputs.js';
+import VspValidationSetup from './setup/VspValidationSetup.js';
+
+class SoftwareProductValidation extends Component {
+ static propTypes = {
+ onErrorThrown: PropTypes.func,
+ softwareProductValidation: PropTypes.object,
+ onTestSubmit: PropTypes.func,
+ setVspTestsMap: PropTypes.func,
+ setActiveTab: PropTypes.func,
+ setComplianceChecked: PropTypes.func,
+ setCertificationChecked: PropTypes.func
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ complianceCheckList: null,
+ certificationCheckList: null,
+ flatTestsMap: {},
+ generalInfo: {},
+ activeTab: tabsMapping.SETUP,
+ goToValidationInput: false
+ };
+ }
+
+ setMapAndGeneralData(element, testScenario) {
+ let flatTestMap = this.state.flatTestsMap;
+ let generalInputData = this.state.generalInfo;
+ flatTestMap[element.testCaseName] = {
+ title: element.description,
+ parameters: element.inputs,
+ endpoint: element.endpoint,
+ testCaseName: element.testCaseName,
+ testSuiteName: element.testSuiteName,
+ scenario: testScenario
+ };
+ generalInputData[element.testCaseName] = {};
+ element.inputs.forEach(key => {
+ generalInputData[element.testCaseName][key.name] = {
+ isValid: true,
+ errorText: ''
+ };
+ });
+
+ this.setState({
+ flatTestsMap: flatTestMap,
+ generalInfo: generalInputData
+ });
+ }
+
+ buildChildElements(setItem, testScenario) {
+ let parentElement = {};
+ parentElement.value = setItem.name;
+ parentElement.label = setItem.description;
+ parentElement.children = [];
+ if (setItem.children !== undefined) {
+ setItem.children.forEach(element => {
+ let childElement = this.buildChildElements(
+ element,
+ testScenario
+ );
+ if (childElement.children.length !== 0) {
+ parentElement.children.push(childElement);
+ }
+ });
+ }
+ if (setItem.tests !== undefined) {
+ setItem.tests.forEach(element => {
+ parentElement.children.push({
+ value: element.testCaseName,
+ label: element.description
+ });
+ this.setMapAndGeneralData(element, testScenario);
+ });
+ }
+ return parentElement;
+ }
+
+ buildCheckboxParentNode(parentNode, data) {
+ parentNode.value = data.description;
+ parentNode.label = 'All';
+ parentNode.children = [];
+ let scenario = data.name;
+ data.children.forEach(element => {
+ let childElement = this.buildChildElements(element, scenario);
+ if (childElement.children.length !== 0) {
+ parentNode.children.push(childElement);
+ }
+ });
+ if (data.tests !== undefined) {
+ data.tests.forEach(element => {
+ parentNode.children.push({
+ value: element.testCaseName,
+ label: element.description
+ });
+ this.setMapAndGeneralData(element, scenario);
+ });
+ }
+ return parentNode;
+ }
+
+ prepareDataForCheckboxes(res) {
+ let complianceData = {};
+ let certificationData = {};
+ let complianceList = [];
+ let certificationList = [];
+ let { setVspTestsMap } = this.props;
+ if (Object.keys(res).length !== 0 && res.children) {
+ res.children.forEach(element => {
+ if (element.name === 'certification') {
+ certificationData = element;
+ } else if (element.name === 'compliance') {
+ complianceData = element;
+ }
+ });
+
+ let complianceParentNode = {};
+ if (
+ Object.keys(complianceData).length !== 0 &&
+ complianceData.children !== undefined
+ ) {
+ complianceParentNode = this.buildCheckboxParentNode(
+ complianceParentNode,
+ complianceData
+ );
+ if (complianceParentNode.children.length !== 0) {
+ complianceList.push(complianceParentNode);
+ }
+ }
+
+ let certificationParentNode = {};
+ if (
+ Object.keys(certificationData).length !== 0 &&
+ certificationData.children !== undefined
+ ) {
+ certificationParentNode = this.buildCheckboxParentNode(
+ certificationParentNode,
+ certificationData
+ );
+ if (certificationParentNode.children.length !== 0) {
+ certificationList.push(certificationParentNode);
+ }
+ }
+ }
+ this.setState({
+ certificationCheckList: certificationList,
+ complianceCheckList: complianceList
+ });
+ setVspTestsMap(this.state.flatTestsMap);
+ }
+
+ resetState() {
+ this.setState({
+ complianceCheckList: [],
+ certificationCheckList: [],
+ flatTestsMap: {},
+ activeTab: tabsMapping.SETUP,
+ goToValidationInput: false
+ });
+ }
+
+ componentWillMount() {}
+
+ shouldComponentUpdate() {
+ return true;
+ }
+
+ componentDidMount() {
+ let { softwareProductValidation } = this.props;
+ if (softwareProductValidation.vspChecks !== undefined) {
+ this.prepareDataForCheckboxes(softwareProductValidation.vspChecks);
+ }
+ }
+
+ componentWillUnmount() {
+ this.resetState();
+ }
+
+ componentWillReceiveProps(nextProps) {
+ if (
+ nextProps.softwareProductValidation.vspChecks !==
+ this.props.softwareProductValidation.vspChecks
+ ) {
+ let { softwareProductValidation, setActiveTab } = nextProps;
+ if (softwareProductValidation.vspChecks !== undefined) {
+ this.prepareDataForCheckboxes(
+ softwareProductValidation.vspChecks
+ );
+ }
+ this.setState({ activeTab: tabsMapping.SETUP });
+ setActiveTab({ activeTab: tabsMapping.SETUP });
+ }
+ }
+
+ prepareDataForValidationInputsSection() {
+ let {
+ softwareProductId,
+ version,
+ onTestSubmit,
+ onErrorThrown,
+ setTestsRequest,
+ setGeneralInfo
+ } = this.props;
+ return {
+ softwareProductId,
+ version,
+ onTestSubmit,
+ onErrorThrown,
+ setTestsRequest,
+ setGeneralInfo
+ };
+ }
+
+ prepareDataForCheckboxTreeSection() {
+ let {
+ softwareProductValidation,
+ setComplianceChecked,
+ setCertificationChecked
+ } = this.props;
+ let complianceCheckList = this.state.complianceCheckList;
+ let certificationCheckList = this.state.certificationCheckList;
+ return {
+ softwareProductValidation,
+ setComplianceChecked,
+ setCertificationChecked,
+ complianceCheckList,
+ certificationCheckList
+ };
+ }
+
+ handleTabPress(key) {
+ let { setActiveTab } = this.props;
+ switch (key) {
+ case tabsMapping.SETUP:
+ this.setState({ activeTab: tabsMapping.SETUP });
+ setActiveTab({ activeTab: tabsMapping.SETUP });
+ return;
+ case tabsMapping.INPUTS:
+ default:
+ setActiveTab({ activeTab: tabsMapping.INPUTS });
+ this.setState({
+ goToValidationInput: true,
+ activeTab: tabsMapping.INPUTS
+ });
+ return;
+ }
+ }
+
+ formTestsRequest(item, testsRequest) {
+ let { vspTestsMap } = this.props.softwareProductValidation;
+ testsRequest[item] = {
+ parameters: {},
+ scenario: vspTestsMap[item]['scenario'],
+ testCaseName: vspTestsMap[item]['testCaseName'],
+ testSuiteName: vspTestsMap[item]['testSuiteName'],
+ endpoint: vspTestsMap[item]['endpoint']
+ };
+ vspTestsMap[item].parameters.forEach(parameter => {
+ testsRequest[item].parameters[parameter.name] =
+ parameter.defaultValue || '';
+ });
+ return testsRequest;
+ }
+
+ onGoToInputs() {
+ let {
+ setActiveTab,
+ softwareProductValidation,
+ setTestsRequest
+ } = this.props;
+ setActiveTab({ activeTab: tabsMapping.INPUTS });
+ let testsRequest = {};
+ if (softwareProductValidation.complianceChecked) {
+ softwareProductValidation.complianceChecked.forEach(item => {
+ testsRequest = this.formTestsRequest(item, testsRequest);
+ });
+ }
+ if (softwareProductValidation.certificationChecked) {
+ softwareProductValidation.certificationChecked.forEach(item => {
+ testsRequest = this.formTestsRequest(item, testsRequest);
+ });
+ }
+ setTestsRequest(testsRequest, this.state.generalInfo);
+ this.setState({
+ goToValidationInput: true,
+ activeTab: tabsMapping.INPUTS
+ });
+ }
+
+ onGoToSetup() {
+ let { setActiveTab } = this.props;
+ setActiveTab({ activeTab: tabsMapping.SETUP });
+ this.setState({
+ goToValidationInput: false,
+ activeTab: tabsMapping.SETUP
+ });
+ }
+
+ render() {
+ let { softwareProductValidation } = this.props;
+ let isNextDisabled =
+ (softwareProductValidation.certificationChecked === undefined ||
+ softwareProductValidation.certificationChecked.length === 0) &&
+ (softwareProductValidation.complianceChecked === undefined ||
+ softwareProductValidation.complianceChecked.length === 0);
+
+ return (
+ <div className="vsp-validation-view">
+ <div className="validation-view-controllers">
+ {this.state.activeTab === tabsMapping.SETUP && (
+ <Button
+ btnType="secondary"
+ data-test-id="go-to-vsp-validation-inputs"
+ disabled={isNextDisabled}
+ className="change-tabs-btn"
+ onClick={() => this.onGoToInputs()}>
+ {i18n('NEXT')}
+ </Button>
+ )}
+ {this.state.activeTab === tabsMapping.INPUTS && (
+ <Button
+ btnType="secondary"
+ data-test-id="go-to-vsp-validation-setup"
+ className="change-tabs-btn"
+ onClick={() => this.onGoToSetup()}>
+ {i18n('BACK')}
+ </Button>
+ )}
+ </div>
+ <Tabs
+ className="validation-tabs"
+ type="header"
+ activeTab={this.state.activeTab}
+ onTabClick={key => this.handleTabPress(key)}>
+ <Tab
+ tabId={tabsMapping.SETUP}
+ title={i18n('Setup')}
+ disabled={this.state.goToValidationInput}>
+ <div className="validation-view-tab">
+ {this.state.complianceCheckList &&
+ this.state.certificationCheckList && (
+ <VspValidationSetup
+ {...this.prepareDataForCheckboxTreeSection()}
+ />
+ )}
+ </div>
+ </Tab>
+ <Tab
+ tabId={tabsMapping.INPUTS}
+ title={i18n('Inputs')}
+ disabled={!this.state.goToValidationInput}>
+ <div className="validation-view-tab">
+ <VspValidationInputs
+ {...this.prepareDataForValidationInputsSection()}
+ />
+ </div>
+ </Tab>
+ </Tabs>
+ </div>
+ );
+ }
+}
+
+export default SoftwareProductValidation;
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputs.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputs.js
new file mode 100644
index 0000000000..375cd456b6
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputs.js
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { connect } from 'react-redux';
+import VspValidationInputs from './VspValidationInputsView.jsx';
+
+export const mapStateToProps = ({ softwareProduct }) => {
+ let { softwareProductValidation } = softwareProduct;
+ return {
+ softwareProductValidation
+ };
+};
+
+export default connect(mapStateToProps, null, null, {
+ withRef: true
+})(VspValidationInputs);
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputsView.jsx b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputsView.jsx
new file mode 100644
index 0000000000..c2990a2058
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputsView.jsx
@@ -0,0 +1,297 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+import i18n from 'nfvo-utils/i18n/i18n.js';
+import Button from 'sdc-ui/lib/react/Button.js';
+import GridSection from 'nfvo-components/grid/GridSection.jsx';
+import GridItem from 'nfvo-components/grid/GridItem.jsx';
+import Input from 'nfvo-components/input/validation/Input.jsx';
+import Form from 'nfvo-components/input/validation/Form.jsx';
+
+class VspInputs extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ shouldComponentUpdate() {
+ return true;
+ }
+
+ changeInputs(e, check, parameterName) {
+ let { testsRequest, generalInfo, setTestsRequest } = this.props;
+ testsRequest[check].parameters[parameterName] = e;
+ generalInfo[check][parameterName] = { isValid: true, errorText: '' };
+ setTestsRequest(testsRequest, generalInfo);
+ }
+
+ renderInputs(check) {
+ let { vspTestsMap, testsRequest, generalInfo } = this.props;
+ return (
+ <div className="div-clear-both">
+ <GridSection
+ title={i18n('{title} Inputs :', {
+ title: vspTestsMap[check].title
+ })}>
+ {vspTestsMap[check].parameters.map((parameter, index) => {
+ if (
+ parameter.type === 'text' &&
+ !parameter.metadata.hidden
+ ) {
+ return (
+ <GridItem key={index}>
+ <Input
+ data-test-id={
+ check +
+ '_' +
+ parameter.name +
+ '_input'
+ }
+ isRequired={!parameter.isOptional}
+ label={parameter.description}
+ isValid={
+ generalInfo[check][parameter.name]
+ .isValid
+ }
+ errorText={
+ generalInfo[check][parameter.name]
+ .errorText
+ }
+ type={
+ parameter.metadata.choices
+ ? 'select'
+ : 'text'
+ }
+ value={
+ testsRequest[check].parameters[
+ parameter.name
+ ] || ''
+ }
+ onChange={e => {
+ this.changeInputs(
+ e.target ? e.target.value : e,
+ check,
+ parameter.name
+ );
+ }}
+ disabled={
+ parameter.metadata.disabled || false
+ }>
+ {parameter.metadata.choices && (
+ <option key="placeholder" value="">
+ {i18n('Select...')}
+ </option>
+ )}
+ {parameter.metadata.choices &&
+ parameter.metadata.choices.map(
+ selectOption => (
+ <option
+ key={selectOption.key}
+ value={
+ selectOption.key
+ }>
+ {selectOption.label}
+ </option>
+ )
+ )}
+ </Input>
+ </GridItem>
+ );
+ }
+ })}
+ </GridSection>
+ </div>
+ );
+ }
+
+ render() {
+ let {
+ complianceChecked,
+ vspTestsMap,
+ certificationChecked
+ } = this.props;
+ return (
+ <div>
+ {complianceChecked.map(complianceCheck => {
+ if (vspTestsMap[complianceCheck].parameters.length === 0) {
+ return <div />;
+ } else {
+ return this.renderInputs(complianceCheck);
+ }
+ })}
+ {certificationChecked.map(certificateCheck => {
+ if (vspTestsMap[certificateCheck].parameters.length === 0) {
+ return <div />;
+ } else {
+ return this.renderInputs(certificateCheck);
+ }
+ })}
+ </div>
+ );
+ }
+}
+
+class VspValidationInputs extends Component {
+ static propTypes = {
+ softwareProductValidation: PropTypes.object
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ shouldComponentUpdate() {
+ return true;
+ }
+
+ validateInputs() {
+ let areInputsValid = true;
+ let { softwareProductValidation, setGeneralInfo } = this.props;
+ let generalInfo = softwareProductValidation.generalInfo;
+ Object.keys(softwareProductValidation.testsRequest).forEach(
+ testCaseName => {
+ let requestParameters =
+ softwareProductValidation.testsRequest[testCaseName]
+ .parameters;
+ let validationParameters =
+ softwareProductValidation.vspTestsMap[testCaseName]
+ .parameters;
+ Object.keys(requestParameters).forEach(parameterName => {
+ let parameter = validationParameters.find(
+ o => o.name === parameterName
+ );
+ let isParameterValid = true;
+ let errorText = '';
+ if (
+ parameter.type === 'text' &&
+ parameter.metadata.choices
+ ) {
+ if (
+ !parameter.isOptional &&
+ !requestParameters[parameterName]
+ ) {
+ isParameterValid = false;
+ errorText = i18n('Field is required');
+ }
+ } else if (parameter.type === 'text') {
+ if (
+ !parameter.isOptional &&
+ !requestParameters[parameterName]
+ ) {
+ isParameterValid = false;
+ errorText = i18n('Field is required');
+ } else if (
+ (!parameter.isOptional &&
+ !requestParameters[parameterName]) ||
+ (parameter.metadata.maxLength &&
+ requestParameters[parameterName].length >
+ parseInt(parameter.metadata.maxLength)) ||
+ (parameter.metadata.minLength &&
+ requestParameters[parameterName].length <
+ parseInt(parameter.metadata.minLength) &&
+ requestParameters[parameterName].length > 0)
+ ) {
+ isParameterValid = false;
+ errorText = i18n(
+ 'Value Should Be Minimum of {minLength} characters and a Maximum of {maxLength} characters',
+ {
+ minLength: parameter.metadata.minLength,
+ maxLength: parameter.metadata.maxLength
+ }
+ );
+ }
+ }
+ generalInfo[testCaseName][
+ parameterName
+ ].isValid = isParameterValid;
+ generalInfo[testCaseName][
+ parameterName
+ ].errorText = errorText;
+ areInputsValid = areInputsValid && isParameterValid;
+ });
+ }
+ );
+ if (!areInputsValid) {
+ setGeneralInfo(generalInfo);
+ }
+ return areInputsValid;
+ }
+
+ performVSPTests() {
+ let tests = [];
+ let {
+ version,
+ onTestSubmit,
+ status,
+ softwareProductId,
+ softwareProductValidation
+ } = this.props;
+
+ Object.keys(softwareProductValidation.testsRequest).forEach(key => {
+ tests.push(softwareProductValidation.testsRequest[key]);
+ });
+ if (this.validateInputs()) {
+ onTestSubmit(softwareProductId, version, status, tests);
+ }
+ }
+
+ prepareDataForVspInputs() {
+ let { setTestsRequest } = this.props;
+ let {
+ complianceChecked,
+ certificationChecked,
+ vspTestsMap,
+ testsRequest,
+ generalInfo
+ } = this.props.softwareProductValidation;
+ return {
+ setTestsRequest,
+ complianceChecked,
+ certificationChecked,
+ vspTestsMap,
+ testsRequest,
+ generalInfo
+ };
+ }
+
+ render() {
+ return (
+ <div className="vsp-validation-view">
+ <Form
+ hasButtons={false}
+ formReady={null}
+ isValid={true}
+ onSubmit={() => this.performVSPTests()}
+ isReadOnlyMode={false}>
+ <VspInputs {...this.prepareDataForVspInputs()} />
+ <Button
+ size="default"
+ data-test-id="proceed-to-validation-results-btn"
+ disabled={false}
+ className="proceed-to-validation-monitor-btn"
+ onClick={() => this.performVSPTests()}>
+ {i18n('Submit')}
+ </Button>
+ </Form>
+ </div>
+ );
+ }
+}
+
+export default VspValidationInputs;
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetup.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetup.js
new file mode 100644
index 0000000000..875639e86a
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetup.js
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { connect } from 'react-redux';
+import VspValidationSetupView from './VspValidationSetupView.jsx';
+
+export const mapStateToProps = ({ softwareProduct }) => {
+ let { softwareProductValidation } = softwareProduct;
+ return {
+ softwareProductValidation
+ };
+};
+
+export const mapActionsToProps = () => {
+ return {};
+};
+
+export default connect(mapStateToProps, mapActionsToProps, null, {
+ withRef: true
+})(VspValidationSetupView);
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetupView.jsx b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetupView.jsx
new file mode 100644
index 0000000000..012d50ac93
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validation/setup/VspValidationSetupView.jsx
@@ -0,0 +1,320 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+import i18n from 'nfvo-utils/i18n/i18n.js';
+import GridSection from 'nfvo-components/grid/GridSection.jsx';
+import GridItem from 'nfvo-components/grid/GridItem.jsx';
+import CheckboxTree from 'react-checkbox-tree';
+
+const icons = {
+ check: <span className="glyphicon glyphicon-check" />,
+ uncheck: <span className="glyphicon glyphicon-unchecked" />,
+ halfCheck: <span className="glyphicon glyphicon-stop" />,
+ expandClose: <span className="glyphicon glyphicon-plus" />,
+ expandOpen: <span className="glyphicon glyphicon-minus" />,
+ expandAll: <span className="glyphicon glyphicon-collapse-down" />,
+ collapseAll: <span className="glyphicon glyphicon-collapse-up" />,
+ parentClose: <span className="glyphicon glyphicon-folder-close" />,
+ parentOpen: <span className="glyphicon glyphicon-folder-open" />,
+ leaf: <span className="glyphicon glyphicon-bookmark" />
+};
+
+class CertificationQuery extends React.Component {
+ constructor(props) {
+ super(props);
+ let { certificationChecked, certificationNodes } = this.props;
+ this.state = {
+ checked:
+ certificationChecked === undefined ? [] : certificationChecked,
+ expanded: certificationNodes[0] ? [certificationNodes[0].value] : []
+ };
+ }
+
+ expandFirstNode() {
+ let { certificationNodes } = this.props;
+ this.setState({
+ expanded: certificationNodes[0] ? [certificationNodes[0].value] : []
+ });
+ }
+
+ componentDidMount() {
+ this.expandFirstNode();
+ }
+
+ shouldComponentUpdate() {
+ return true;
+ }
+
+ componentWillReceiveProps(nextProps) {
+ if (
+ nextProps.certificationChecked !== this.props.certificationChecked
+ ) {
+ let expand = this.state.expanded;
+ this.setState({
+ checked: nextProps.certificationChecked || [],
+ expanded: expand
+ });
+ }
+ }
+
+ populateOptions(checkedCertificationQuery) {
+ let { flatTestsMap } = this.props;
+ return (
+ <option>
+ {flatTestsMap[checkedCertificationQuery].title +
+ ' (' +
+ checkedCertificationQuery +
+ ')'}
+ </option>
+ );
+ }
+
+ render() {
+ let { certificationNodes, setCertificationChecked } = this.props;
+ return (
+ <div className="validation-setup-checkbox-tree-section">
+ <GridSection title={i18n('Certifications Query')}>
+ <GridItem colSpan={2}>
+ <div className="validation-view-title">
+ {certificationNodes[0]
+ ? certificationNodes[0].value
+ : ''}
+ </div>
+ <div
+ className="validation-setup-available-tests-section"
+ data-test-id={
+ 'vsp-validation-certifications-query-checkbox-tree'
+ }>
+ {certificationNodes.length > 0 && (
+ <CheckboxTree
+ nodes={certificationNodes}
+ checked={this.state.checked}
+ expanded={this.state.expanded}
+ onCheck={checked => {
+ this.setState(
+ { checked },
+ setCertificationChecked({
+ checked
+ })
+ );
+ }}
+ onExpand={expanded =>
+ this.setState({ expanded })
+ }
+ icons={icons}
+ className="field-section"
+ />
+ )}
+ {certificationNodes.length === 0 && (
+ <div>
+ {i18n(
+ 'No Certifications Query are Available'
+ )}
+ </div>
+ )}
+ </div>
+ </GridItem>
+ <GridItem colSpan={2}>
+ {certificationNodes.length > 0 && (
+ <div>
+ <div className="validation-view-title">
+ {i18n('Selected Certifications Query')}
+ </div>
+ <div>
+ <select
+ className="validation-setup-selected-tests"
+ multiple>
+ {this.state.checked.map(row =>
+ this.populateOptions(row)
+ )}
+ </select>
+ </div>
+ </div>
+ )}
+ </GridItem>
+ </GridSection>
+ </div>
+ );
+ }
+}
+
+class ComplianceTests extends React.Component {
+ constructor(props) {
+ super(props);
+ let { complianceChecked, complianceNodes } = this.props;
+ this.state = {
+ checked: complianceChecked === undefined ? [] : complianceChecked,
+ expanded: complianceNodes[0] ? [complianceNodes[0].value] : []
+ };
+ }
+
+ shouldComponentUpdate() {
+ return true;
+ }
+
+ expandFirstNode() {
+ let { complianceNodes } = this.props;
+ this.setState({
+ expanded: complianceNodes[0] ? [complianceNodes[0].value] : []
+ });
+ }
+
+ componentDidMount() {
+ this.expandFirstNode();
+ }
+
+ componentWillUnmount() {}
+
+ componentWillReceiveProps(nextProps) {
+ let expand = this.state.expanded;
+
+ if (nextProps.complianceChecked !== this.props.complianceChecked) {
+ this.setState({
+ checked: nextProps.complianceChecked || [],
+ expanded: expand
+ });
+ }
+ }
+
+ populateOptions(checkedComplianceTests) {
+ let { flatTestsMap } = this.props;
+ return (
+ <option>
+ {flatTestsMap[checkedComplianceTests].title +
+ ' (' +
+ checkedComplianceTests +
+ ')'}
+ </option>
+ );
+ }
+ render() {
+ let { complianceNodes, setComplianceChecked } = this.props;
+ return (
+ <div className="validation-setup-checkbox-tree-section">
+ <GridSection title={i18n('Compliance Checks')}>
+ <GridItem colSpan={2}>
+ <div className="validation-view-title">
+ {complianceNodes[0] ? complianceNodes[0].value : ''}
+ </div>
+ <div
+ className="validation-setup-available-tests-section"
+ data-test-id={
+ 'vsp-validation-compliance-checks-checkbox-tree'
+ }>
+ {complianceNodes.length > 0 && (
+ <CheckboxTree
+ nodes={complianceNodes}
+ checked={this.state.checked}
+ expanded={this.state.expanded}
+ onCheck={checked => {
+ this.setState(
+ { checked },
+ setComplianceChecked({
+ checked
+ })
+ );
+ }}
+ onExpand={expanded =>
+ this.setState({ expanded })
+ }
+ icons={icons}
+ className="field-section"
+ />
+ )}
+ {complianceNodes.length === 0 && (
+ <div>
+ {i18n('No Compliance Checks are Available')}
+ </div>
+ )}
+ </div>
+ </GridItem>
+ <GridItem colSpan={2}>
+ {complianceNodes.length > 0 && (
+ <div>
+ <div className="validation-view-title">
+ {i18n('Selected Compliance Tests')}
+ </div>
+ <div>
+ <select
+ className="validation-setup-selected-tests"
+ multiple>
+ {this.state.checked.map(row =>
+ this.populateOptions(row)
+ )}
+ </select>
+ </div>
+ </div>
+ )}
+ </GridItem>
+ </GridSection>
+ </div>
+ );
+ }
+}
+
+class VspValidationSetup extends Component {
+ static propTypes = {
+ softwareProductValidation: PropTypes.object,
+ setComplianceChecked: PropTypes.func,
+ setCertificationChecked: PropTypes.func
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ complianceCheckList: [],
+ certificationCheckList: []
+ };
+ }
+
+ shouldComponentUpdate() {
+ return true;
+ }
+
+ render() {
+ let {
+ softwareProductValidation,
+ setComplianceChecked,
+ setCertificationChecked,
+ complianceCheckList,
+ certificationCheckList
+ } = this.props;
+ return (
+ <div className="vsp-validation-view">
+ <CertificationQuery
+ certificationNodes={certificationCheckList}
+ flatTestsMap={softwareProductValidation.vspTestsMap}
+ setCertificationChecked={setCertificationChecked}
+ certificationChecked={
+ softwareProductValidation.certificationChecked
+ }
+ />
+ <ComplianceTests
+ complianceNodes={complianceCheckList}
+ flatTestsMap={softwareProductValidation.vspTestsMap}
+ setComplianceChecked={setComplianceChecked}
+ complianceChecked={
+ softwareProductValidation.complianceChecked
+ }
+ />
+ </div>
+ );
+ }
+}
+
+export default VspValidationSetup;
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js
new file mode 100644
index 0000000000..dffade7c9a
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { connect } from 'react-redux';
+import SoftwareProductValidationResultsView from './SoftwareProductValidationResultsView.jsx';
+
+export const mapStateToProps = ({ softwareProduct }) => {
+ let { softwareProductValidation } = softwareProduct;
+ return {
+ softwareProductValidation
+ };
+};
+
+export default connect(mapStateToProps, null, null, {
+ withRef: true
+})(SoftwareProductValidationResultsView);
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx
new file mode 100644
index 0000000000..b6cc1d5bdc
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx
@@ -0,0 +1,207 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import PropTypes from 'prop-types';
+import Accordion from 'sdc-ui/lib/react/Accordion.js';
+import SVGIcon from 'sdc-ui/lib/react/SVGIcon.js';
+import GridSection from 'nfvo-components/grid/GridSection.jsx';
+import GridItem from 'nfvo-components/grid/GridItem.jsx';
+import i18n from 'nfvo-utils/i18n/i18n.js';
+import unCamelCasedString from 'nfvo-utils/unCamelCaseString.js';
+
+const TestResultComponent = ({ tests }) => {
+ return (
+ <div>
+ {tests.map((test, index) => {
+ let name = 'errorCircle';
+ let color = 'warning';
+ if (
+ test.testResult &&
+ test.testResult.toLowerCase() === 'pass'
+ ) {
+ color = 'positive';
+ name = 'checkCircle';
+ } else if (
+ test.testResult &&
+ test.testResult.toLowerCase() === 'fail'
+ ) {
+ name = 'exclamationTriangleFull';
+ }
+ return (
+ <li type="none" key={index}>
+ <SVGIcon
+ color={color}
+ name={name}
+ labelPosition="right"
+ />
+ <span className="validation-results-test-result-label">
+ {test.testName +
+ ' | ' +
+ test.testResult +
+ ' | ' +
+ test.notes}
+ </span>
+ </li>
+ );
+ })}
+ </div>
+ );
+};
+
+class SoftwareProductValidationResultsView extends React.Component {
+ static propTypes = {
+ softwareProductValidation: PropTypes.object
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ vspId: this.props.softwareProductId,
+ versionNumber: this.props.version.name
+ };
+ }
+
+ buildSubAccordions(result) {
+ if (result.status && result.status.toLowerCase() === 'completed') {
+ if (!result.results.testResults) {
+ return (
+ <div
+ title={i18n('Scenario: {scenario} | Status: {status}', {
+ scenario: result.scenario,
+ status: result.status
+ })}>
+ <SVGIcon
+ color="negative"
+ name="errorCircle"
+ labelPosition="right"
+ />
+ <span className="validation-results-test-result-label">
+ {i18n('{title} results are not available', {
+ title: result.scenario
+ })}
+ </span>
+ </div>
+ );
+ }
+ return (
+ <Accordion
+ dataTestId="vsp-validation-test-result-success"
+ title={i18n('Scenario: {scenario} | Status: {status}', {
+ scenario: result.scenario,
+ status: result.status
+ })}>
+ {Object.keys(result.results.testResults).map(
+ (key, index) => {
+ let title = unCamelCasedString(key);
+ if (result.results.testResults[key].length > 0) {
+ return (
+ <Accordion
+ dataTestId={title}
+ title={title}
+ key={index}>
+ <TestResultComponent
+ tests={
+ result.results.testResults[key]
+ }
+ />
+ </Accordion>
+ );
+ } else {
+ return (
+ <div>
+ {i18n(
+ '{title} results are not available',
+ {
+ title: title
+ }
+ )}
+ </div>
+ );
+ }
+ }
+ )}
+ </Accordion>
+ );
+ } else if (
+ result.status &&
+ result.status.toLowerCase() === 'failed' &&
+ result.results.errors
+ ) {
+ return (
+ <Accordion
+ dataTestId="vsp-validation-test-result-success"
+ title={i18n('Scenario: {scenario} | Status: {status}', {
+ scenario: result.scenario,
+ status: result.status
+ })}>
+ {result.results.errors.map((element, index) => {
+ return (
+ <li type="none" key={index}>
+ <SVGIcon
+ color="negative"
+ name="errorCircle"
+ labelPosition="right"
+ />
+ <span className="validation-results-test-result-label">
+ {element.reason + ' | ' + element.advice}
+ </span>
+ </li>
+ );
+ })}
+ </Accordion>
+ );
+ } else if (result.message || result.httpStatus) {
+ return (
+ <div>
+ <SVGIcon
+ color="negative"
+ name="errorCircle"
+ labelPosition="right"
+ />
+ <span className="validation-results-test-result-label">
+ {result.message + ' | ' + result.httpStatus}
+ </span>
+ </div>
+ );
+ }
+ }
+
+ render() {
+ let results = this.props.softwareProductValidation.vspTestResults || [];
+ if (results.length > 0) {
+ return (
+ <GridSection title={i18n('Validation Results')}>
+ <GridItem colSpan={10}>
+ <Accordion
+ defaultExpanded
+ dataTestId="vsp-validation-test-result"
+ title={i18n('Test Results')}>
+ {results.map(row => this.buildSubAccordions(row))}
+ </Accordion>
+ </GridItem>
+ </GridSection>
+ );
+ } else {
+ return (
+ <GridSection title={i18n('Validation Results')}>
+ <h4>{i18n('No Validation Checks Performed')}</h4>
+ </GridSection>
+ );
+ }
+ }
+}
+
+export default SoftwareProductValidationResultsView;
diff --git a/openecomp-ui/src/sdc-app/punch-outs.js b/openecomp-ui/src/sdc-app/punch-outs.js
index 125050bfdb..2f1cf2cd94 100644
--- a/openecomp-ui/src/sdc-app/punch-outs.js
+++ b/openecomp-ui/src/sdc-app/punch-outs.js
@@ -14,6 +14,7 @@
* permissions and limitations under the License.
*/
import 'sdc-ui/css/style.css';
+import 'react-checkbox-tree/lib/react-checkbox-tree.css';
import '../../resources/scss/onboarding.scss';
import 'dox-sequence-diagram-ui/src/main/webapp/res/sdc-sequencer.scss';
diff --git a/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductFactory.js b/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductFactory.js
index 86a8276beb..f3ca07c890 100644
--- a/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductFactory.js
+++ b/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductFactory.js
@@ -13,35 +13,35 @@
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
-import {Factory} from 'rosie';
+import { Factory } from 'rosie';
-export const SoftwareProductFactory = new Factory()
- .attrs({
- softwareProductAttachments: {},
- softwareProductCreation: {},
- softwareProductEditor: {},
- softwareProductProcesses: {
- processesList: [],
- processesEditor: {},
- processToDelete: false
- },
- softwareProductNetworks: {
- networksList: []
- },
- softwareProductComponents: {
- componentsList: [],
- componentEditor: {},
- componentProcesses: {
- processesList: [],
- processesEditor: {},
- processToDelete: false
- },
- network: {
- nicList: [],
- nicEditor: {}
- }
- },
- monitoring: {},
- softwareProductCategories: [],
- softwareProductQuestionnaire: {}
- });
+export const SoftwareProductFactory = new Factory().attrs({
+ softwareProductAttachments: {},
+ softwareProductCreation: {},
+ softwareProductEditor: {},
+ softwareProductValidation: {},
+ softwareProductProcesses: {
+ processesList: [],
+ processesEditor: {},
+ processToDelete: false
+ },
+ softwareProductNetworks: {
+ networksList: []
+ },
+ softwareProductComponents: {
+ componentsList: [],
+ componentEditor: {},
+ componentProcesses: {
+ processesList: [],
+ processesEditor: {},
+ processToDelete: false
+ },
+ network: {
+ nicList: [],
+ nicEditor: {}
+ }
+ },
+ monitoring: {},
+ softwareProductCategories: [],
+ softwareProductQuestionnaire: {}
+});
diff --git a/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js b/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js
new file mode 100644
index 0000000000..2ae9249ff7
--- /dev/null
+++ b/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js
@@ -0,0 +1,498 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Factory } from 'rosie';
+
+export const VSPComplianceCheckedFactory = new Factory().attrs({
+ complianceChecked: [
+ 'compliance.compliancetests.sriov',
+ 'compliance.compliancetests.computeflavors'
+ ]
+});
+
+export const VSPCertificationCheckedFactory = new Factory().attrs({
+ certificationChecked: ['certification.certificationtests.certquery']
+});
+
+export const VSPGeneralInfoFactory = new Factory().attrs({
+ generalInfo: {
+ 'certification.certificationtests.certquery': {
+ vspId: {
+ isValid: false,
+ errorText: 'Please Enter a Value in the Mandatory Field'
+ },
+ vspVersion: {
+ isValid: false,
+ errorText: 'Please Enter a Value in the Mandatory Field'
+ }
+ },
+ 'compliance.compliancetests.sriov': {
+ vspId: {
+ isValid: false,
+ errorText: 'Please Enter a Value in the Mandatory Field'
+ },
+ vspVersion: {
+ isValid: false,
+ errorText: 'Please Enter a Value in the Mandatory Field'
+ },
+ allowSriov: {
+ isValid: true,
+ errorText: ''
+ }
+ },
+ 'compliance.compliancetests.computeflavors': {
+ vspId: {
+ isValid: false,
+ errorText: 'Please Enter a Value in the Mandatory Field'
+ },
+ vspVersion: {
+ isValid: false,
+ errorText: 'Please Enter a Value in the Mandatory Field'
+ },
+ csp: {
+ isValid: true,
+ errorText: ''
+ },
+ profilespec: {
+ isValid: true,
+ errorText: ''
+ },
+ vnftype: {
+ isValid: true,
+ errorText: ''
+ }
+ }
+ }
+});
+
+export const VSPTestsRequestFactory = new Factory().attrs({
+ testsRequest: {
+ 'compliance.compliancetests.sriov': {
+ parameters: {
+ vspId: '',
+ vspVersion: '',
+ allowSriov: 'false'
+ },
+ scenario: 'compliance',
+ testCaseName: 'compliance.compliancetests.sriov',
+ testSuiteName: 'compliancetests',
+ endpoint: 'vtp'
+ },
+ 'compliance.compliancetests.computeflavors': {
+ parameters: {
+ vspId: '',
+ vspVersion: '',
+ csp: 'ZZFT',
+ profilespec: 'gsmafnw14',
+ vnftype: 'B'
+ },
+ scenario: 'compliance',
+ testCaseName: 'compliance.compliancetests.computeflavors',
+ testSuiteName: 'compliancetests',
+ endpoint: 'ovp'
+ },
+ 'certification.certificationtests.certquery': {
+ parameters: {
+ vspId: '',
+ vspVersion: ''
+ },
+ scenario: 'certification',
+ testCaseName: 'certification.certificationtests.certquery',
+ testSuiteName: 'certificationtests',
+ endpoint: 'repository'
+ }
+ }
+});
+
+export const VSPTestsMapFactory = new Factory().attrs({
+ vspTestsMap: {
+ 'compliance.compliancetests.sriov': {
+ title: ' SR-IOV Test',
+ parameters: [
+ {
+ name: 'vspId',
+ description: 'VSP ID',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'vspVersion',
+ description: 'VSP Version',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'allowSriov',
+ description: 'Allow SR-IOV?',
+ type: 'select',
+ defaultValue: 'false',
+ isOptional: false,
+ metadata: {
+ disabled: true,
+ choices: [
+ {
+ key: 'true',
+ label: 'Yes'
+ },
+ {
+ key: 'false',
+ label: 'No'
+ }
+ ]
+ }
+ }
+ ],
+ endpoint: 'vtp',
+ testCaseName: 'compliance.compliancetests.sriov',
+ testSuiteName: 'compliancetests',
+ scenario: 'compliance'
+ },
+ 'compliance.compliancetests.computeflavors': {
+ title: 'Compute Flavours Test',
+ parameters: [
+ {
+ name: 'vspId',
+ description: 'VSP ID',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'vspVersion',
+ description: 'VSP Version',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'csp',
+ description: 'CSP',
+ type: 'select',
+ defaultValue: 'ZZFT',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ choices: [
+ {
+ key: 'ZZTF',
+ label: 'Vodafone Group'
+ }
+ ]
+ }
+ },
+ {
+ name: 'profilespec',
+ description: 'Profile Specification',
+ type: 'select',
+ defaultValue: 'gsmafnw14',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ choices: [
+ {
+ key: 'gsmafnw14',
+ label: 'GSMA NFVI Profiles'
+ }
+ ]
+ }
+ },
+ {
+ name: 'vnftype',
+ description: 'VNF Type',
+ type: 'select',
+ defaultValue: 'B',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ choices: [
+ {
+ key: 'B',
+ label: 'Basic'
+ },
+ {
+ key: 'N',
+ label: 'Network Intensive'
+ },
+ {
+ key: 'C',
+ label: 'Compute Intensive'
+ }
+ ]
+ }
+ }
+ ],
+ endpoint: 'ovp',
+ testCaseName: 'compliance.compliancetests.computeflavors',
+ testSuiteName: 'compliancetests',
+ scenario: 'compliance'
+ },
+ 'certification.certificationtests.certquery': {
+ title: 'Other Certifications',
+ parameters: [
+ {
+ name: 'vspId',
+ description: 'VSP ID',
+ type: 'text',
+ defaultValue: '',
+ isOptional: true,
+ metadata: {
+ maxLength: 36,
+ minLength: 1,
+ disabled: true
+ }
+ },
+ {
+ name: 'vspVersion',
+ description: 'Previous VSP Version',
+ type: 'text',
+ defaultValue: '',
+ isOptional: true,
+ metadata: {
+ maxLength: 36,
+ minLength: 1,
+ disabled: true
+ }
+ }
+ ],
+ endpoint: 'repository',
+ testCaseName: 'certification.certificationtests.certquery',
+ testSuiteName: 'certificationtests',
+ scenario: 'certification'
+ }
+ }
+});
+
+export const VSPChecksFactory = new Factory().attrs({
+ name: 'root',
+ description: 'root',
+ children: [
+ {
+ name: 'certification',
+ description: 'Available Certifications Query',
+ children: [
+ {
+ name: 'certificationtests',
+ description: 'Additional Certification',
+ tests: [
+ {
+ testCaseName:
+ 'certification.certificationtests.certquery',
+ testSuiteName: 'certificationtests',
+ description: 'Other Certifications',
+ author: 'jg@example.com',
+ inputs: [
+ {
+ name: 'vspId',
+ description: 'VSP ID',
+ type: 'text',
+ defaultValue: '',
+ isOptional: true,
+ metadata: {
+ maxLength: 36,
+ minLength: 1,
+ disabled: true
+ }
+ },
+ {
+ name: 'vspVersion',
+ description: 'Previous VSP Version',
+ type: 'text',
+ defaultValue: '',
+ isOptional: true,
+ metadata: {
+ maxLength: 36,
+ minLength: 1,
+ disabled: true
+ }
+ }
+ ],
+ endpoint: 'repository'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ name: 'compliance',
+ description: 'Available ComplianceChecks',
+ tests: [],
+ children: [
+ {
+ name: 'compliancetests',
+ description: 'Compliance Tests',
+ tests: [
+ {
+ testCaseName: 'compliance.compliancetests.sriov',
+ testSuiteName: 'compliancetests',
+ description: ' SR-IOV Test',
+ author: 'Jim',
+ inputs: [
+ {
+ name: 'vspId',
+ description: 'VSP ID',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'vspVersion',
+ description: 'VSP Version',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'allowSriov',
+ description: 'Allow SR-IOV?',
+ type: 'select',
+ defaultValue: 'false',
+ isOptional: false,
+ metadata: {
+ disabled: true,
+ choices: [
+ {
+ key: 'true',
+ label: 'Yes'
+ },
+ {
+ key: 'false',
+ label: 'No'
+ }
+ ]
+ }
+ }
+ ],
+ endpoint: 'vtp'
+ },
+ {
+ testCaseName:
+ 'compliance.compliancetests.computeflavors',
+ testSuiteName: 'compliancetests',
+ description: 'Compute Flavours Test',
+ author: 'Jim',
+ inputs: [
+ {
+ name: 'vspId',
+ description: 'VSP ID',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'vspVersion',
+ description: 'VSP Version',
+ type: 'text',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ maxLength: '36',
+ minLength: '1'
+ }
+ },
+ {
+ name: 'csp',
+ description: 'CSP',
+ type: 'select',
+ defaultValue: 'ZZFT',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ choices: [
+ {
+ key: 'ZZTF',
+ label: 'Vodafone Group'
+ }
+ ]
+ }
+ },
+ {
+ name: 'profilespec',
+ description: 'Profile Specification',
+ type: 'select',
+ defaultValue: 'gsmafnw14',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ choices: [
+ {
+ key: 'gsmafnw14',
+ label: 'GSMA NFVI Profiles'
+ }
+ ]
+ }
+ },
+ {
+ name: 'vnftype',
+ description: 'VNF Type',
+ type: 'select',
+ defaultValue: 'B',
+ isOptional: false,
+ metadata: {
+ disabled: false,
+ choices: [
+ {
+ key: 'B',
+ label: 'Basic'
+ },
+ {
+ key: 'N',
+ label: 'Network Intensive'
+ },
+ {
+ key: 'C',
+ label: 'Compute Intensive'
+ }
+ ]
+ }
+ }
+ ],
+ endpoint: 'ovp'
+ }
+ ]
+ }
+ ]
+ }
+ ]
+});
diff --git a/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationResultsFactory.js b/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationResultsFactory.js
new file mode 100644
index 0000000000..6728e049b0
--- /dev/null
+++ b/openecomp-ui/test-utils/factories/softwareProduct/SoftwareProductValidationResultsFactory.js
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Factory } from 'rosie';
+
+export const VSPTestResultsFailureFactory = new Factory().attrs({
+ vspTestResults: [
+ {
+ code: '500',
+ message: 'VTP Test(s) could not be completed',
+ httpStatus: 500
+ }
+ ]
+});
+
+export const VSPTestResultsSuccessFactory = new Factory().attrs({
+ vspTestResults: [
+ {
+ scenario: 'certification',
+ description: 'Other Certifications',
+ testCaseName: 'certification.certificationtests.certquery',
+ testSuiteName: 'certificationtests',
+ executionId: 'ebaa5f21-ed68-4098-97a9-775ac8800f09-1550575025614',
+ parameters: {
+ vspId: 'uuidval',
+ vspVersion: 'ver',
+ other: 'values'
+ },
+ results: {
+ testResults: {
+ complianceTests: [
+ {
+ testName: 'Compute Flavors',
+ testResult: 'Pass',
+ notes:
+ 'Diagnostic: test performed against GSMA NFVI Abstraction and Profiling Version 0.1 profiles.'
+ },
+ {
+ testName: 'SR-IOV',
+ testResult: 'Fail',
+ notes:
+ 'Diagnostic: SR-IOV found in VNF Template. User advice: VNF binary and VNF Template must be modified to not require SR-IOV.'
+ },
+ {
+ testName: 'Heat',
+ testResult: 'Pass',
+ notes: ''
+ },
+ {
+ testName: 'TOSCA',
+ testResult: 'Pass',
+ notes:
+ 'Diagnostic: test performed for ETSI GS NFV-SOL001v0.10.0.'
+ }
+ ],
+ validationTests: [
+ {
+ testName: 'OpenStack',
+ testResult: 'Pass',
+ notes:
+ 'Diagnostic: test performed for OpenStack Rocky.'
+ },
+ {
+ testName: 'VMware',
+ testResult: 'Fail',
+ notes:
+ 'Diagnostic: VMware compatible template not found. User advice: add a VMware compatible template to the VSP.'
+ },
+ {
+ testName: 'Kubernetes',
+ testResult: 'Fail',
+ notes:
+ 'Diagnostic: Kubernetes compatible template not found. User advice: add a Kubernetes compatible template, such as Helm Chart, to the VSP.'
+ }
+ ],
+ performanceTests: [
+ {
+ testName: 'Max Throughput',
+ testResult: 'Pass',
+ notes: ''
+ },
+ {
+ testName: 'Latency',
+ testResult: 'Fail',
+ notes:
+ 'Diagnostic: maximum latency threshold of 20ms signalling response time exceededUser advice: consider increasing VDU compute resource.'
+ }
+ ]
+ }
+ },
+
+ status: 'COMPLETED',
+ startTime: '2019-02-19T11:17:05.670',
+ endTime: '2019-02-19T11:17:05.683'
+ },
+ {
+ scenario: 'compliance',
+ testCaseName: 'compliance.compliancetests.sriov',
+ description: 'Allow_SR-IOV',
+ testSuiteName: 'compliancetests',
+ executionId: 'ebaa5f21-ed68-4098-97a9-775ac8800f09-1550575025614',
+ parameters: {
+ vspId: 'uuidval',
+ vspVersion: 'ver',
+ other: 'values'
+ },
+ results: {
+ errors: [
+ {
+ attribute: '',
+ reason: 'Record Not Found',
+ advice:
+ 'User must query with (vspId, vspVersion) values for a certifications record that is present in the Repository',
+ code: 40
+ },
+ {
+ attribute: '',
+ reason: 'Record Not Found',
+ advice:
+ 'User must query with (vspId, vspVersion) values for a certifications record that is present in the Repository',
+ code: 40
+ }
+ ]
+ },
+ status: 'FAILED',
+ startTime: '2019-02-19T11:17:05.670',
+ endTime: '2019-02-19T11:17:05.683'
+ },
+ {
+ scenario: 'compliance',
+ testCaseName: ' compliance.compliancetests.computeflavours',
+ description: 'Allow SR-IOV ',
+ testSuiteName: 'compliancetests',
+ executionId: 'ebaa5f21-ed68-4098-97a9-775ac8800f09-1550575025614',
+ parameters: {
+ vspId: 'uuidval',
+ vspVersion: 'ver',
+ other: 'values'
+ },
+ results: {},
+ status: 'COMPLETED',
+ startTime: '2019-02-19T11:17:05.670',
+ endTime: '2019-02-19T11:17:05.683'
+ },
+ {
+ code: '500',
+ message: 'VTP Test(s) could not be completed',
+ httpStatus: 500
+ }
+ ]
+});
diff --git a/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationActionHelper.test.js b/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationActionHelper.test.js
new file mode 100644
index 0000000000..ee6ba90cd5
--- /dev/null
+++ b/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationActionHelper.test.js
@@ -0,0 +1,108 @@
+/*
+ * Copyright © 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import deepFreeze from 'deep-freeze';
+import mockRest from 'test-utils/MockRest.js';
+import { cloneAndSet } from 'test-utils/Util.js';
+import { storeCreator } from 'sdc-app/AppStore.js';
+import SoftwareProductValidationActionHelper from 'sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationActionHelper.js';
+import { tabsMapping } from 'sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationConstants.js';
+
+import Configuration from 'sdc-app/config/Configuration.js';
+
+import { VSPComplianceCheckedFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPCertificationCheckedFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPChecksFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPTestsMapFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+
+describe('Software Product Validation Action Helper Tests', function() {
+ it('Software Products Validation Action Helper : Dsspatch', () => {
+ const store = storeCreator();
+ deepFreeze(store.getState());
+
+ const vspChecksList = VSPChecksFactory.build();
+ const vspTestsMap = VSPTestsMapFactory.build();
+ const certificationChecked = VSPCertificationCheckedFactory.build();
+ const complianceChecked = VSPComplianceCheckedFactory.build();
+ const activeTab = { activeTab: tabsMapping.INPUTS };
+ const errorMessage = { msg: 'Test Error Message' };
+
+ deepFreeze(vspChecksList);
+ deepFreeze(vspTestsMap);
+ deepFreeze(certificationChecked);
+ deepFreeze(complianceChecked);
+ deepFreeze(activeTab);
+
+ let expectedStore = cloneAndSet(
+ store.getState(),
+ 'softwareProduct.softwareProductValidation.vspChecks',
+ vspChecksList
+ );
+ expectedStore = cloneAndSet(
+ store.getState(),
+ 'softwareProduct.softwareProductValidation.vspTestsMap',
+ vspTestsMap
+ );
+ expectedStore = cloneAndSet(
+ store.getState(),
+ 'softwareProduct.softwareProductValidation.certificationChecked',
+ certificationChecked
+ );
+ expectedStore = cloneAndSet(
+ store.getState(),
+ 'softwareProduct.softwareProductValidation.complianceChecked',
+ complianceChecked
+ );
+ expectedStore = cloneAndSet(
+ store.getState(),
+ 'softwareProduct.softwareProductValidation.activeTab',
+ activeTab
+ );
+ let restPrefix = Configuration.get('restPrefix');
+
+ mockRest.addHandler('fetch', ({ options, data, baseUrl }) => {
+ expect(baseUrl).toEqual(`${restPrefix}/v1.0/externaltesting`);
+ expect(data).toEqual(undefined);
+ expect(options).toEqual(undefined);
+ return { vspChecks: vspChecksList };
+ });
+
+ SoftwareProductValidationActionHelper.setVspTestsMap(store.dispatch, {
+ vspTestsMap
+ });
+ SoftwareProductValidationActionHelper.setComplianceChecked(
+ store.dispatch,
+ { complianceChecked }
+ );
+ SoftwareProductValidationActionHelper.setCertificationChecked(
+ store.dispatch,
+ { certificationChecked }
+ );
+
+ SoftwareProductValidationActionHelper.setActiveTab(store.dispatch, {
+ activeTab
+ });
+
+ SoftwareProductValidationActionHelper.onErrorThrown(store.dispatch, {
+ errorMessage
+ });
+
+ SoftwareProductValidationActionHelper.fetchVspChecks(store.dispatch)
+ .then(() => {
+ expect(store.getState()).toEqual(expectedStore);
+ })
+ .catch(() => {});
+ });
+});
diff --git a/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationInputView.test.js b/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationInputView.test.js
new file mode 100644
index 0000000000..aa00a5d605
--- /dev/null
+++ b/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationInputView.test.js
@@ -0,0 +1,97 @@
+/*
+ * Copyright © 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { mapStateToProps } from 'sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputs.js';
+
+import VspValidationInputsView from 'sdc-app/onboarding/softwareProduct/validation/inputs/VspValidationInputsView.jsx';
+import TestUtils from 'react-dom/test-utils';
+
+import { VSPComplianceCheckedFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPCertificationCheckedFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPChecksFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPTestsMapFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPTestsRequestFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPGeneralInfoFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+
+describe('SoftwareProductValidation Mapper and View Classes', () => {
+ it('mapStateToProps mapper exists', () => {
+ expect(mapStateToProps).toBeTruthy();
+ });
+
+ it('mapStateToProps data test', () => {
+ const vspChecksList = VSPChecksFactory.build();
+ const vspTestsMap = VSPTestsMapFactory.build();
+ const certificationChecked = VSPCertificationCheckedFactory.build();
+ const complianceChecked = VSPComplianceCheckedFactory.build();
+ const generalInfo = VSPGeneralInfoFactory.build();
+ var obj = {
+ softwareProduct: {
+ softwareProductValidation: {
+ vspChecks: vspChecksList,
+ vspTestsMap: vspTestsMap.vspTestsMap,
+ certificationChecked:
+ certificationChecked.certificationChecked,
+ complianceChecked: complianceChecked.complianceChecked,
+ generalInfo: generalInfo.generalInfo
+ }
+ }
+ };
+ var results = mapStateToProps(obj);
+ expect(results.softwareProductValidation.vspChecks).toBeTruthy();
+ expect(results.softwareProductValidation.vspTestsMap).toBeTruthy();
+ expect(
+ results.softwareProductValidation.certificationChecked
+ ).toBeTruthy();
+ expect(
+ results.softwareProductValidation.complianceChecked
+ ).toBeTruthy();
+ });
+
+ it('SoftwareProductValidationInputView render test', () => {
+ const complianceChecked = VSPComplianceCheckedFactory.build();
+ const certificationChecked = VSPCertificationCheckedFactory.build();
+ const vspTestsMap = VSPTestsMapFactory.build();
+ const vspChecksList = VSPChecksFactory.build();
+ const testsRequest = VSPTestsRequestFactory.build();
+ const generalInfo = VSPGeneralInfoFactory.build();
+
+ const version = {
+ name: 1
+ };
+ const softwareProductId = '1234';
+ const status = 'draft';
+
+ var obj = {
+ version: version,
+ softwareProductId: softwareProductId,
+ status: status,
+ softwareProductValidation: {
+ complianceChecked: complianceChecked.complianceChecked,
+ certificationChecked: certificationChecked.certificationChecked,
+ vspTestsMap: vspTestsMap.vspTestsMap,
+ vspChecks: vspChecksList,
+ testsRequest: testsRequest.testsRequest,
+ generalInfo: generalInfo.generalInfo
+ }
+ };
+
+ let vspValidationInputView = TestUtils.renderIntoDocument(
+ <VspValidationInputsView {...obj} />
+ );
+ expect(vspValidationInputView).toBeTruthy();
+ });
+});
diff --git a/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationView.test.js b/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationView.test.js
new file mode 100644
index 0000000000..640f9f64be
--- /dev/null
+++ b/openecomp-ui/test/softwareProduct/validation/SoftwareProductValidationView.test.js
@@ -0,0 +1,122 @@
+/*
+ * Copyright © 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { Provider } from 'react-redux';
+import { storeCreator } from 'sdc-app/AppStore.js';
+
+import { mapStateToProps } from 'sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidation.js';
+import { mapActionsToProps } from 'sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidation.js';
+import SoftwareProductValidationView from 'sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationView.jsx';
+import { VSPComplianceCheckedFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPCertificationCheckedFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPChecksFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { VSPTestsMapFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationFactory.js';
+import { tabsMapping } from 'sdc-app/onboarding/softwareProduct/validation/SoftwareProductValidationConstants.js';
+import TestUtils from 'react-dom/test-utils';
+//import { scryRenderedDOMComponentsWithTestId } from 'test-utils/Util.js';
+
+describe('SoftwareProductValidation Mapper and View Classes', () => {
+ it('mapStateToProps mapper exists', () => {
+ expect(mapStateToProps).toBeTruthy();
+ });
+
+ it('mapActionsToProps mapper exists', () => {
+ expect(mapActionsToProps).toBeTruthy();
+ });
+
+ it('mapStateToProps data test', () => {
+ const vspChecksList = VSPChecksFactory.build();
+ const vspTestsMap = VSPTestsMapFactory.build();
+ const certificationChecked = VSPCertificationCheckedFactory.build();
+ const complianceChecked = VSPComplianceCheckedFactory.build();
+
+ var obj = {
+ softwareProduct: {
+ softwareProductValidation: {
+ vspChecks: vspChecksList,
+ vspTestsMap: vspTestsMap.vspTestsMap,
+ certificationChecked: certificationChecked.certificationChecked,
+ complianceChecked: complianceChecked.complianceChecked,
+ activeTab: tabsMapping.SETUP
+ }
+ }
+ };
+ var results = mapStateToProps(obj);
+ expect(results.softwareProductValidation.vspChecks).toBeTruthy();
+ expect(results.softwareProductValidation.vspTestsMap).toBeTruthy();
+ expect(
+ results.softwareProductValidation.certificationChecked
+ ).toBeTruthy();
+ expect(
+ results.softwareProductValidation.complianceChecked
+ ).toBeTruthy();
+ expect(results.softwareProductValidation.activeTab).toBeTruthy();
+ });
+
+ it('SoftwareProductValidationView render test', () => {
+ const vspChecksList = VSPChecksFactory.build();
+ const vspTestsMap = VSPTestsMapFactory.build();
+ const certificationChecked = VSPCertificationCheckedFactory.build();
+ const complianceChecked = VSPComplianceCheckedFactory.build();
+ let dummyFunc = () => {};
+ const version = {
+ name: 1
+ };
+ const softwareProductId = '1234';
+ const status = 'draft';
+ var obj = {
+ version: version,
+ softwareProductId: softwareProductId,
+ status: status,
+ softwareProductValidation: {
+ vspChecks: vspChecksList,
+ vspTestsMap: vspTestsMap,
+ certificationChecked: certificationChecked.certificationChecked,
+ complianceChecked: complianceChecked.complianceChecked,
+ activeTab: tabsMapping.SETUP
+ }
+ };
+ const store = storeCreator();
+ let softwareProductValidationView = TestUtils.renderIntoDocument(
+ <Provider store={store}>
+ <SoftwareProductValidationView
+ {...obj}
+ onErrorThrown={dummyFunc}
+ onTestSubmit={dummyFunc}
+ setVspTestsMap={dummyFunc}
+ setActiveTab={dummyFunc}
+ setComplianceChecked={dummyFunc}
+ setCertificationChecked={dummyFunc}
+ />
+ </Provider>
+ );
+
+ expect(softwareProductValidationView).toBeTruthy();
+
+ // let goToInput = scryRenderedDOMComponentsWithTestId(
+ // softwareProductValidationView,
+ // 'go-to-inputs'
+ // );
+ // expect(goToInput).toBeTruthy();
+ // TestUtils.Simulate.click(goToInput[0]);
+ // let goToInput = TestUtils.findRenderedDOMComponentWithClass(
+ // softwareProductValidationView,
+ // 'go-to-inputs-btn'
+ // );
+ // TestUtils.Simulate.click(goToInput);
+ });
+});
diff --git a/openecomp-ui/test/softwareProduct/validationResults/SoftwareProductValidationResultsView.test.js b/openecomp-ui/test/softwareProduct/validationResults/SoftwareProductValidationResultsView.test.js
new file mode 100644
index 0000000000..b2cc2c0985
--- /dev/null
+++ b/openecomp-ui/test/softwareProduct/validationResults/SoftwareProductValidationResultsView.test.js
@@ -0,0 +1,96 @@
+/*
+ * Copyright © 2019 Vodafone Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { mapStateToProps } from 'sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js';
+import SoftwareProductValidationResultsView from 'sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx';
+import { VSPTestResultsSuccessFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationResultsFactory.js';
+import { VSPTestResultsFailureFactory } from 'test-utils/factories/softwareProduct/SoftwareProductValidationResultsFactory.js';
+import TestUtils from 'react-dom/test-utils';
+
+describe('SoftwareProductValidationResults Mapper and View Classes', () => {
+ it('mapStateToProps mapper exists', () => {
+ expect(mapStateToProps).toBeTruthy();
+ });
+
+ it('mapStateToProps fail data test', () => {
+ const vspTestResults = VSPTestResultsFailureFactory.build();
+
+ var obj = {
+ softwareProduct: {
+ softwareProductValidation: {
+ vspTestResults: vspTestResults.vspTestResults
+ }
+ }
+ };
+ var results = mapStateToProps(obj);
+ expect(results.softwareProductValidation.vspTestResults).toBeTruthy();
+ });
+
+ it('mapStateToProps success data test', () => {
+ const vspTestResults = VSPTestResultsSuccessFactory.build();
+
+ var obj = {
+ softwareProduct: {
+ softwareProductValidation: {
+ vspTestResults: vspTestResults.vspTestResults
+ }
+ }
+ };
+ var results = mapStateToProps(obj);
+ expect(results.softwareProductValidation.vspTestResults).toBeTruthy();
+ });
+
+ it('SoftwareProductValidationResultsView test fail render test', () => {
+ const vspTestResults = VSPTestResultsFailureFactory.build();
+
+ const version = {
+ name: 1
+ };
+ const softwareProductId = '1234';
+ var obj = {
+ softwareProductId: softwareProductId,
+ version: version,
+ softwareProductValidation: {
+ vspTestResults: vspTestResults.vspTestResults
+ }
+ };
+ let vspValidationResultsView = TestUtils.renderIntoDocument(
+ <SoftwareProductValidationResultsView {...obj} />
+ );
+ expect(vspValidationResultsView).toBeTruthy();
+ });
+
+ it('SoftwareProductValidationResultsView test success render test', () => {
+ const vspTestResults = VSPTestResultsSuccessFactory.build();
+
+ let version = {
+ name: 1
+ };
+ const softwareProductId = '1234';
+ var obj = {
+ softwareProductId: softwareProductId,
+ version: version,
+ softwareProductValidation: {
+ vspTestResults: vspTestResults.vspTestResults
+ }
+ };
+ let vspValidationResultsView = TestUtils.renderIntoDocument(
+ <SoftwareProductValidationResultsView {...obj} />
+ );
+ expect(vspValidationResultsView).toBeTruthy();
+ });
+});
diff --git a/openecomp-ui/webpack.config.js b/openecomp-ui/webpack.config.js
index db952e4a7e..2e8731e271 100644
--- a/openecomp-ui/webpack.config.js
+++ b/openecomp-ui/webpack.config.js
@@ -92,7 +92,8 @@ module.exports = (env, argv) => {
),
path.join(__dirname, 'node_modules/react-datepicker/'),
path.join(__dirname, 'node_modules/react-select/'),
- path.join(__dirname, 'node_modules/sdc-ui/')
+ path.join(__dirname, 'node_modules/sdc-ui/'),
+ path.join(__dirname, 'node_modules/react-checkbox-tree/')
]
},
{