diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-06 06:10:24 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-06 06:10:24 +0300 |
commit | 66089ccf1ab842eb5f7608502eaf8d2642e350b5 (patch) | |
tree | ac7da536104695d325c2fe9764b24524d3431213 /spec/frontend/analytics | |
parent | 5eac1a5d627e9cdfa02b4dfd9d39d693c5ce65b8 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend/analytics')
4 files changed, 71 insertions, 1 deletions
diff --git a/spec/frontend/analytics/cycle_analytics/base_spec.js b/spec/frontend/analytics/cycle_analytics/base_spec.js index 58588ff49ce..f27c3746c76 100644 --- a/spec/frontend/analytics/cycle_analytics/base_spec.js +++ b/spec/frontend/analytics/cycle_analytics/base_spec.js @@ -157,6 +157,10 @@ describe('Value stream analytics component', () => { expect(findPagination().exists()).toBe(true); }); + it('does not render a link to the value streams dashboard', () => { + expect(findOverviewMetrics().props('dashboardsPath')).toBeNull(); + }); + describe('with `cycleAnalyticsForGroups=true` license', () => { beforeEach(() => { wrapper = createComponent({ initialState: { features: { cycleAnalyticsForGroups: true } } }); @@ -167,6 +171,23 @@ describe('Value stream analytics component', () => { }); }); + describe('with `groupAnalyticsDashboardsPage=true` and `cycleAnalyticsForGroups=true` license', () => { + beforeEach(() => { + wrapper = createComponent({ + initialState: { + features: { groupAnalyticsDashboardsPage: true, cycleAnalyticsForGroups: true }, + }, + }); + }); + + it('renders a link to the value streams dashboard', () => { + expect(findOverviewMetrics().props('dashboardsPath')).toBeDefined(); + expect(findOverviewMetrics().props('dashboardsPath')).toBe( + '/groups/foo/-/analytics/dashboards?query=full/path/to/foo', + ); + }); + }); + describe('isLoading = true', () => { beforeEach(() => { wrapper = createComponent({ diff --git a/spec/frontend/analytics/cycle_analytics/utils_spec.js b/spec/frontend/analytics/cycle_analytics/utils_spec.js index fe412bf7498..a79abff1dff 100644 --- a/spec/frontend/analytics/cycle_analytics/utils_spec.js +++ b/spec/frontend/analytics/cycle_analytics/utils_spec.js @@ -164,7 +164,7 @@ describe('Value stream analytics utils', () => { ...rawData, gon: { licensed_features: fakeFeatures }, }); - expect(res.features).toEqual(fakeFeatures); + expect(res.features).toMatchObject(fakeFeatures); }); }); }); diff --git a/spec/frontend/analytics/cycle_analytics/value_stream_metrics_spec.js b/spec/frontend/analytics/cycle_analytics/value_stream_metrics_spec.js index 948dc5c9be2..b96580eeb2d 100644 --- a/spec/frontend/analytics/cycle_analytics/value_stream_metrics_spec.js +++ b/spec/frontend/analytics/cycle_analytics/value_stream_metrics_spec.js @@ -8,6 +8,7 @@ import { METRIC_TYPE_SUMMARY } from '~/api/analytics_api'; import { VSA_METRICS_GROUPS, METRICS_POPOVER_CONTENT } from '~/analytics/shared/constants'; import { prepareTimeMetricsData } from '~/analytics/shared/utils'; import MetricTile from '~/analytics/shared/components/metric_tile.vue'; +import ValueStreamsDashboardLink from '~/analytics/shared/components/value_streams_dashboard_link.vue'; import { createAlert } from '~/flash'; import { group } from './mock_data'; @@ -37,6 +38,7 @@ describe('ValueStreamMetrics', () => { }); }; + const findVSDLink = () => wrapper.findComponent(ValueStreamsDashboardLink); const findMetrics = () => wrapper.findAllComponents(MetricTile); const findMetricsGroups = () => wrapper.findAllByTestId('vsa-metrics-group'); @@ -168,6 +170,25 @@ describe('ValueStreamMetrics', () => { }); }); + describe('Value Streams Dashboard Link', () => { + it('will render when a dashboardsPath is set', async () => { + wrapper = createComponent({ groupBy: VSA_METRICS_GROUPS, dashboardsPath: 'fake-group-path' }); + await waitForPromises(); + + const vsdLink = findVSDLink(); + + expect(vsdLink.exists()).toBe(true); + expect(vsdLink.props()).toEqual({ requestPath: 'fake-group-path' }); + }); + + it('does not render without a dashboardsPath', async () => { + wrapper = createComponent({ groupBy: VSA_METRICS_GROUPS }); + await waitForPromises(); + + expect(findVSDLink().exists()).toBe(false); + }); + }); + describe('with a request failing', () => { beforeEach(async () => { mockGetValueStreamSummaryMetrics = jest.fn().mockRejectedValue(); diff --git a/spec/frontend/analytics/shared/utils_spec.js b/spec/frontend/analytics/shared/utils_spec.js index b48e2d971b5..0b4346de9dc 100644 --- a/spec/frontend/analytics/shared/utils_spec.js +++ b/spec/frontend/analytics/shared/utils_spec.js @@ -5,6 +5,7 @@ import { extractPaginationQueryParameters, getDataZoomOption, prepareTimeMetricsData, + generateValueStreamsDashboardLink, } from '~/analytics/shared/utils'; import { slugify } from '~/lib/utils/text_utility'; import { objectToQuery } from '~/lib/utils/url_utility'; @@ -212,3 +213,30 @@ describe('prepareTimeMetricsData', () => { ]); }); }); + +describe('generateValueStreamsDashboardLink', () => { + it.each` + groupPath | projectPaths | result + ${''} | ${[]} | ${''} + ${'fake-group'} | ${[]} | ${'/groups/fake-group/-/analytics/dashboards'} + ${'fake-group'} | ${['fake-path/project_1']} | ${'/groups/fake-group/-/analytics/dashboards?query=fake-path/project_1'} + ${'fake-group'} | ${['fake-path/project_1', 'fake-path/project_2']} | ${'/groups/fake-group/-/analytics/dashboards?query=fake-path/project_1,fake-path/project_2'} + `( + 'generates the dashboard link when groupPath=$groupPath and projectPaths=$projectPaths', + ({ groupPath, projectPaths, result }) => { + expect(generateValueStreamsDashboardLink(groupPath, projectPaths)).toBe(result); + }, + ); + + describe('with a relative url rool set', () => { + beforeEach(() => { + gon.relative_url_root = '/foobar'; + }); + + it('with includes a relative path if one is set', () => { + expect(generateValueStreamsDashboardLink('fake-path', ['project_1'])).toBe( + '/foobar/groups/fake-path/-/analytics/dashboards?query=project_1', + ); + }); + }); +}); |