aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web
diff options
context:
space:
mode:
Diffstat (limited to 'server/sonar-web')
-rw-r--r--server/sonar-web/src/main/js/apps/overview/components/coverage-measures-list.js103
-rw-r--r--server/sonar-web/src/main/js/apps/overview/components/coverage-selection-mixin.js11
-rw-r--r--server/sonar-web/src/main/js/apps/overview/components/detailed-measure.js5
-rw-r--r--server/sonar-web/src/main/js/apps/overview/components/domain-bubble-chart.js2
-rw-r--r--server/sonar-web/src/main/js/apps/overview/domains/coverage-domain.js21
-rw-r--r--server/sonar-web/src/main/js/apps/overview/main/coverage.js19
-rw-r--r--server/sonar-web/src/main/js/apps/overview/main/main.js14
-rw-r--r--server/sonar-web/tests/apps/overview/main/coverage-test.js20
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');