summaryrefslogtreecommitdiff
path: root/spec/frontend/monitoring/components/dashboard_panel_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/monitoring/components/dashboard_panel_spec.js')
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_spec.js111
1 files changed, 98 insertions, 13 deletions
diff --git a/spec/frontend/monitoring/components/dashboard_panel_spec.js b/spec/frontend/monitoring/components/dashboard_panel_spec.js
index 693818aa55a..fb96bcc042f 100644
--- a/spec/frontend/monitoring/components/dashboard_panel_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_panel_spec.js
@@ -2,23 +2,23 @@ import Vuex from 'vuex';
import { shallowMount } from '@vue/test-utils';
import AxiosMockAdapter from 'axios-mock-adapter';
import { setTestTimeout } from 'helpers/timeout';
+import { GlNewDropdownItem as GlDropdownItem } from '@gitlab/ui';
import invalidUrl from '~/lib/utils/invalid_url';
import axios from '~/lib/utils/axios_utils';
-import { GlNewDropdownItem as GlDropdownItem } from '@gitlab/ui';
import AlertWidget from '~/monitoring/components/alert_widget.vue';
import DashboardPanel from '~/monitoring/components/dashboard_panel.vue';
import {
+ mockAlert,
mockLogsHref,
mockLogsPath,
mockNamespace,
mockNamespacedData,
mockTimeRange,
- graphDataPrometheusQueryRangeMultiTrack,
barMockData,
} from '../mock_data';
import { dashboardProps, graphData, graphDataEmpty } from '../fixture_data';
-import { anomalyGraphData, singleStatGraphData } from '../graph_data';
+import { anomalyGraphData, singleStatGraphData, heatmapGraphData } from '../graph_data';
import { panelTypes } from '~/monitoring/constants';
@@ -56,9 +56,10 @@ describe('Dashboard Panel', () => {
const findCtxMenu = () => wrapper.find({ ref: 'contextualMenu' });
const findMenuItems = () => wrapper.findAll(GlDropdownItem);
const findMenuItemByText = text => findMenuItems().filter(i => i.text() === text);
+ const findAlertsWidget = () => wrapper.find(AlertWidget);
- const createWrapper = (props, options) => {
- wrapper = shallowMount(DashboardPanel, {
+ const createWrapper = (props, { mountFn = shallowMount, ...options } = {}) => {
+ wrapper = mountFn(DashboardPanel, {
propsData: {
graphData,
settingsPath: dashboardProps.settingsPath,
@@ -79,6 +80,9 @@ describe('Dashboard Panel', () => {
});
};
+ const setMetricsSavedToDb = val =>
+ monitoringDashboard.getters.metricsSavedToDb.mockReturnValue(val);
+
beforeEach(() => {
setTestTimeout(1000);
@@ -235,7 +239,7 @@ describe('Dashboard Panel', () => {
${anomalyGraphData()} | ${MonitorAnomalyChart} | ${false}
${dataWithType(panelTypes.COLUMN)} | ${MonitorColumnChart} | ${false}
${dataWithType(panelTypes.STACKED_COLUMN)} | ${MonitorStackedColumnChart} | ${false}
- ${graphDataPrometheusQueryRangeMultiTrack} | ${MonitorHeatmapChart} | ${false}
+ ${heatmapGraphData()} | ${MonitorHeatmapChart} | ${false}
${barMockData} | ${MonitorBarChart} | ${false}
`('when $data.type data is provided', ({ data, component, hasCtxMenu }) => {
const attrs = { attr1: 'attr1Value', attr2: 'attr2Value' };
@@ -255,6 +259,35 @@ describe('Dashboard Panel', () => {
});
});
});
+
+ describe('computed', () => {
+ describe('fixedCurrentTimeRange', () => {
+ it('returns fixed time for valid time range', () => {
+ state.timeRange = mockTimeRange;
+ return wrapper.vm.$nextTick(() => {
+ expect(findTimeChart().props('timeRange')).toEqual(
+ expect.objectContaining({
+ start: expect.any(String),
+ end: expect.any(String),
+ }),
+ );
+ });
+ });
+
+ it.each`
+ input | output
+ ${''} | ${{}}
+ ${undefined} | ${{}}
+ ${null} | ${{}}
+ ${'2020-12-03'} | ${{}}
+ `('returns $output for invalid input like $input', ({ input, output }) => {
+ state.timeRange = input;
+ return wrapper.vm.$nextTick(() => {
+ expect(findTimeChart().props('timeRange')).toEqual(output);
+ });
+ });
+ });
+ });
});
describe('Edit custom metric dropdown item', () => {
@@ -444,7 +477,7 @@ describe('Dashboard Panel', () => {
describe('csvText', () => {
it('converts metrics data from json to csv', () => {
- const header = `timestamp,${graphData.y_label}`;
+ const header = `timestamp,"${graphData.y_label} > ${graphData.metrics[0].label}"`;
const data = graphData.metrics[0].result[0].values;
const firstRow = `${data[0][0]},${data[0][1]}`;
const secondRow = `${data[1][0]},${data[1][1]}`;
@@ -523,7 +556,7 @@ describe('Dashboard Panel', () => {
});
it('displays a heatmap in local timezone', () => {
- createWrapper({ graphData: graphDataPrometheusQueryRangeMultiTrack });
+ createWrapper({ graphData: heatmapGraphData() });
expect(wrapper.find(MonitorHeatmapChart).props('timezone')).toBe('LOCAL');
});
@@ -538,7 +571,7 @@ describe('Dashboard Panel', () => {
});
it('displays a heatmap with UTC', () => {
- createWrapper({ graphData: graphDataPrometheusQueryRangeMultiTrack });
+ createWrapper({ graphData: heatmapGraphData() });
expect(wrapper.find(MonitorHeatmapChart).props('timezone')).toBe('UTC');
});
});
@@ -573,10 +606,6 @@ describe('Dashboard Panel', () => {
});
describe('panel alerts', () => {
- const setMetricsSavedToDb = val =>
- monitoringDashboard.getters.metricsSavedToDb.mockReturnValue(val);
- const findAlertsWidget = () => wrapper.find(AlertWidget);
-
beforeEach(() => {
mockGetterReturnValue('metricsSavedToDb', []);
@@ -702,4 +731,60 @@ describe('Dashboard Panel', () => {
expect(findManageLinksItem().exists()).toBe(false);
});
});
+
+ describe('Runbook url', () => {
+ const findRunbookLinks = () => wrapper.findAll('[data-testid="runbookLink"]');
+ const { metricId } = graphData.metrics[0];
+ const { alert_path: alertPath } = mockAlert;
+
+ const mockRunbookAlert = {
+ ...mockAlert,
+ metricId,
+ };
+
+ beforeEach(() => {
+ mockGetterReturnValue('metricsSavedToDb', []);
+ });
+
+ it('does not show a runbook link when alerts are not present', () => {
+ createWrapper();
+
+ expect(findRunbookLinks().length).toBe(0);
+ });
+
+ describe('when alerts are present', () => {
+ beforeEach(() => {
+ setMetricsSavedToDb([metricId]);
+
+ createWrapper({
+ alertsEndpoint: '/endpoint',
+ prometheusAlertsAvailable: true,
+ });
+ });
+
+ it('does not show a runbook link when a runbook is not set', async () => {
+ findAlertsWidget().vm.$emit('setAlerts', alertPath, {
+ ...mockRunbookAlert,
+ runbookUrl: '',
+ });
+
+ await wrapper.vm.$nextTick();
+
+ expect(findRunbookLinks().length).toBe(0);
+ });
+
+ it('shows a runbook link when a runbook is set', async () => {
+ findAlertsWidget().vm.$emit('setAlerts', alertPath, mockRunbookAlert);
+
+ await wrapper.vm.$nextTick();
+
+ expect(findRunbookLinks().length).toBe(1);
+ expect(
+ findRunbookLinks()
+ .at(0)
+ .attributes('href'),
+ ).toBe(invalidUrl);
+ });
+ });
+ });
});