diff options
Diffstat (limited to 'openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults')
5 files changed, 390 insertions, 176 deletions
diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js index dffade7c9a..ed88dddc5a 100644 --- a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js +++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResults.js @@ -15,14 +15,32 @@ */ import { connect } from 'react-redux'; import SoftwareProductValidationResultsView from './SoftwareProductValidationResultsView.jsx'; +import SoftwareProductValidationResultsViewActionHelper from './SoftwareProductValidationResultsViewActionHelper.js'; export const mapStateToProps = ({ softwareProduct }) => { + let { softwareProductValidationResult } = softwareProduct; let { softwareProductValidation } = softwareProduct; return { + softwareProductValidationResult, softwareProductValidation }; }; - -export default connect(mapStateToProps, null, null, { +export const mapActionsToProps = dispatch => { + return { + refreshValidationResults: (requestId, endPoints) => { + return SoftwareProductValidationResultsViewActionHelper.refreshValidationResults( + dispatch, + { requestId, endPoints } + ); + }, + updateDisplayTestResultData: testResultToDisplay => { + return SoftwareProductValidationResultsViewActionHelper.updateDisplayTestResultData( + dispatch, + { testResultToDisplay } + ); + } + }; +}; +export default connect(mapStateToProps, mapActionsToProps, 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 index 2c2cccd711..c5da4f6ca1 100644 --- a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx +++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsView.jsx @@ -20,64 +20,48 @@ import { SVGIcon } from 'onap-ui-react'; 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 + softwareProductValidation: PropTypes.object, + refreshValidationResults: PropTypes.func }; constructor(props) { super(props); this.state = { vspId: this.props.softwareProductId, - versionNumber: this.props.version.name + versionNumber: this.props.version.name, + refreshValidationResults: this.props.refreshValidationResults, + vspTestResults: this.props.vspTestResults, + flatTestsMap: {}, + generalInfo: {} }; } + componentDidMount() { + this.configBasicTestData(); + } + componentDidUpdate() { + this.updateTestResultToDisplay(); + } + + prepareDataForCheckboxes(children, ftm) { + for (var val of children) { + if (val.children) { + this.prepareDataForCheckboxes(val.children, ftm); + } else if (val.tests) { + for (var test of val.tests) { + ftm[test.testCaseName] = test.description; + } + } + } + return ftm; + } getTitle(result) { - let { vspTestsMap } = this.props.softwareProductValidation; + let { flatTestsMap: vspTestsMap } = this.state; let title = vspTestsMap[result.testCaseName] - ? vspTestsMap[result.testCaseName].title + ? vspTestsMap[result.testCaseName].split(/\r?\n/)[0] : i18n('Unknown'); return i18n( 'Scenario: {scenario} | Title: {title} | Test Case: {testCaseName} | Status: {status}', @@ -90,19 +74,36 @@ class SoftwareProductValidationResultsView extends React.Component { ); } - renderJSON(result) { + renderJSON(result, indexKey) { + if (result.status === 'in-progress') { + return this.renderInprogress(i18n('Test is In-progress'), indexKey); + } else { + return ( + <li key={indexKey} type="none"> + <textarea + disabled={true} + className="validation-results-test-result-json" + value={JSON.stringify(result, null, 2)} + /> + </li> + ); + } + } + renderInprogress(result, indexKey) { return ( - <li type="none"> - <textarea - disabled={true} - className="validation-results-test-result-json" - value={JSON.stringify(result, null, 2)} + <li key={indexKey} type="none"> + <SVGIcon + color="warning" + name="exclamationTriangleLine" + labelPosition="right" /> + <span className="validation-results-test-result-label"> + {result} + </span> </li> ); } - - renderError(result) { + renderError(result, indexKey) { if (Array.isArray(result)) { return result.map((parameter, index) => { return ( @@ -120,95 +121,60 @@ class SoftwareProductValidationResultsView extends React.Component { </li> ); }); - } else { + } else if ( + typeof result === 'string' || + result.hasOwnProperty('code') || + result.hasOwnProperty('advice') || + result.hasOwnProperty('message') || + result.hasOwnProperty('error') + ) { + result = + result instanceof Object && result.error instanceof Object + ? result.error + : result; return ( - <li type="none"> + <li key={indexKey} type="none"> <SVGIcon color="negative" name="errorCircle" labelPosition="right" /> <span className="validation-results-test-result-label"> - {(result.code || '') + - ' | ' + - (result.advice || result.message)} + {typeof result === 'string' + ? result + : (result.code || '') + + ' | ' + + (result.advice || result.message || result.error)} </span> </li> ); - } - } - - renderResults(result) { - if (typeof result === 'string' || result instanceof String) { + } else { return ( - <div> - <SVGIcon - color="warning" - name="errorCircle" - labelPosition="right" - /> - <span className="validation-results-test-result-label"> - {result} - </span> - </div> + <Accordion key={indexKey} defaultExpanded> + {this.renderJSON(result)} + </Accordion> ); } - return Object.keys(result).map((key, index) => { - let title = unCamelCasedString(key); - if ( - typeof result[key] === 'string' || - result[key] instanceof String - ) { - return ( - <Accordion - defaultExpanded - dataTestId={title} - title={title} - key={index}> - {this.renderString(result[key])} - </Accordion> - ); - } else if (Array.isArray(result[key])) { - if (result[key].length > 0) { - return ( - <Accordion - defaultExpanded - dataTestId={title} - title={title} - key={index}> - <TestResultComponent tests={result[key]} /> - </Accordion> - ); - } else { - return ( - <Accordion - defaultExpanded - dataTestId={title} - title={title} - key={index}> - {i18n('{title} results are not available', { - title: title - })} - </Accordion> - ); - } - } else { - return ( - <Accordion - defaultExpanded - dataTestId={title} - title={title} - key={index}> - {this.renderJSON(result[key])} - </Accordion> - ); - } - }); } - renderString(result) { + renderResults(result, indexKey) { return ( - <li type="none"> + <li key={indexKey} type="none"> + <SVGIcon + color="positive" + name="checkCircle" + labelPosition="right" + /> + <span className="validation-results-test-result-label"> + {result} + </span> + </li> + ); + } + + renderString(result, indexKey) { + return ( + <li key={indexKey} type="none"> <textarea type="textarea" disabled={true} @@ -219,92 +185,191 @@ class SoftwareProductValidationResultsView extends React.Component { ); } - buildSubAccordions(result) { + buildSubAccordions(result, indexKey) { let results = result.results; if (!results) { return ( <Accordion + key={indexKey} defaultExpanded dataTestId="vsp-test-no-results" title={this.getTitle(result)}> - {this.renderJSON(result)} + {this.renderJSON(result, indexKey)} </Accordion> ); } else if (typeof results === 'string' || results instanceof String) { return ( <Accordion + key={indexKey} defaultExpanded dataTestId="vsp-test-string-results" title={this.getTitle(result)}> - {this.renderString(results)} + {this.renderString(results, indexKey)} </Accordion> ); } else { return ( <Accordion + key={indexKey} defaultExpanded dataTestId="vsp-test-object-results" title={this.getTitle(result)}> {Object.keys(results).length === 0 ? this.renderString( - i18n('{title} results are not available', { - title: 'Test' - }) + i18n( + '{title} results are not available', + { + title: 'Test' + }, + indexKey + ) ) - : Object.keys(results).map(key => { - if (key === 'errors' || key === 'error') { - return this.renderError(results[key]); - } else if (key === 'testResults') { - return this.renderResults(results[key]); - } else { - let title = unCamelCasedString(key); - if (results[key] instanceof Object) { - return ( - <Accordion - defaultExpanded - dataTestId={title} - title={title}> - {this.renderJSON(results[key])} - </Accordion> - ); - } else { - return ( - <Accordion - defaultExpanded - dataTestId={title} - title={title}> - {this.renderString(results[key])} - </Accordion> - ); - } - } - })} + : Array.isArray(results) + ? Object.keys(results).map((key, indexKey) => { + if (Object.keys(results[key]).length === 0) { + return this.renderResults( + result.testCaseName + + ' ' + + i18n('has passed all checks'), + indexKey + ); + } else { + return this.renderError( + results[key], + indexKey + ); + } + }) + : this.renderError(results, indexKey)} </Accordion> ); } } - + refreshValidationResult(thisObj) { + let { refreshValidationResults } = thisObj.props; + var testResultKey = this.props.softwareProductValidationResult + .testResultKeys[this.state.vspId + this.state.versionNumber]; + refreshValidationResults( + testResultKey.requestId, + testResultKey.endPoints + ); + delete this.props.softwareProductValidation.vspTestResults; + } + configBasicTestData() { + let { + softwareProductValidationResult, + softwareProductValidation + } = this.props; + if ( + softwareProductValidationResult.vspChecks !== undefined && + softwareProductValidationResult.vspChecks.children !== undefined + ) { + var ftm = this.prepareDataForCheckboxes( + this.props.softwareProductValidationResult.vspChecks.children, + {} + ); + this.setState({ + flatTestsMap: ftm + }); + } + if (softwareProductValidation.testResultKeys) { + if (!this.props.softwareProductValidationResult.testResultKeys) { + this.props.softwareProductValidationResult.testResultKeys = {}; + } + this.props.softwareProductValidationResult.testResultKeys[ + this.state.vspId + this.state.versionNumber + ] = + softwareProductValidation.testResultKeys; + delete this.props.softwareProductValidation.testResultKeys; + } + } + updateTestResultToDisplay() { + if (this.props.softwareProductValidation.vspTestResults) { + let { updateDisplayTestResultData } = this.props; + var testResultToDisplay = this.props.softwareProductValidationResult + .testResultToDisplay; + testResultToDisplay = testResultToDisplay + ? testResultToDisplay + : {}; + testResultToDisplay[ + this.state.vspId + this.state.versionNumber + ] = this.props.softwareProductValidation.vspTestResults; + updateDisplayTestResultData(testResultToDisplay); + delete this.props.softwareProductValidation.vspTestResults; + } else if (this.props.softwareProductValidationResult.vspTestResults) { + let { updateDisplayTestResultData } = this.props; + var testResultToDisplay = this.props.softwareProductValidationResult + .testResultToDisplay + ? this.props.softwareProductValidationResult.testResultToDisplay + : {}; + testResultToDisplay[ + this.state.vspId + this.state.versionNumber + ] = this.props.softwareProductValidationResult.vspTestResults; + updateDisplayTestResultData(testResultToDisplay); + delete this.props.softwareProductValidationResult.vspTestResults; + } + } render() { - let results = this.props.softwareProductValidation.vspTestResults || []; - if (results.length > 0) { + let testResultToDisplay = this.props.softwareProductValidationResult + .testResultToDisplay; + let results = testResultToDisplay + ? testResultToDisplay[this.state.vspId + this.state.versionNumber] + : null; + if (!results) { 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 title={i18n('Test Results')}> + <h4>{i18n('No Test Performed')}</h4> </GridSection> ); + } else if (results.length > 0) { + return ( + <div> + <div + onClick={() => this.refreshValidationResult(this)} + data-test-id="vsp-validation-refresh-btn" + className={'vcp-validation-refresh-btn'}> + <SVGIcon + label="Refresh" + labelPosition="left" + color="" + iconClassName="vcp-validation-refresh-icon" + name="versionControllerSync" + /> + </div> + <GridSection title={i18n('Test Results')}> + <GridItem colSpan={10}> + <Accordion + defaultExpanded + dataTestId="vsp-validation-test-result" + title={i18n('Test Results')}> + {results.map((row, index) => + this.buildSubAccordions(row, index) + )} + </Accordion> + </GridItem> + </GridSection> + </div> + ); } else { return ( - <GridSection title={i18n('Validation Results')}> - <h4>{i18n('No Validation Checks Performed')}</h4> - </GridSection> + <div> + <div + onClick={() => this.refreshValidationResult(this)} + data-test-id="vsp-validation-refresh-btn" + className={'vcp-validation-refresh-btn'}> + <SVGIcon + label="Refresh" + labelPosition="left" + color="" + iconClassName="vcp-validation-refresh-icon" + name="versionControllerSync" + /> + </div> + <GridSection title={i18n('Test Results')}> + <h4>{i18n('No Test Result Available')}</h4> + </GridSection> + </div> ); } } diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewActionHelper.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewActionHelper.js new file mode 100644 index 0000000000..4da8b9b30d --- /dev/null +++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewActionHelper.js @@ -0,0 +1,79 @@ +/** + * 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 { actionTypes } from './SoftwareProductValidationResultsViewConstants.js'; + +function encodeResultQueryData(requestId, endPoints) { + const query = []; + query.push('requestId=' + requestId); + endPoints.forEach(endPoint => { + query.push('endPoint=' + encodeURIComponent(endPoint)); + }); + + return query.join('&'); +} +function fetchVspValidationResults(requestId, endPoints) { + const restPrefix = Configuration.get('restPrefix'); + const requestQuery = encodeResultQueryData(requestId, endPoints); + return RestAPIUtil.fetch( + `${restPrefix}/v1.0/externaltesting/executions?${requestQuery}` + ); +} +function fetchVspChecks() { + const restPrefix = Configuration.get('restPrefix'); + return RestAPIUtil.fetch(`${restPrefix}/v1.0/externaltesting/testcasetree`); +} +const SoftwareProductValidationResultsViewActionHelper = { + refreshValidationResults(dispatch, { requestId, endPoints }) { + return new Promise((resolve, reject) => { + fetchVspValidationResults(requestId, endPoints) + .then(response => { + dispatch({ + type: actionTypes.FETCH_VSP_RESULT, + vspTestResults: response + }); + resolve(response); + }) + .catch(error => { + reject(error); + }); + }); + }, + fetchVspChecks(dispatch) { + return new Promise((resolve, reject) => { + fetchVspChecks() + .then(response => { + dispatch({ + type: actionTypes.FETCH_VSP_CHECKS, + vspChecks: response + }); + resolve(response); + }) + .catch(error => { + reject(error); + }); + }); + }, + updateDisplayTestResultData(dispatch, { testResultToDisplay }) { + dispatch({ + type: actionTypes.UPDATE_DISPLAY_TEST_RESULT_DATA, + testResultToDisplay: testResultToDisplay + }); + } +}; + +export default SoftwareProductValidationResultsViewActionHelper; diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewConstants.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewConstants.js new file mode 100644 index 0000000000..22fcb12131 --- /dev/null +++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewConstants.js @@ -0,0 +1,25 @@ +/** + * 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 actionTypes = keyMirror( + { + FETCH_VSP_RESULT: null, + FETCH_VSP_CHECKS: null, + UPDATE_DISPLAY_TEST_RESULT_DATA: null + }, + 'SoftwareProductValidationResults' +); diff --git a/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewReducer.js b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewReducer.js new file mode 100644 index 0000000000..99bf68f723 --- /dev/null +++ b/openecomp-ui/src/sdc-app/onboarding/softwareProduct/validationResults/SoftwareProductValidationResultsViewReducer.js @@ -0,0 +1,27 @@ +import { actionTypes } from './SoftwareProductValidationResultsViewConstants.js'; + +export default (state = {}, action) => { + switch (action.type) { + case actionTypes.FETCH_VSP_RESULT: { + return { + ...state, + vspTestResults: action.vspTestResults + }; + } + case actionTypes.FETCH_VSP_CHECKS: { + return { + ...state, + vspChecks: action.vspChecks + }; + } + case actionTypes.UPDATE_DISPLAY_TEST_RESULT_DATA: { + return { + ...state, + vspTestResults: null, + testResultToDisplay: action.testResultToDisplay + }; + } + default: + return state; + } +}; |