diff options
Diffstat (limited to 'spec/frontend/monitoring/components/charts/anomaly_spec.js')
-rw-r--r-- | spec/frontend/monitoring/components/charts/anomaly_spec.js | 304 |
1 files changed, 0 insertions, 304 deletions
diff --git a/spec/frontend/monitoring/components/charts/anomaly_spec.js b/spec/frontend/monitoring/components/charts/anomaly_spec.js deleted file mode 100644 index 3674a49f42c..00000000000 --- a/spec/frontend/monitoring/components/charts/anomaly_spec.js +++ /dev/null @@ -1,304 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { TEST_HOST } from 'helpers/test_constants'; -import Anomaly from '~/monitoring/components/charts/anomaly.vue'; - -import MonitorTimeSeriesChart from '~/monitoring/components/charts/time_series.vue'; -import { colorValues } from '~/monitoring/constants'; -import { anomalyGraphData } from '../../graph_data'; -import { anomalyDeploymentData, mockProjectDir } from '../../mock_data'; - -const mockProjectPath = `${TEST_HOST}${mockProjectDir}`; - -const TEST_UPPER = 11; -const TEST_LOWER = 9; - -describe('Anomaly chart component', () => { - let wrapper; - - const setupAnomalyChart = (props) => { - wrapper = shallowMount(Anomaly, { - propsData: { ...props }, - }); - }; - const findTimeSeries = () => wrapper.findComponent(MonitorTimeSeriesChart); - const getTimeSeriesProps = () => findTimeSeries().props(); - - describe('wrapped monitor-time-series-chart component', () => { - const mockValues = ['10', '10', '10']; - - const mockGraphData = anomalyGraphData( - {}, - { - upper: mockValues.map(() => String(TEST_UPPER)), - values: mockValues, - lower: mockValues.map(() => String(TEST_LOWER)), - }, - ); - - const inputThresholds = ['some threshold']; - - beforeEach(() => { - setupAnomalyChart({ - graphData: mockGraphData, - deploymentData: anomalyDeploymentData, - thresholds: inputThresholds, - projectPath: mockProjectPath, - }); - }); - - it('renders correctly', () => { - expect(findTimeSeries().exists()).toBe(true); - }); - - describe('receives props correctly', () => { - describe('graph-data', () => { - it('receives a single "metric" series', () => { - const { graphData } = getTimeSeriesProps(); - expect(graphData.metrics.length).toBe(1); - }); - - it('receives "metric" with all data', () => { - const { graphData } = getTimeSeriesProps(); - const metric = graphData.metrics[0]; - const expectedMetric = mockGraphData.metrics[0]; - expect(metric).toEqual(expectedMetric); - }); - - it('receives the "metric" results', () => { - const { graphData } = getTimeSeriesProps(); - const { result } = graphData.metrics[0]; - const { values } = result[0]; - - expect(values).toEqual([ - [expect.any(String), 10], - [expect.any(String), 10], - [expect.any(String), 10], - ]); - }); - }); - - describe('option', () => { - let option; - let series; - - beforeEach(() => { - ({ option } = getTimeSeriesProps()); - ({ series } = option); - }); - - it('contains a boundary band', () => { - expect(series).toEqual(expect.any(Array)); - expect(series.length).toEqual(2); // 1 upper + 1 lower boundaries - expect(series[0].stack).toEqual(series[1].stack); - - series.forEach((s) => { - expect(s.type).toBe('line'); - expect(s.lineStyle.width).toBe(0); - expect(s.lineStyle.color).toMatch(/rgba\(.+\)/); - expect(s.lineStyle.color).toMatch(s.color); - expect(s.symbol).toEqual('none'); - }); - }); - - it('upper boundary values are stacked on top of lower boundary', () => { - const [lowerSeries, upperSeries] = series; - - lowerSeries.data.forEach(([, y]) => { - expect(y).toBeCloseTo(TEST_LOWER); - }); - - upperSeries.data.forEach(([, y]) => { - expect(y).toBeCloseTo(TEST_UPPER - TEST_LOWER); - }); - }); - }); - - describe('series-config', () => { - let seriesConfig; - - beforeEach(() => { - ({ seriesConfig } = getTimeSeriesProps()); - }); - - it('display symbols is enabled', () => { - expect(seriesConfig).toEqual( - expect.objectContaining({ - type: 'line', - symbol: 'circle', - showSymbol: true, - symbolSize: expect.any(Function), - itemStyle: { - color: expect.any(Function), - }, - }), - ); - }); - - it('does not display anomalies', () => { - const { symbolSize, itemStyle } = seriesConfig; - mockValues.forEach((v, dataIndex) => { - const size = symbolSize(null, { dataIndex }); - const color = itemStyle.color({ dataIndex }); - - // normal color and small size - expect(size).toBeCloseTo(0); - expect(color).toBe(colorValues.primaryColor); - }); - }); - - it('can format y values (to use in tooltips)', () => { - mockValues.forEach((v, dataIndex) => { - const formatted = wrapper.vm.yValueFormatted(0, dataIndex); - expect(parseFloat(formatted)).toEqual(parseFloat(v)); - }); - }); - }); - - describe('inherited properties', () => { - it('"deployment-data" keeps the same value', () => { - const { deploymentData } = getTimeSeriesProps(); - expect(deploymentData).toEqual(anomalyDeploymentData); - }); - it('"projectPath" keeps the same value', () => { - const { projectPath } = getTimeSeriesProps(); - expect(projectPath).toEqual(mockProjectPath); - }); - }); - }); - }); - - describe('with no boundary data', () => { - const noBoundaryData = anomalyGraphData( - {}, - { - upper: [], - values: ['10', '10', '10'], - lower: [], - }, - ); - - beforeEach(() => { - setupAnomalyChart({ - graphData: noBoundaryData, - deploymentData: anomalyDeploymentData, - }); - }); - - describe('option', () => { - let option; - let series; - - beforeEach(() => { - ({ option } = getTimeSeriesProps()); - ({ series } = option); - }); - - it('does not display a boundary band', () => { - expect(series).toEqual(expect.any(Array)); - expect(series.length).toEqual(0); // no boundaries - }); - - it('can format y values (to use in tooltips)', () => { - expect(parseFloat(wrapper.vm.yValueFormatted(0, 0))).toEqual(10); - expect(wrapper.vm.yValueFormatted(1, 0)).toBe(''); // missing boundary - expect(wrapper.vm.yValueFormatted(2, 0)).toBe(''); // missing boundary - }); - }); - }); - - describe('with one anomaly', () => { - const mockValues = ['10', '20', '10']; - - const oneAnomalyData = anomalyGraphData( - {}, - { - upper: mockValues.map(() => TEST_UPPER), - values: mockValues, - lower: mockValues.map(() => TEST_LOWER), - }, - ); - - beforeEach(() => { - setupAnomalyChart({ - graphData: oneAnomalyData, - deploymentData: anomalyDeploymentData, - }); - }); - - describe('series-config', () => { - it('displays one anomaly', () => { - const { seriesConfig } = getTimeSeriesProps(); - const { symbolSize, itemStyle } = seriesConfig; - - const bigDots = mockValues.filter((v, dataIndex) => { - const size = symbolSize(null, { dataIndex }); - return size > 0.1; - }); - const redDots = mockValues.filter((v, dataIndex) => { - const color = itemStyle.color({ dataIndex }); - return color === colorValues.anomalySymbol; - }); - - expect(bigDots.length).toBe(1); - expect(redDots.length).toBe(1); - }); - }); - }); - - describe('with offset', () => { - const mockValues = ['10', '11', '12']; - const mockUpper = ['20', '20', '20']; - const mockLower = ['-1', '-2', '-3.70']; - const expectedOffset = 4; // Lowest point in mock data is -3.70, it gets rounded - - beforeEach(() => { - setupAnomalyChart({ - graphData: anomalyGraphData( - {}, - { - upper: mockUpper, - values: mockValues, - lower: mockLower, - }, - ), - deploymentData: anomalyDeploymentData, - }); - }); - - describe('receives props correctly', () => { - describe('graph-data', () => { - it('receives a single "metric" series', () => { - const { graphData } = getTimeSeriesProps(); - expect(graphData.metrics.length).toBe(1); - }); - - it('receives "metric" results and applies the offset to them', () => { - const { graphData } = getTimeSeriesProps(); - const { result } = graphData.metrics[0]; - const { values } = result[0]; - - expect(values).toEqual(expect.any(Array)); - - values.forEach(([, y], index) => { - expect(y).toBeCloseTo(parseFloat(mockValues[index]) + expectedOffset); - }); - }); - }); - }); - - describe('option', () => { - it('upper boundary values are stacked on top of lower boundary, plus the offset', () => { - const { option } = getTimeSeriesProps(); - const { series } = option; - const [lowerSeries, upperSeries] = series; - lowerSeries.data.forEach(([, y], i) => { - expect(y).toBeCloseTo(parseFloat(mockLower[i]) + expectedOffset); - }); - - upperSeries.data.forEach(([, y], i) => { - expect(y).toBeCloseTo(parseFloat(mockUpper[i] - mockLower[i])); - }); - }); - }); - }); -}); |