diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-12-05 21:10:06 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-12-05 21:10:06 +0300 |
commit | c8419b0227e069a7403f41589f1d0ef690e762f1 (patch) | |
tree | 7009382402811f9e32b448f68f7f90912237aa03 /spec/frontend | |
parent | 6659634b2bdc3ba362574541985c6852ad1574a4 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
3 files changed, 212 insertions, 0 deletions
diff --git a/spec/frontend/__helpers__/mock_observability_client.js b/spec/frontend/__helpers__/mock_observability_client.js index 82425aa2842..a65b5233b73 100644 --- a/spec/frontend/__helpers__/mock_observability_client.js +++ b/spec/frontend/__helpers__/mock_observability_client.js @@ -7,6 +7,7 @@ export function createMockClient() { servicesUrl: 'services-url', operationsUrl: 'operations-url', metricsUrl: 'metrics-url', + metricsSearchUrl: 'metrics-search-url', }); Object.getOwnPropertyNames(mockClient) diff --git a/spec/frontend/groups_projects/components/more_actions_dropdown_spec.js b/spec/frontend/groups_projects/components/more_actions_dropdown_spec.js new file mode 100644 index 00000000000..1bcff8a44be --- /dev/null +++ b/spec/frontend/groups_projects/components/more_actions_dropdown_spec.js @@ -0,0 +1,173 @@ +import { GlDisclosureDropdownItem, GlDisclosureDropdown } from '@gitlab/ui'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import moreActionsDropdown from '~/groups_projects/components/more_actions_dropdown.vue'; + +describe('moreActionsDropdown', () => { + let wrapper; + + const createComponent = ({ provideData = {}, propsData = {} } = {}) => { + wrapper = shallowMountExtended(moreActionsDropdown, { + provide: { + isGroup: false, + id: 1, + leavePath: '', + leaveConfirmMessage: '', + withdrawPath: '', + withdrawConfirmMessage: '', + requestAccessPath: '', + ...provideData, + }, + propsData, + stubs: { + GlDisclosureDropdownItem, + }, + }); + }; + + const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown); + const showDropdown = () => { + findDropdown().vm.$emit('show'); + }; + + describe('copy id', () => { + describe('project namespace type', () => { + beforeEach(async () => { + createComponent({ + provideData: { + id: 22, + }, + }); + await showDropdown(); + }); + + it('has correct test id `copy-project-id`', () => { + expect(wrapper.findByTestId('copy-project-id').exists()).toBe(true); + expect(wrapper.findByTestId('copy-group-id').exists()).toBe(false); + }); + + it('renders copy project id with correct id', () => { + expect(wrapper.findByTestId('copy-project-id').text()).toBe('Copy project ID: 22'); + }); + }); + + describe('group namespace type', () => { + beforeEach(async () => { + createComponent({ + provideData: { + isGroup: true, + id: 11, + }, + }); + await showDropdown(); + }); + + it('has correct test id `copy-group-id`', () => { + expect(wrapper.findByTestId('copy-project-id').exists()).toBe(false); + expect(wrapper.findByTestId('copy-group-id').exists()).toBe(true); + }); + + it('renders copy group id with correct id', () => { + expect(wrapper.findByTestId('copy-group-id').text()).toBe('Copy group ID: 11'); + }); + }); + }); + + describe('request access', () => { + it('does not render request access link', async () => { + createComponent(); + await showDropdown(); + + expect(wrapper.findByTestId('request-access-link').exists()).toBe(false); + }); + + it('renders request access link', async () => { + createComponent({ + provideData: { + requestAccessPath: 'http://request.path/path', + }, + }); + await showDropdown(); + + expect(wrapper.findByTestId('request-access-link').text()).toBe('Request Access'); + expect(wrapper.findByTestId('request-access-link').attributes('href')).toBe( + 'http://request.path/path', + ); + }); + }); + + describe('withdraw access', () => { + it('does not render withdraw access link', async () => { + createComponent(); + await showDropdown(); + + expect(wrapper.findByTestId('withdraw-access-link').exists()).toBe(false); + }); + + it('renders withdraw access link', async () => { + createComponent({ + provideData: { + withdrawPath: 'http://withdraw.path/path', + }, + }); + await showDropdown(); + + expect(wrapper.findByTestId('withdraw-access-link').text()).toBe('Withdraw Access Request'); + expect(wrapper.findByTestId('withdraw-access-link').attributes('href')).toBe( + 'http://withdraw.path/path', + ); + }); + }); + + describe('leave access', () => { + it('does not render leave link', async () => { + createComponent(); + await showDropdown(); + + expect(wrapper.findByTestId('leave-project-link').exists()).toBe(false); + }); + + it('renders leave link', async () => { + createComponent({ + provideData: { + leavePath: 'http://leave.path/path', + }, + }); + await showDropdown(); + + expect(wrapper.findByTestId('leave-project-link').exists()).toBe(true); + expect(wrapper.findByTestId('leave-project-link').text()).toBe('Leave project'); + expect(wrapper.findByTestId('leave-project-link').attributes('href')).toBe( + 'http://leave.path/path', + ); + }); + + describe('when `isGroup` is set to `false`', () => { + it('use testid `leave-project-link`', async () => { + createComponent({ + provideData: { + leavePath: 'http://leave.path/path', + }, + }); + await showDropdown(); + + expect(wrapper.findByTestId('leave-project-link').exists()).toBe(true); + expect(wrapper.findByTestId('leave-group-link').exists()).toBe(false); + }); + }); + + describe('when `isGroup` is set to `true`', () => { + it('use testid `leave-group-link`', async () => { + createComponent({ + provideData: { + isGroup: true, + leavePath: 'http://leave.path/path', + }, + }); + await showDropdown(); + + expect(wrapper.findByTestId('leave-project-link').exists()).toBe(false); + expect(wrapper.findByTestId('leave-group-link').exists()).toBe(true); + }); + }); + }); +}); diff --git a/spec/frontend/observability/client_spec.js b/spec/frontend/observability/client_spec.js index 9b8f100785b..e7b68a2346e 100644 --- a/spec/frontend/observability/client_spec.js +++ b/spec/frontend/observability/client_spec.js @@ -18,6 +18,7 @@ describe('buildClient', () => { const servicesUrl = 'https://example.com/services'; const operationsUrl = 'https://example.com/services/$SERVICE_NAME$/operations'; const metricsUrl = 'https://example.com/metrics'; + const metricsSearchUrl = 'https://example.com/metrics/search'; const FETCHING_TRACES_ERROR = 'traces are missing/invalid in the response'; const apiConfig = { @@ -26,6 +27,7 @@ describe('buildClient', () => { servicesUrl, operationsUrl, metricsUrl, + metricsSearchUrl, }; const getQueryParam = () => decodeURIComponent(axios.get.mock.calls[0][1].params.toString()); @@ -531,4 +533,40 @@ describe('buildClient', () => { expectErrorToBeReported(new Error(FETCHING_METRICS_ERROR)); }); }); + + describe('fetchMetric', () => { + it('fetches the metric from the API', async () => { + const data = { results: [] }; + axiosMock.onGet(metricsSearchUrl).reply(200, data); + + const result = await client.fetchMetric('name', 'type'); + + expect(axios.get).toHaveBeenCalledTimes(1); + expect(axios.get).toHaveBeenCalledWith(metricsSearchUrl, { + withCredentials: true, + params: new URLSearchParams({ mname: 'name', mtype: 'type' }), + }); + expect(result).toEqual(data.results); + }); + + it('rejects if results is missing from the response', async () => { + axiosMock.onGet(metricsSearchUrl).reply(200, {}); + const e = 'metrics are missing/invalid in the response'; + + await expect(client.fetchMetric('name', 'type')).rejects.toThrow(e); + expectErrorToBeReported(new Error(e)); + }); + + it('rejects if metric name is missing', async () => { + const e = 'fetchMetric() - metric name is required.'; + await expect(client.fetchMetric()).rejects.toThrow(e); + expectErrorToBeReported(new Error(e)); + }); + + it('rejects if metric type is missing', async () => { + const e = 'fetchMetric() - metric type is required.'; + await expect(client.fetchMetric('name')).rejects.toThrow(e); + expectErrorToBeReported(new Error(e)); + }); + }); }); |