diff options
Diffstat (limited to 'spec/frontend/cycle_analytics/base_spec.js')
-rw-r--r-- | spec/frontend/cycle_analytics/base_spec.js | 265 |
1 files changed, 0 insertions, 265 deletions
diff --git a/spec/frontend/cycle_analytics/base_spec.js b/spec/frontend/cycle_analytics/base_spec.js deleted file mode 100644 index 013bea671a8..00000000000 --- a/spec/frontend/cycle_analytics/base_spec.js +++ /dev/null @@ -1,265 +0,0 @@ -import { GlLoadingIcon, GlEmptyState } from '@gitlab/ui'; -import { shallowMount } from '@vue/test-utils'; -import Vue from 'vue'; -import Vuex from 'vuex'; -import { extendedWrapper } from 'helpers/vue_test_utils_helper'; -import ValueStreamMetrics from '~/analytics/shared/components/value_stream_metrics.vue'; -import BaseComponent from '~/cycle_analytics/components/base.vue'; -import PathNavigation from '~/cycle_analytics/components/path_navigation.vue'; -import StageTable from '~/cycle_analytics/components/stage_table.vue'; -import ValueStreamFilters from '~/cycle_analytics/components/value_stream_filters.vue'; -import { NOT_ENOUGH_DATA_ERROR } from '~/cycle_analytics/constants'; -import initState from '~/cycle_analytics/store/state'; -import { - transformedProjectStagePathData, - selectedStage, - issueEvents, - createdBefore, - createdAfter, - currentGroup, - stageCounts, - initialPaginationState as pagination, -} from './mock_data'; - -const selectedStageEvents = issueEvents.events; -const noDataSvgPath = 'path/to/no/data'; -const noAccessSvgPath = 'path/to/no/access'; -const selectedStageCount = stageCounts[selectedStage.id]; -const fullPath = 'full/path/to/foo'; - -Vue.use(Vuex); - -let wrapper; - -const { id: groupId, path: groupPath } = currentGroup; -const defaultState = { - currentGroup, - createdBefore, - createdAfter, - stageCounts, - endpoints: { fullPath, groupId, groupPath }, -}; - -function createStore({ initialState = {}, initialGetters = {} }) { - return new Vuex.Store({ - state: { - ...initState(), - ...defaultState, - ...initialState, - }, - getters: { - pathNavigationData: () => transformedProjectStagePathData, - filterParams: () => ({ - created_after: createdAfter, - created_before: createdBefore, - }), - ...initialGetters, - }, - }); -} - -function createComponent({ initialState, initialGetters } = {}) { - return extendedWrapper( - shallowMount(BaseComponent, { - store: createStore({ initialState, initialGetters }), - propsData: { - noDataSvgPath, - noAccessSvgPath, - }, - stubs: { - StageTable, - }, - }), - ); -} - -const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon); -const findPathNavigation = () => wrapper.findComponent(PathNavigation); -const findFilters = () => wrapper.findComponent(ValueStreamFilters); -const findOverviewMetrics = () => wrapper.findComponent(ValueStreamMetrics); -const findStageTable = () => wrapper.findComponent(StageTable); -const findStageEvents = () => findStageTable().props('stageEvents'); -const findEmptyStageTitle = () => wrapper.findComponent(GlEmptyState).props('title'); -const findPagination = () => wrapper.findByTestId('vsa-stage-pagination'); - -const hasMetricsRequests = (reqs) => { - const foundReqs = findOverviewMetrics().props('requests'); - expect(foundReqs.length).toEqual(reqs.length); - expect(foundReqs.map(({ name }) => name)).toEqual(reqs); -}; - -describe('Value stream analytics component', () => { - beforeEach(() => { - wrapper = createComponent({ initialState: { selectedStage, selectedStageEvents, pagination } }); - }); - - afterEach(() => { - wrapper.destroy(); - wrapper = null; - }); - - it('renders the path navigation component', () => { - expect(findPathNavigation().exists()).toBe(true); - }); - - it('receives the stages formatted for the path navigation', () => { - expect(findPathNavigation().props('stages')).toBe(transformedProjectStagePathData); - }); - - it('renders the overview metrics', () => { - expect(findOverviewMetrics().exists()).toBe(true); - }); - - it('passes requests prop to the metrics component', () => { - hasMetricsRequests(['recent activity']); - }); - - it('renders the stage table', () => { - expect(findStageTable().exists()).toBe(true); - }); - - it('passes the selected stage count to the stage table', () => { - expect(findStageTable().props('stageCount')).toBe(selectedStageCount); - }); - - it('renders the stage table events', () => { - expect(findStageEvents()).toEqual(selectedStageEvents); - }); - - it('renders the filters', () => { - expect(findFilters().exists()).toBe(true); - }); - - it('displays the date range selector and hides the project selector', () => { - expect(findFilters().props()).toMatchObject({ - hasProjectFilter: false, - hasDateRangeFilter: true, - }); - }); - - it('passes the paths to the filter bar', () => { - expect(findFilters().props()).toEqual({ - groupId, - groupPath, - endDate: createdBefore, - hasDateRangeFilter: true, - hasProjectFilter: false, - selectedProjects: [], - startDate: createdAfter, - }); - }); - - it('does not render the loading icon', () => { - expect(findLoadingIcon().exists()).toBe(false); - }); - - it('renders pagination', () => { - expect(findPagination().exists()).toBe(true); - }); - - describe('with `cycleAnalyticsForGroups=true` license', () => { - beforeEach(() => { - wrapper = createComponent({ initialState: { features: { cycleAnalyticsForGroups: true } } }); - }); - - it('passes requests prop to the metrics component', () => { - hasMetricsRequests(['time summary', 'recent activity']); - }); - }); - - describe('isLoading = true', () => { - beforeEach(() => { - wrapper = createComponent({ - initialState: { isLoading: true }, - }); - }); - - it('renders the path navigation component with prop `loading` set to true', () => { - expect(findPathNavigation().props('loading')).toBe(true); - }); - - it('does not render the stage table', () => { - expect(findStageTable().exists()).toBe(false); - }); - - it('renders the overview metrics', () => { - expect(findOverviewMetrics().exists()).toBe(true); - }); - - it('renders the loading icon', () => { - expect(findLoadingIcon().exists()).toBe(true); - }); - }); - - describe('isLoadingStage = true', () => { - beforeEach(() => { - wrapper = createComponent({ - initialState: { isLoadingStage: true }, - }); - }); - - it('renders the stage table with a loading icon', () => { - const tableWrapper = findStageTable(); - expect(tableWrapper.exists()).toBe(true); - expect(tableWrapper.findComponent(GlLoadingIcon).exists()).toBe(true); - }); - - it('renders the path navigation loading state', () => { - expect(findPathNavigation().props('loading')).toBe(true); - }); - }); - - describe('isEmptyStage = true', () => { - const emptyStageParams = { - isEmptyStage: true, - selectedStage: { ...selectedStage, emptyStageText: 'This stage is empty' }, - }; - beforeEach(() => { - wrapper = createComponent({ initialState: emptyStageParams }); - }); - - it('renders the empty stage with `Not enough data` message', () => { - expect(findEmptyStageTitle()).toBe(NOT_ENOUGH_DATA_ERROR); - }); - - describe('with a selectedStageError', () => { - beforeEach(() => { - wrapper = createComponent({ - initialState: { - ...emptyStageParams, - selectedStageError: 'There is too much data to calculate', - }, - }); - }); - - it('renders the empty stage with `There is too much data to calculate` message', () => { - expect(findEmptyStageTitle()).toBe('There is too much data to calculate'); - }); - }); - }); - - describe('without a selected stage', () => { - beforeEach(() => { - wrapper = createComponent({ - initialGetters: { pathNavigationData: () => [] }, - initialState: { selectedStage: null, isEmptyStage: true }, - }); - }); - - it('renders the stage table', () => { - expect(findStageTable().exists()).toBe(true); - }); - - it('does not render the path navigation', () => { - expect(findPathNavigation().exists()).toBe(false); - }); - - it('does not render the stage table events', () => { - expect(findStageEvents()).toHaveLength(0); - }); - - it('does not render the loading icon', () => { - expect(findLoadingIcon().exists()).toBe(false); - }); - }); -}); |