heat validation flow 15/31415/2
authorsvishnev <shlomo-stanisla.vishnevetskiy@amdocs.com>
Mon, 12 Feb 2018 07:10:35 +0000 (09:10 +0200)
committerAvi Gaffa <avi.gaffa@amdocs.com>
Tue, 13 Feb 2018 08:14:17 +0000 (08:14 +0000)
Issue-ID: SDC-1024
Change-Id: I4248fef46c7f8f5132644628f320231eeafe8070
Signed-off-by: svishnev <shlomo-stanisla.vishnevetskiy@amdocs.com>
12 files changed:
openecomp-ui/resources/scss/modules/_softwareProductAttachmentPage.scss
openecomp-ui/src/nfvo-components/panel/NavigationSideBar.jsx
openecomp-ui/src/nfvo-components/panel/versionController/VersionController.jsx
openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProduct.js
openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductActionHelper.js
openecomp-ui/src/sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js
openecomp-ui/src/sdc-app/onboarding/softwareProduct/attachments/SoftwareProductAttachments.js
openecomp-ui/src/sdc-app/onboarding/softwareProduct/attachments/SoftwareProductAttachmentsView.jsx
openecomp-ui/src/sdc-app/onboarding/softwareProduct/details/SoftwareProductDetailsReducer.js
openecomp-ui/src/sdc-app/onboarding/softwareProduct/landingPage/SoftwareProductLandingPage.js
openecomp-ui/src/sdc-app/onboarding/softwareProduct/landingPage/SoftwareProductLandingPageView.jsx
openecomp-ui/test/softwareProduct/attachments/validationFlow.test.js [new file with mode: 0644]

index 0ae3f00..ad98ec0 100644 (file)
   .attachments-view-controllers {
     position: absolute;
     right: 40px;
-    top: 15px;
+    top: 10px;
     display: flex;
 
-
+    
     .icon-component {
-      margin-right: 30px;
-
+      margin-right: 30px;      
     }
 
     input[type="file"] {
       padding: 0;
       margin-left: -1px;
     }
+
+    .proceed-to-validation-btn {
+      width: 191px;
+      margin-right: 30px;
+      height: 36px;
+    }
+    .go-to-overview-btn {
+      width: 191px;
+      margin-right: 36px;
+      height: 36px;
+    }
+    .separator {
+      height: 27px;
+      border: 1px solid $light-gray;
+      margin-right: 31px;
+      margin-left: 0px; 
+      margin-top: 3px;
+    }
+    .abort-btn {      
+      fill: $blue;
+      color: $blue;
+      &:hover {
+        color: $light-blue;
+        fill: $light-blue;
+      }
+    }      
   }
 }
 
index 02552fc..2eda7e6 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,7 +23,8 @@ class NavigationSideBar extends React.Component {
                activeItemId: PropTypes.string.isRequired,
                onSelect: PropTypes.func,
                onToggle: PropTypes.func,
-               groups: PropTypes.array
+               groups: PropTypes.array,
+               disabled: PropTypes.bool
        };
 
        constructor(props) {
@@ -35,10 +36,10 @@ class NavigationSideBar extends React.Component {
        }
 
        render() {
-               let {groups, activeItemId} = this.props;
+               let {groups, activeItemId, disabled = false} = this.props;
 
                return (
-                       <div className='navigation-side-content'>
+                       <div className={`navigation-side-content ${disabled ? 'disabled' : ''}`}>
                                {groups.map(group => (
                                        <NavigationMenu menu={group} activeItemId={activeItemId} onNavigationItemClick={this.handleItemClicked} key={'menu_' + group.id} />
                                ))}
index 5273785..fdc86d4 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -43,10 +43,11 @@ class VersionController extends React.Component {
 
        render() {
                let {version = {},  viewableVersions = [], onVersionSwitching, onMoreVersionsClick, callVCAction, onSave, isReadOnlyMode, itemPermission,
-                               isFormDataValid, onClose, onManagePermissions, permissions = {},  userInfo, usersList, itemName, onOpenCommentCommitModal, onOpenRevisionsModal, isManual} = this.props;
+                               isFormDataValid, onClose, onManagePermissions, permissions = {},  userInfo, usersList, itemName,
+                                onOpenCommentCommitModal, onOpenRevisionsModal, isManual, candidateInProcess} = this.props;
                return (
                        <div className='version-controller-bar'>
-                               <div className='vc-container'>
+                               <div className={`vc-container ${candidateInProcess ? 'disabled' : ''}`}>
                                        <div className='version-status-container'>
                                                <VersionSelector
                                                        viewableVersions={viewableVersions}
@@ -58,7 +59,7 @@ class VersionController extends React.Component {
                                                <ActionButtons onSubmit={callVCAction ? () => this.submit(callVCAction, version) : undefined}
                                                        onRevert={callVCAction ? () => this.revert(callVCAction, version) : undefined}
                                                        onOpenRevisionsModal={onOpenRevisionsModal}
-                                                       onSave={onSave ? () => onSave() : undefined}
+                                                       onSave={onSave ? () => onSave() : undefined}                                                    
                                                        permissions={permissions}
                                                        userInfo={userInfo}
                                                        onManagePermissions={onManagePermissions}
@@ -70,7 +71,7 @@ class VersionController extends React.Component {
                                                        onCommit={callVCAction ? (comment) => this.commit(callVCAction, version, comment) : undefined}
                                                        isFormDataValid={isFormDataValid}
                                                        itemPermissions={itemPermission}
-                                                       isReadOnlyMode={isReadOnlyMode}
+                                                       isReadOnlyMode={isReadOnlyMode || candidateInProcess}
                                                        isManual={isManual} />
                                                <div className='vc-separator'></div>
                                                <NotificationsView />
index cdaf189..683dd4f 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -90,7 +90,7 @@ const buildComponentNavigationBarGroups = ({componentId, meta}) => {
 
 const buildNavigationBarProps = ({softwareProduct, meta, screen, componentId, componentsList, mapOfExpandedIds}) => {
        const {softwareProductEditor: {data: currentSoftwareProduct = {}}} = softwareProduct;
-       const {id, name, onboardingMethod, candidateOnboardingOrigin} = currentSoftwareProduct;
+       const {id, name, onboardingMethod, candidateOnboardingOrigin, onboardingOrigin} = currentSoftwareProduct;
        const groups = [{
                id: id,
                name: name,
@@ -126,7 +126,7 @@ const buildNavigationBarProps = ({softwareProduct, meta, screen, componentId, co
                                id: enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS,
                                name: i18n('Attachments'),
                                disabled: false,
-                               hidden: candidateOnboardingOrigin === onboardingOriginTypes.NONE,
+                               hidden: !candidateOnboardingOrigin && !onboardingOrigin,
                                meta
                        }, {
                                id: enums.SCREEN.SOFTWARE_PRODUCT_ACTIVITY_LOG,
@@ -159,14 +159,14 @@ const buildNavigationBarProps = ({softwareProduct, meta, screen, componentId, co
        }];
        let activeItemId = getActiveNavigationId(screen, componentId);
        return {
-               activeItemId, groups
+               activeItemId, groups, disabled: !!candidateOnboardingOrigin
        };
 };
 
 const buildVersionControllerProps = ({softwareProduct, versions, currentVersion, permissions, userInfo, usersList, itemPermission, isReadOnlyMode}) => {
        const {softwareProductEditor = {data: {}}} = softwareProduct;
-       const {isValidityData = true, data: {name, onboardingMethod}} = softwareProductEditor;
-
+       const {isValidityData = true, data: {name, onboardingMethod, candidateOnboardingOrigin}} = softwareProductEditor;
+       
        return {
                version: currentVersion,
                viewableVersions: versions,
@@ -177,7 +177,8 @@ const buildVersionControllerProps = ({softwareProduct, versions, currentVersion,
                isReadOnlyMode,
                userInfo,
                usersList,
-               isManual: onboardingMethod === onboardingMethodType.MANUAL
+               isManual: onboardingMethod === onboardingMethodType.MANUAL,
+               candidateInProcess: !!candidateOnboardingOrigin
        };
 };
 
index ebd660f..9ed6005 100644 (file)
@@ -1,17 +1,17 @@
-/*
- * Copyright © 2016-2017 European Support Limited
+/*!
+ * Copyright © 2016-2018 European Support Limited
  *
  * 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
+ * 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.
+ * 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 showFileSaveDialog from 'nfvo-utils/ShowFileSaveDialog.js';
@@ -116,6 +116,10 @@ function fetchOrchestrationTemplateCandidate(softwareProductId, version, ) {
        return RestAPIUtil.fetch(`${baseUrl()}${softwareProductId}/versions/${version.id}/orchestration-template-candidate`, {dataType: 'binary'});
 }
 
+function abortValidationProcess(softwareProductId, version) {
+       return RestAPIUtil.destroy(`${baseUrl()}${softwareProductId}/versions/${version.id}/orchestration-template-candidate`);
+}
+
 function objToString(obj) {
        let str = '';
        if (obj instanceof Array) {
@@ -242,6 +246,8 @@ const SoftwareProductActionHelper = {
                        if (response.status === 'Success') {
                                SoftwareProductComponentsActionHelper.fetchSoftwareProductComponents(dispatch, {softwareProductId, version});
                                SoftwareProductActionHelper.fetchSoftwareProduct(dispatch, {softwareProductId, version});
+                       } else {
+                               SoftwareProductActionHelper.fetchSoftwareProduct(dispatch, {softwareProductId, version});
                        }
                });
        },
@@ -267,6 +273,10 @@ const SoftwareProductActionHelper = {
                                                                screen: enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS_SETUP, screenType: screenTypes.SOFTWARE_PRODUCT,
                                                                props: {softwareProductId, version}
                                                        });
+                                                       dispatch({
+                                                               type: actionTypes.CANDIDATE_IN_PROCESS,
+                                                               inProcess: true
+                                                       });
                                                        break;
                                                case onboardingOriginTypes.CSAR:
                                                        ScreensHelper.loadScreen(dispatch, {
@@ -540,6 +550,10 @@ const SoftwareProductActionHelper = {
                        screen: enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE, screenType: screenTypes.SOFTWARE_PRODUCT,
                        props: {softwareProductId, version: {id: newVer, label: newVer}}
                }));
+       },
+
+       abortCandidateValidation(dispatch, {softwareProductId, version}) {              
+               return abortValidationProcess(softwareProductId, version);
        }
 
 };
index 7df4658..c824837 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@ export const actionTypes = keyMirror({
        SOFTWARE_PRODUCT_QUESTIONNAIRE_UPDATE: null,
        LOAD_LICENSING_VERSIONS_LIST: null,
        TOGGLE_NAVIGATION_ITEM: null,
+       CANDIDATE_IN_PROCESS: null,
 
        softwareProductEditor: {
                OPEN: null,
index 234953e..d942172 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -55,7 +55,8 @@ export const mapStateToProps = (state) => {
                HeatSetupComponent: HeatSetup,
                version,
                onboardingOrigin,
-               activeTab
+               activeTab,
+               candidateInProcess: !!currentSoftwareProduct.candidateOnboardingOrigin
        };
 };
 
@@ -67,6 +68,8 @@ export const mapActionsToProps = (dispatch, {softwareProductId, version}) => {
                        data:{
                                msg: i18n('Upload will erase existing data. Do you want to continue?'),
                                confirmationButtonText: i18n('Continue'),
+                               title: i18n('WARNING'),
+
                                onConfirmed: ()=>SoftwareProductActionHelper.uploadFile(dispatch, {
                                        softwareProductId,
                                        formData,
@@ -75,6 +78,15 @@ export const mapActionsToProps = (dispatch, {softwareProductId, version}) => {
                                })
                        }
                }),
+               onUploadAbort: () => {
+                       SoftwareProductActionHelper.abortCandidateValidation(dispatch, {softwareProductId, version})
+                               .then(()=>{
+                                       ScreensHelper.loadScreen(dispatch, {
+                                               screen: enums.SCREEN.SOFTWARE_PRODUCT_LANDING_PAGE, screenType: screenTypes.SOFTWARE_PRODUCT,
+                                               props: {softwareProductId, version}
+                                       });
+                               });
+               },
                onInvalidFileUpload: () => dispatch({
                        type: modalActionTypes.GLOBAL_MODAL_ERROR,
                        data: {
index a230157..90dd769 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@ import {tabsMapping} from './SoftwareProductAttachmentsConstants.js';
 import i18n from 'nfvo-utils/i18n/i18n.js';
 import HeatValidation from './validation/HeatValidation.js';
 import {onboardingOriginTypes} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
+import Button from 'sdc-ui/lib/react/Button.js';
 
 class HeatScreenView extends Component {
 
@@ -30,40 +31,56 @@ class HeatScreenView extends Component {
                setActiveTab: PropTypes.func
        };
 
+       componentDidMount() {           
+                if (!this.props.goToOverview && this.props.candidateInProcess) {                       
+                       this.props.setActiveTab({activeTab: tabsMapping.VALIDATION});
+                }
+       }
+
        render() {
-               let {isValidationAvailable, isReadOnlyMode, heatDataExist, onDownload, softwareProductId, onProcessAndValidate,
-                       heatSetup, HeatSetupComponent, onGoToOverview, version, onboardingOrigin, activeTab, setActiveTab, ...other} = this.props;
+               let {isValidationAvailable, isReadOnlyMode, heatDataExist, onDownload, softwareProductId, onProcessAndValidate, onUploadAbort,
+                       candidateInProcess, heatSetup, HeatSetupComponent, onGoToOverview, version, onboardingOrigin, activeTab, setActiveTab, ...other} = this.props;
 
                return (
                        <div className='vsp-attachments-view'>
                                <div className='attachments-view-controllers'>
-                                       {(activeTab === tabsMapping.SETUP) &&
-                                               <SVGIcon
-                                                       disabled={heatDataExist ? false : true}
-                                                       name='download'
-                                                       className='icon-component'
-                                                       label={i18n('Export Validation')}
-                                                       labelPosition='right'
-                                                       color='secondary'
-                                                       onClick={heatDataExist ? () => onDownload({heatCandidate: heatSetup, isReadOnlyMode, version}) : undefined}
-                                                       data-test-id='download-heat'/>}
+                                       {(activeTab === tabsMapping.SETUP) &&   
+                                               <Button btnType='outline' 
+                                                       data-test-id='proceed-to-validation-btn'
+                                                       disabled={!isValidationAvailable} 
+                                                       className='proceed-to-validation-btn'
+                                                       onClick={()=>this.handleTabPress(tabsMapping.VALIDATION)}>{i18n('PROCEED TO VALIDATION')}</Button>                                      
+                                       }               
+                                       {candidateInProcess && <SVGIcon                                                 
+                                               onClick={onUploadAbort}
+                                               name='close'
+                                               className='icon-component abort-btn'
+                                               label={i18n('ABORT')}
+                                               labelPosition='right'
+                                               color='secondary'
+                                               data-test-id='abort-btn'/>
+                                       }       
+                                       
                                        {(activeTab === tabsMapping.VALIDATION && softwareProductId) &&
-                                               <SVGIcon
+                                               <Button btnType='outline' 
+                                                       data-test-id='go-to-overview'
                                                        disabled={this.props.goToOverview !== true}
-                                                       onClick={this.props.goToOverview ? () => onGoToOverview({version}) : undefined}
-                                                       name='proceedToOverview'
-                                                       className='icon-component'
-                                                       label={i18n('Go to Overview')}
-                                                       labelPosition='right'
-                                                       color={this.props.goToOverview ? 'primary' : 'secondary'}
-                                                       data-test-id='go-to-overview'/>}
+                                                       className='go-to-overview-btn'
+                                                       onClick={this.props.goToOverview ? () => onGoToOverview({version}) : undefined}>{i18n('GO TO OVERVIEW')}</Button>}                                              
+                                       <div className='separator'></div>               
+                                       <SVGIcon
+                                               disabled={heatDataExist ? false : true}
+                                               name='download'
+                                               className='icon-component'                                                                                                              
+                                               color='dark-gray'
+                                               onClick={heatDataExist ? () => onDownload({heatCandidate: heatSetup, isReadOnlyMode, version}) : undefined}
+                                               data-test-id='download-heat'/>
+
                                        <SVGIcon
                                                name='upload'
-                                               className='icon-component'
-                                               label={i18n('Upload New File')}
-                                               labelPosition='right'
-                                               color='secondary'
-                                               disabled={isReadOnlyMode}
+                                               className='icon-component'                                              
+                                               color='dark-gray'
+                                               disabled={isReadOnlyMode || candidateInProcess}
                                                onClick={isReadOnlyMode ? undefined : evt => this.refs.hiddenImportFileInput.click(evt)}
                                                data-test-id='upload-heat'/>
                                        <input
@@ -73,11 +90,11 @@ class HeatScreenView extends Component {
                                                accept='.zip, .csar'
                                                onChange={evt => this.handleImport(evt)}/>
                                </div>
-                       <Tabs
-                               className='attachments-tabs'
-                               type='header'
-                               activeTab={activeTab}
-                               onTabClick={key => this.handleTabPress(key)}>
+                               <Tabs
+                                       className='attachments-tabs'
+                                       type='header'
+                                       activeTab={activeTab}
+                                       onTabClick={key => this.handleTabPress(key)}>
                                        <Tab tabId={tabsMapping.SETUP} title='Setup' disabled={onboardingOrigin === onboardingOriginTypes.CSAR}>
                                                <HeatSetupComponent
                                                        heatDataExist={heatDataExist}
index 54dc1a4..1a29326 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -50,6 +50,11 @@ export default (state = {}, action) => {
                                ...state,
                                licensingVersionsList: action.licensingVersionsList
                        };
+               case actionTypes.CANDIDATE_IN_PROCESS: 
+                       return {
+                               ...state,
+                               data: {...state.data, candidateOnboardingOrigin: true}                          
+                       };      
                default:
                        return state;
        }
index 90ea182..64e0d56 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ export const mapStateToProps = ({
        softwareProduct,
        licenseModel: {licenseAgreement},
 }) => {
-       let {softwareProductEditor: {data:currentSoftwareProduct = {}}, softwareProductComponents, softwareProductCategories = []} = softwareProduct;
+       let {softwareProductEditor: {data:currentSoftwareProduct = {}}, softwareProductComponents, softwareProductCategories = []} = softwareProduct;
        let {licensingData = {}} = currentSoftwareProduct;
        let {licenseAgreementList} = licenseAgreement;
        let {componentsList} = softwareProductComponents;
@@ -53,8 +53,8 @@ export const mapStateToProps = ({
                currentSoftwareProduct: {
                        ...currentSoftwareProduct,
                        licenseAgreementName,
-                       fullCategoryDisplayName
-               },
+                       fullCategoryDisplayName                                         
+               },              
                componentsList,
                isManual: currentSoftwareProduct.onboardingMethod === onboardingMethod.MANUAL
        };
@@ -67,7 +67,10 @@ const mapActionsToProps = (dispatch, {version}) => {
                                screen: enums.SCREEN.SOFTWARE_PRODUCT_DETAILS, screenType: screenTypes.SOFTWARE_PRODUCT,
                                props: {softwareProductId, version}
                        }),
-
+               onCandidateInProcess: (softwareProductId) => ScreensHelper.loadScreen(dispatch, {
+                       screen: enums.SCREEN.SOFTWARE_PRODUCT_ATTACHMENTS_SETUP, screenType: screenTypes.SOFTWARE_PRODUCT,
+                       props: {softwareProductId, version}
+               }),     
                onUpload: (softwareProductId, formData) =>
                        SoftwareProductActionHelper.uploadFile(dispatch, {
                                softwareProductId,
index 76228b0..70c04f0 100644 (file)
@@ -1,17 +1,17 @@
-/*
- * Copyright © 2016-2017 European Support Limited
+/*!
+ * Copyright © 2016-2018 European Support Limited
  *
  * 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
- * 
+ *
+ * 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.
+ * 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';
@@ -65,7 +65,12 @@ class SoftwareProductLandingPageView extends React.Component {
                onComponentSelect: PropTypes.func,
                onAddComponent: PropTypes.func
        };
-
+       componentDidMount() {
+               const {onCandidateInProcess, currentSoftwareProduct} = this.props;              
+               if (currentSoftwareProduct.candidateOnboardingOrigin) {
+                       onCandidateInProcess(currentSoftwareProduct.id);
+               }
+       }
        render() {
                let {currentSoftwareProduct, isReadOnlyMode, isManual, onDetailsSelect} =  this.props;
                return (
diff --git a/openecomp-ui/test/softwareProduct/attachments/validationFlow.test.js b/openecomp-ui/test/softwareProduct/attachments/validationFlow.test.js
new file mode 100644 (file)
index 0000000..b095aed
--- /dev/null
@@ -0,0 +1,40 @@
+/*!
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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 {VSPEditorFactoryWithLicensingData} from 'test-utils/factories/softwareProduct/SoftwareProductEditorFactories.js';
+import {storeCreator} from 'sdc-app/AppStore.js';
+import {actionTypes} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js';
+
+describe('SoftwareProduct Attachments - validation flow test: ', function () {
+
+       it('candidate in process flag test', () => {
+               const softwareProduct = VSPEditorFactoryWithLicensingData.build();
+               const store = storeCreator({                    
+                       softwareProduct: {
+                               softwareProductEditor: {data: softwareProduct},
+                               softwareProductQuestionnaire: {qdata: 'test', qschema: {type: 'string'}}
+                       }
+               });             
+               store.dispatch({
+                       type: actionTypes.CANDIDATE_IN_PROCESS,
+                       inProcess: true
+               }); 
+               let unsubscribe = store.subscribe(() => {
+                       expect(store.getState().softwareProduct.softwareProductEditor.data.onboardingOrigin).toEqual(true);                     
+               });                                                     
+               unsubscribe();
+       });
+
+});
\ No newline at end of file