diff options
Diffstat (limited to 'server/sonar-web')
8 files changed, 87 insertions, 108 deletions
diff --git a/server/sonar-web/src/main/js/apps/overview/components/coverage-measures-list.js b/server/sonar-web/src/main/js/apps/overview/components/coverage-measures-list.js index 898da4b1cd0..c9c376957b9 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/coverage-measures-list.js +++ b/server/sonar-web/src/main/js/apps/overview/components/coverage-measures-list.js @@ -7,32 +7,35 @@ import { CoverageMeasure } from '../components/coverage-measure'; const TEST_DOMAINS = ['Tests', 'Tests (Integration)', 'Tests (Overall)']; - -const UT_COVERAGE_METRICS = ['coverage', 'line_coverage', 'branch_coverage']; -const UT_NEW_COVERAGE_METRICS = ['new_coverage', 'new_line_coverage', 'new_branch_coverage']; - -const IT_COVERAGE_METRICS = ['it_coverage', 'it_line_coverage', 'it_branch_coverage']; -const IT_NEW_COVERAGE_METRICS = ['new_it_coverage', 'new_it_line_coverage', 'new_it_branch_coverage']; - -const OVERALL_COVERAGE_METRICS = ['overall_coverage', 'overall_line_coverage', 'overall_branch_coverage']; -const OVERALL_NEW_COVERAGE_METRICS = ['new_overall_coverage', 'new_overall_line_coverage', - 'new_overall_branch_coverage']; - const TEST_METRICS = ['tests', 'test_execution_time', 'test_errors', 'test_failures', 'skipped_tests', 'test_success_density']; -const KNOWN_METRICS = [].concat(TEST_METRICS, OVERALL_COVERAGE_METRICS, UT_COVERAGE_METRICS, IT_COVERAGE_METRICS); - export const CoverageMeasuresList = React.createClass({ renderOtherMeasures() { + let knownMetrics = [].concat(TEST_METRICS, [ + this.props.coverageMetricPrefix + 'coverage', + this.props.coverageMetricPrefix + 'line_coverage', + this.props.coverageMetricPrefix + 'branch_coverage' + ]); let metrics = filterMetricsForDomains(this.props.metrics, TEST_DOMAINS) - .filter(metric => KNOWN_METRICS.indexOf(metric.key) === -1) + .filter(metric => knownMetrics.indexOf(metric.key) === -1) .map(metric => metric.key); return this.renderListOfMeasures(metrics); }, - renderCoverage (metrics) { + renderCoverage () { + let metrics = [ + this.props.coverageMetricPrefix + 'coverage', + this.props.coverageMetricPrefix + 'line_coverage', + this.props.coverageMetricPrefix + 'branch_coverage' + ]; + + if (_.every(metrics, metric => this.props.measures[metric] == null)) { + // if no measures exist + return null; + } + let measures = metrics.map(metric => { return <CoverageMeasure key={metric} metric={metric} @@ -45,15 +48,18 @@ export const CoverageMeasuresList = React.createClass({ </div>; }, - shouldRenderTypedCoverage () { - return this.props.measures['coverage'] != null && this.props.measures['it_coverage'] != null; - }, + renderNewCoverage () { + let metrics = [ + 'new_' + this.props.coverageMetricPrefix + 'coverage', + 'new_' + this.props.coverageMetricPrefix + 'line_coverage', + 'new_' + this.props.coverageMetricPrefix + 'branch_coverage' + ]; - renderTypedCoverage (metrics) { - return this.shouldRenderTypedCoverage() ? this.renderCoverage(metrics) : null; - }, + if (_.every(metrics, metric => this.props.leak[metric] == null)) { + // if no measures exist + return null; + } - renderNewCoverage (metrics) { let measures = metrics.map(metric => { return <CoverageMeasure key={metric} metric={metric} @@ -66,54 +72,25 @@ export const CoverageMeasuresList = React.createClass({ </div>; }, - renderTypedNewCoverage (metrics) { - return this.shouldRenderTypedCoverage() ? this.renderNewCoverage(metrics) : null; - }, - - renderUTCoverage () { - return this.renderTypedCoverage(UT_COVERAGE_METRICS); - }, - - renderUTNewCoverage () { - return this.renderTypedNewCoverage(UT_NEW_COVERAGE_METRICS); - }, - - renderITCoverage () { - return this.renderTypedCoverage(IT_COVERAGE_METRICS); - }, - - renderITNewCoverage () { - return this.renderTypedNewCoverage(IT_NEW_COVERAGE_METRICS); - }, - - renderOverallCoverage () { - return this.renderCoverage(OVERALL_COVERAGE_METRICS); - }, + renderListOfMeasures(list) { + let metrics = list.map(key => _.findWhere(this.props.metrics, { key })); - renderOverallNewCoverage () { - return this.renderNewCoverage(OVERALL_NEW_COVERAGE_METRICS); - }, + if (_.every(metrics, metric => this.props.measures[metric.key] == null)) { + // if no measures exist + return null; + } - renderListOfMeasures(list) { - let metrics = list - .map(key => _.findWhere(this.props.metrics, { key })) - .map(metric => { - return <DetailedMeasure key={metric.key} {...this.props} {...this.props} metric={metric.key} - type={metric.type}/>; - }); + metrics = metrics.map(metric => { + return <DetailedMeasure key={metric.key} {...this.props} {...this.props} metric={metric.key} + type={metric.type}/>; + }); return <div className="overview-detailed-measures-list">{metrics}</div>; }, render () { return <div> - {this.renderOverallCoverage()} - {this.renderOverallNewCoverage()} - - {this.renderUTCoverage()} - {this.renderUTNewCoverage()} - - {this.renderITCoverage()} - {this.renderITNewCoverage()} + {this.renderCoverage()} + {this.renderNewCoverage()} {this.renderListOfMeasures(TEST_METRICS)} diff --git a/server/sonar-web/src/main/js/apps/overview/components/coverage-selection-mixin.js b/server/sonar-web/src/main/js/apps/overview/components/coverage-selection-mixin.js new file mode 100644 index 00000000000..630c6b84201 --- /dev/null +++ b/server/sonar-web/src/main/js/apps/overview/components/coverage-selection-mixin.js @@ -0,0 +1,11 @@ +export const CoverageSelectionMixin = { + getCoverageMetricPrefix (measures) { + if (measures['coverage'] != null && measures['it_coverage'] != null && measures['overall_coverage'] != null) { + return 'overall_'; + } else if (measures['coverage'] != null) { + return ''; + } else { + return 'it_'; + } + } +}; diff --git a/server/sonar-web/src/main/js/apps/overview/components/detailed-measure.js b/server/sonar-web/src/main/js/apps/overview/components/detailed-measure.js index df0b8e2630c..dda17a4814a 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/detailed-measure.js +++ b/server/sonar-web/src/main/js/apps/overview/components/detailed-measure.js @@ -11,10 +11,9 @@ export const DetailedMeasure = React.createClass({ return null; } let leak = this.props.leak[this.props.metric]; + let formatted = leak != null ? formatMeasureVariation(leak, getShortType(this.props.type)) : '—'; return <div className="overview-detailed-measure-leak"> - <span className="overview-detailed-measure-value"> - {formatMeasureVariation(leak, getShortType(this.props.type))} - </span> + <span className="overview-detailed-measure-value">{formatted}</span> </div>; }, diff --git a/server/sonar-web/src/main/js/apps/overview/components/domain-bubble-chart.js b/server/sonar-web/src/main/js/apps/overview/components/domain-bubble-chart.js index 056863ecdb4..7dee684daaa 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/domain-bubble-chart.js +++ b/server/sonar-web/src/main/js/apps/overview/components/domain-bubble-chart.js @@ -96,7 +96,7 @@ export class DomainBubbleChart extends React.Component { let formatYTick = (tick) => formatMeasure(tick, this.state.yMetric.type); return <BubbleChart items={items} height={HEIGHT} - padding={[25, 30, 50, 60]} + padding={[25, 60, 50, 60]} formatXTick={formatXTick} formatYTick={formatYTick}/>; } diff --git a/server/sonar-web/src/main/js/apps/overview/domains/coverage-domain.js b/server/sonar-web/src/main/js/apps/overview/domains/coverage-domain.js index 6df04be61bb..7d2ab65d8b7 100644 --- a/server/sonar-web/src/main/js/apps/overview/domains/coverage-domain.js +++ b/server/sonar-web/src/main/js/apps/overview/domains/coverage-domain.js @@ -5,6 +5,7 @@ import { getMeasuresAndVariations } from '../../../api/measures'; import { DomainTimeline } from '../components/domain-timeline'; import { DomainTreemap } from '../components/domain-treemap'; import { DomainBubbleChart } from '../components/domain-bubble-chart'; +import { CoverageSelectionMixin } from '../components/coverage-selection-mixin'; import { getPeriodLabel, getPeriodDate } from './../helpers/periods'; import { TooltipsMixin } from '../../../components/mixins/tooltips-mixin'; import { filterMetrics, filterMetricsForDomains } from '../helpers/metrics'; @@ -17,7 +18,7 @@ const TEST_DOMAINS = ['Tests', 'Tests (Integration)', 'Tests (Overall)']; export const CoverageMain = React.createClass({ - mixins: [TooltipsMixin], + mixins: [TooltipsMixin, CoverageSelectionMixin], getInitialState() { return { @@ -31,7 +32,12 @@ export const CoverageMain = React.createClass({ this.requestMeasures().then(r => { let measures = this.getMeasuresValues(r, 'value'); let leak = this.getMeasuresValues(r, 'var' + this.props.leakPeriodIndex); - this.setState({ ready: true, measures, leak }); + this.setState({ + ready: true, + measures, + leak, + coverageMetricPrefix: this.getCoverageMetricPrefix(measures), + }); }); }, @@ -80,6 +86,9 @@ export const CoverageMain = React.createClass({ .domain([0, 100]) .range(CHART_COLORS_RANGE_PERCENT); + let coverageMetric = this.state.coverageMetricPrefix + 'coverage', + uncoveredLinesMetric = this.state.coverageMetricPrefix + 'uncovered_lines'; + return <div className="overview-detailed-page"> <div className="overview-cards-list"> <div className="overview-card overview-card-fixed-width"> @@ -93,15 +102,15 @@ export const CoverageMain = React.createClass({ <div className="overview-card"> <DomainBubbleChart {...this.props} xMetric="complexity" - yMetric="overall_coverage" - sizeMetrics={['overall_uncovered_lines']}/> + yMetric={coverageMetric} + sizeMetrics={[uncoveredLinesMetric]}/> </div> </div> <div className="overview-cards-list"> <div className="overview-card"> <DomainTimeline {...this.props} {...this.state} - initialMetric="overall_coverage" + initialMetric={coverageMetric} metrics={this.getMetricsForTimeline()} allMetrics={this.getAllMetricsForTimeline()}/> </div> @@ -109,7 +118,7 @@ export const CoverageMain = React.createClass({ <div className="overview-card"> <DomainTreemap {...this.props} sizeMetric="ncloc" - colorMetric="overall_coverage" + colorMetric={coverageMetric} scale={treemapScale}/> </div> </div> diff --git a/server/sonar-web/src/main/js/apps/overview/main/coverage.js b/server/sonar-web/src/main/js/apps/overview/main/coverage.js index 0c964a6c63c..7a80f024bff 100644 --- a/server/sonar-web/src/main/js/apps/overview/main/coverage.js +++ b/server/sonar-web/src/main/js/apps/overview/main/coverage.js @@ -13,27 +13,16 @@ export const GeneralCoverage = React.createClass({ propTypes: { measures: React.PropTypes.object.isRequired, leakPeriodLabel: React.PropTypes.string, - leakPeriodDate: React.PropTypes.object + leakPeriodDate: React.PropTypes.object, + coverageMetricPrefix: React.PropTypes.string.isRequired }, getCoverageMetric () { - if (this.props.measures['overall_coverage'] != null) { - return 'overall_coverage'; - } else if (this.props.measures['coverage'] != null) { - return 'coverage'; - } else { - return 'it_coverage'; - } + return this.props.coverageMetricPrefix + 'coverage'; }, getNewCoverageMetric () { - if (this.props.leak['new_overall_coverage'] != null) { - return 'new_overall_coverage'; - } else if (this.props.leak['new_coverage'] != null) { - return 'new_coverage'; - } else { - return 'new_it_coverage'; - } + return 'new_' + this.props.coverageMetricPrefix + 'coverage'; }, renderNewCoverage () { diff --git a/server/sonar-web/src/main/js/apps/overview/main/main.js b/server/sonar-web/src/main/js/apps/overview/main/main.js index 8e9b17a21c3..470b92f49d1 100644 --- a/server/sonar-web/src/main/js/apps/overview/main/main.js +++ b/server/sonar-web/src/main/js/apps/overview/main/main.js @@ -6,6 +6,7 @@ import { GeneralIssues } from './issues'; import { GeneralCoverage } from './coverage'; import { GeneralDuplications } from './duplications'; import { GeneralSize } from './size'; +import { CoverageSelectionMixin } from '../components/coverage-selection-mixin'; import { getPeriodLabel, getPeriodDate } from './../helpers/periods'; import { getMeasuresAndVariations } from '../../../api/measures'; import { getFacet, getIssuesCount } from '../../../api/issues'; @@ -30,7 +31,6 @@ const METRICS_LIST = [ const HISTORY_METRICS_LIST = [ 'sqale_index', - 'overall_coverage', 'duplicated_lines_density', 'ncloc' ]; @@ -42,6 +42,8 @@ function getFacetValue (facet, key) { export default React.createClass({ + mixins: [CoverageSelectionMixin], + propTypes: { leakPeriodIndex: React.PropTypes.string.isRequired }, @@ -77,7 +79,8 @@ export default React.createClass({ this.setState({ ready: true, measures: measures, - leak: leak + leak: leak, + coverageMetricPrefix: this.getCoverageMetricPrefix(measures) }, this.requestHistory); }); }, @@ -134,7 +137,8 @@ export default React.createClass({ }, requestHistory () { - let metrics = HISTORY_METRICS_LIST.join(','); + let coverageMetric = this.state.coverageMetricPrefix + 'coverage'; + let metrics = [].concat(HISTORY_METRICS_LIST, coverageMetric).join(','); return getTimeMachineData(this.props.component.key, metrics).then(r => { let history = {}; r[0].cols.forEach((col, index) => { @@ -159,11 +163,13 @@ export default React.createClass({ return this.renderLoading(); } + let coverageMetric = this.state.coverageMetricPrefix + 'coverage'; let props = _.extend({}, this.props, this.state); return <div className="overview-domains-list"> <GeneralIssues {...props} history={this.state.history['sqale_index']}/> - <GeneralCoverage {...props} history={this.state.history['overall_coverage']}/> + <GeneralCoverage {...props} coverageMetricPrefix={this.state.coverageMetricPrefix} + history={this.state.history[coverageMetric]}/> <GeneralDuplications {...props} history={this.state.history['duplicated_lines_density']}/> <GeneralSize {...props} history={this.state.history['ncloc']}/> </div>; diff --git a/server/sonar-web/tests/apps/overview/main/coverage-test.js b/server/sonar-web/tests/apps/overview/main/coverage-test.js index 616016322dd..631179a344d 100644 --- a/server/sonar-web/tests/apps/overview/main/coverage-test.js +++ b/server/sonar-web/tests/apps/overview/main/coverage-test.js @@ -28,20 +28,8 @@ const LEAK_FOR_IT = _.omit(LEAK_FOR_UT, 'new_coverage'); describe('Overview :: GeneralCoverage', function () { - it('should display overall coverage', function () { - let component = <GeneralCoverage measures={MEASURES} leak={LEAK} component={COMPONENT} - leakPeriodDate={DATE}/>; - let output = TestUtils.renderIntoDocument(component); - - let coverageElement = TestUtils.findRenderedDOMComponentWithClass(output, 'js-overview-main-coverage'); - expect(coverageElement.textContent).to.equal('73.5%'); - - let newCoverageElement = TestUtils.findRenderedDOMComponentWithClass(output, 'js-overview-main-new-coverage'); - expect(newCoverageElement.textContent).to.equal('72.5%'); - }); - it('should display tests', function () { - let component = <GeneralCoverage measures={MEASURES} component={COMPONENT}/>; + let component = <GeneralCoverage measures={MEASURES} component={COMPONENT} coverageMetricPrefix=""/>; let output = TestUtils.renderIntoDocument(component); let coverageElement = TestUtils.findRenderedDOMComponentWithClass(output, 'js-overview-main-tests'); expect(coverageElement.textContent).to.equal('137'); @@ -49,7 +37,7 @@ describe('Overview :: GeneralCoverage', function () { it('should not display tests', function () { let measuresWithoutTests = _.omit(MEASURES, 'tests'); - let component = <GeneralCoverage measures={measuresWithoutTests} component={COMPONENT}/>; + let component = <GeneralCoverage measures={measuresWithoutTests} component={COMPONENT} coverageMetricPrefix=""/>; let output = TestUtils.renderIntoDocument(component); let coverageElements = TestUtils.scryRenderedDOMComponentsWithClass(output, 'js-overview-main-tests'); expect(coverageElements).to.be.empty; @@ -57,7 +45,7 @@ describe('Overview :: GeneralCoverage', function () { it('should fall back to UT coverage', function () { let component = <GeneralCoverage measures={MEASURES_FOR_UT} leak={LEAK_FOR_UT} component={COMPONENT} - leakPeriodDate={DATE}/>; + leakPeriodDate={DATE} coverageMetricPrefix=""/>; let output = TestUtils.renderIntoDocument(component); let coverageElement = TestUtils.findRenderedDOMComponentWithClass(output, 'js-overview-main-coverage'); @@ -69,7 +57,7 @@ describe('Overview :: GeneralCoverage', function () { it('should fall back to IT coverage', function () { let component = <GeneralCoverage measures={MEASURES_FOR_IT} leak={LEAK_FOR_IT} component={COMPONENT} - leakPeriodDate={DATE}/>; + leakPeriodDate={DATE} coverageMetricPrefix="it_"/>; let output = TestUtils.renderIntoDocument(component); let coverageElement = TestUtils.findRenderedDOMComponentWithClass(output, 'js-overview-main-coverage'); |