From: Stas Vilchik Date: Mon, 11 Jun 2018 15:13:50 +0000 (+0200) Subject: fix project home page timeline with missing values X-Git-Tag: 7.5~1046 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3fb70514d8fb7157cb2354b7faf60261e5e68163;p=sonarqube.git fix project home page timeline with missing values --- diff --git a/server/sonar-web/src/main/js/api/time-machine.ts b/server/sonar-web/src/main/js/api/time-machine.ts index ac77c7c8b41..097b0b08f3d 100644 --- a/server/sonar-web/src/main/js/api/time-machine.ts +++ b/server/sonar-web/src/main/js/api/time-machine.ts @@ -23,7 +23,7 @@ import throwGlobalError from '../app/utils/throwGlobalError'; export interface HistoryItem { date: Date; - value: string; + value?: string; } export interface History { diff --git a/server/sonar-web/src/main/js/apps/overview/components/Timeline.tsx b/server/sonar-web/src/main/js/apps/overview/components/Timeline.tsx index 2b372ce80dd..51fade7572d 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/Timeline.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/Timeline.tsx @@ -49,9 +49,12 @@ export default class Timeline extends React.PureComponent { } const data = snapshots.map((snapshot, index) => { - return { x: index, y: Number(snapshot.value) }; + return { x: index, y: snapshot.value !== undefined ? Number(snapshot.value) : undefined }; }); - const domain = [0, max(this.props.history, d => parseFloat(d.value))] as [number, number]; + const domain = [ + 0, + max(this.props.history, d => (d.value !== undefined ? parseFloat(d.value) : 0)) + ] as [number, number]; return ( { + expect(shallow()).toMatchSnapshot(); +}); + +it('should render correctly with a "before" range', () => { + expect(shallow()).toMatchSnapshot(); +}); + +it('should have a correct domain with strings or numbers', () => { + const date = parseDate('2017-05-08T00:00:00.000Z'); + const wrapper = shallow(); + expect(wrapper.find('LineChart').prop('domain')).toEqual([0, 360]); + + wrapper.setProps({ history: [{ date, value: '360.33' }, { date, value: '39.54' }] }); + expect(wrapper.find('LineChart').prop('domain')).toEqual([0, 360.33]); + + wrapper.setProps({ history: [{ date, value: 360 }, { date, value: 39 }] }); + expect(wrapper.find('LineChart').prop('domain')).toEqual([0, 360]); +}); + +it('should not fail when a value is missing', () => { + expect( + shallow( + + ) + ).toMatchSnapshot(); +}); diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/Timeline-test.tsx.snap b/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/Timeline-test.tsx.snap new file mode 100644 index 00000000000..710cbbf695a --- /dev/null +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/__snapshots__/Timeline-test.tsx.snap @@ -0,0 +1,110 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`should not fail when a value is missing 1`] = ` + +`; + +exports[`should render correctly with a "before" range 1`] = ` + +`; + +exports[`should render correctly with an "after" range 1`] = ` + +`; diff --git a/server/sonar-web/src/main/js/components/charts/LineChart.tsx b/server/sonar-web/src/main/js/components/charts/LineChart.tsx index 862a3da8c1d..48ce481f192 100644 --- a/server/sonar-web/src/main/js/components/charts/LineChart.tsx +++ b/server/sonar-web/src/main/js/components/charts/LineChart.tsx @@ -26,7 +26,7 @@ import './LineChart.css'; interface DataPoint { x: number; - y: number; + y?: number; } interface Props { @@ -54,7 +54,7 @@ export default class LineChart extends React.PureComponent { const area = d3Area() .x(d => xScale(d.x)) .y0(yScale.range()[0]) - .y1(d => yScale(d.y)) + .y1(d => yScale(d.y || 0)) .defined(d => d.y != null) .curve(curveBasis); @@ -76,7 +76,7 @@ export default class LineChart extends React.PureComponent { const points = this.props.data.filter(point => point.y != null).map((point, index) => { const x = xScale(point.x); - const y = yScale(point.y); + const y = yScale(point.y || 0); return ; }); return {points}; @@ -92,7 +92,7 @@ export default class LineChart extends React.PureComponent { const lines = this.props.data.map((point, index) => { const x = xScale(point.x); const y1 = yScale.range()[0]; - const y2 = yScale(point.y); + const y2 = yScale(point.y || 0); return ; }); return {lines}; @@ -128,7 +128,7 @@ export default class LineChart extends React.PureComponent { const ticks = xValues.map((value, index) => { const point = this.props.data[index]; const x = xScale(point.x); - const y = yScale(point.y); + const y = yScale(point.y || 0); return ( {value} @@ -141,7 +141,7 @@ export default class LineChart extends React.PureComponent { renderLine(xScale: ScaleLinear, yScale: ScaleLinear) { const p = d3Line() .x(d => xScale(d.x)) - .y(d => yScale(d.y)) + .y(d => yScale(d.y || 0)) .defined(d => d.y != null) .curve(curveBasis); return ;