diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-14 18:11:29 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-14 18:11:29 +0300 |
commit | 2d80ade70258fa78e9ada2e8b3055129a69654f3 (patch) | |
tree | a23e474b4cc5184db445a6121f9eb75c0653fe5f /spec/frontend/work_items | |
parent | 61a82b8ec062d6f122dadd38783c7754cef7ce2b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend/work_items')
6 files changed, 111 insertions, 21 deletions
diff --git a/spec/frontend/work_items/components/work_item_detail_spec.js b/spec/frontend/work_items/components/work_item_detail_spec.js index 6dbca7086cc..26777b57797 100644 --- a/spec/frontend/work_items/components/work_item_detail_spec.js +++ b/spec/frontend/work_items/components/work_item_detail_spec.js @@ -28,9 +28,9 @@ import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.grap import workItemDatesSubscription from '~/work_items/graphql/work_item_dates.subscription.graphql'; import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql'; import workItemAssigneesSubscription from '~/work_items/graphql/work_item_assignees.subscription.graphql'; +import workItemMilestoneSubscription from '~/work_items/graphql/work_item_milestone.subscription.graphql'; import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; import updateWorkItemTaskMutation from '~/work_items/graphql/update_work_item_task.mutation.graphql'; -import { config } from '~/graphql_shared/issuable_client'; import { useLocalStorageSpy } from 'helpers/local_storage_helper'; import { mockParent, @@ -38,6 +38,7 @@ import { workItemResponseFactory, workItemTitleSubscriptionResponse, workItemAssigneesSubscriptionResponse, + workItemMilestoneSubscriptionResponse, projectWorkItemResponse, } from '../mock_data'; @@ -57,6 +58,9 @@ describe('WorkItemDetail component', () => { const successByIidHandler = jest.fn().mockResolvedValue(projectWorkItemResponse); const datesSubscriptionHandler = jest.fn().mockResolvedValue(workItemDatesSubscriptionResponse); const titleSubscriptionHandler = jest.fn().mockResolvedValue(workItemTitleSubscriptionResponse); + const milestoneSubscriptionHandler = jest + .fn() + .mockResolvedValue(workItemMilestoneSubscriptionResponse); const assigneesSubscriptionHandler = jest .fn() .mockResolvedValue(workItemAssigneesSubscriptionResponse); @@ -88,7 +92,6 @@ describe('WorkItemDetail component', () => { subscriptionHandler = titleSubscriptionHandler, confidentialityMock = [updateWorkItemMutation, jest.fn()], error = undefined, - includeWidgets = false, workItemsMvc2Enabled = false, fetchByIid = false, iidPathQueryParam = undefined, @@ -98,18 +101,13 @@ describe('WorkItemDetail component', () => { [workItemTitleSubscription, subscriptionHandler], [workItemDatesSubscription, datesSubscriptionHandler], [workItemAssigneesSubscription, assigneesSubscriptionHandler], + [workItemMilestoneSubscription, milestoneSubscriptionHandler], [workItemByIidQuery, successByIidHandler], confidentialityMock, ]; wrapper = shallowMount(WorkItemDetail, { - apolloProvider: createMockApollo( - handlers, - {}, - { - typePolicies: includeWidgets ? config.cacheConfig.typePolicies : {}, - }, - ), + apolloProvider: createMockApollo(handlers), propsData: { isModal, workItemId, iid: '1' }, data() { return { @@ -559,15 +557,41 @@ describe('WorkItemDetail component', () => { describe('milestone widget', () => { it.each` - description | includeWidgets | exists - ${'renders when widget is returned from API'} | ${true} | ${true} - ${'does not render when widget is not returned from API'} | ${false} | ${false} - `('$description', async ({ includeWidgets, exists }) => { - createComponent({ includeWidgets, workItemsMvc2Enabled: true }); + description | milestoneWidgetPresent | exists + ${'renders when widget is returned from API'} | ${true} | ${true} + ${'does not render when widget is not returned from API'} | ${false} | ${false} + `('$description', async ({ milestoneWidgetPresent, exists }) => { + const response = workItemResponseFactory({ milestoneWidgetPresent }); + const handler = jest.fn().mockResolvedValue(response); + createComponent({ handler, workItemsMvc2Enabled: true }); await waitForPromises(); expect(findWorkItemMilestone().exists()).toBe(exists); }); + + describe('milestone subscription', () => { + describe('when the milestone widget exists', () => { + it('calls the milestone subscription', async () => { + createComponent(); + await waitForPromises(); + + expect(milestoneSubscriptionHandler).toHaveBeenCalledWith({ + issuableId: workItemQueryResponse.data.workItem.id, + }); + }); + }); + + describe('when the assignees widget does not exist', () => { + it('does not call the milestone subscription', async () => { + const response = workItemResponseFactory({ milestoneWidgetPresent: false }); + const handler = jest.fn().mockResolvedValue(response); + createComponent({ handler }); + await waitForPromises(); + + expect(milestoneSubscriptionHandler).not.toHaveBeenCalled(); + }); + }); + }); }); describe('work item information', () => { diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js index c790309fde5..60866aa98b1 100644 --- a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js +++ b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js @@ -93,7 +93,7 @@ describe('WorkItemLinksForm', () => { }); it('creates child task in confidential parent', async () => { - await createComponent({ parentConfidential: true }); + await createComponent({ parentConfidential: true, workItemsMvc2Enabled: true }); findInput().vm.$emit('input', 'Create confidential task'); diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js index 6961996f912..30ccd68d276 100644 --- a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js +++ b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js @@ -41,6 +41,13 @@ const issueDetailsResponse = (confidential = false) => ({ }, __typename: 'Iteration', }, + milestone: { + dueDate: null, + expired: false, + id: 'gid://gitlab/Milestone/28', + title: 'v2.0', + __typename: 'Milestone', + }, __typename: 'Issue', }, __typename: 'Project', diff --git a/spec/frontend/work_items/components/work_item_milestone_spec.js b/spec/frontend/work_items/components/work_item_milestone_spec.js index e5713efdbec..60ba2b55f76 100644 --- a/spec/frontend/work_items/components/work_item_milestone_spec.js +++ b/spec/frontend/work_items/components/work_item_milestone_spec.js @@ -22,8 +22,14 @@ import { mockMilestoneWidgetResponse, workItemResponseFactory, updateWorkItemMutationErrorResponse, + workItemMilestoneSubscriptionResponse, + projectWorkItemResponse, + updateWorkItemMutationResponse, } from 'jest/work_items/mock_data'; import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; +import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql'; +import workItemMilestoneSubscription from '~/work_items/graphql/work_item_milestone.subscription.graphql'; +import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; describe('WorkItemMilestone component', () => { Vue.use(VueApollo); @@ -47,6 +53,8 @@ describe('WorkItemMilestone component', () => { const findInputGroup = () => wrapper.findComponent(GlFormGroup); const workItemQueryResponse = workItemResponseFactory({ canUpdate: true, canDelete: true }); + const workItemQueryHandler = jest.fn().mockResolvedValue(workItemQueryResponse); + const workItemByIidResponseHandler = jest.fn().mockResolvedValue(projectWorkItemResponse); const networkResolvedValue = new Error(); @@ -54,6 +62,12 @@ describe('WorkItemMilestone component', () => { const successSearchWithNoMatchingMilestones = jest .fn() .mockResolvedValue(projectMilestonesResponseWithNoMilestones); + const milestoneSubscriptionHandler = jest + .fn() + .mockResolvedValue(workItemMilestoneSubscriptionResponse); + const successUpdateWorkItemMutationHandler = jest + .fn() + .mockResolvedValue(updateWorkItemMutationResponse); const showDropdown = () => { findDropdown().vm.$emit('shown'); @@ -67,9 +81,17 @@ describe('WorkItemMilestone component', () => { canUpdate = true, milestone = mockMilestoneWidgetResponse, searchQueryHandler = successSearchQueryHandler, + fetchByIid = false, + mutationHandler = successUpdateWorkItemMutationHandler, } = {}) => { const apolloProvider = createMockApollo( - [[projectMilestonesQuery, searchQueryHandler]], + [ + [workItemQuery, workItemQueryHandler], + [workItemMilestoneSubscription, milestoneSubscriptionHandler], + [projectMilestonesQuery, searchQueryHandler], + [updateWorkItemMutation, mutationHandler], + [workItemByIidQuery, workItemByIidResponseHandler], + ], resolvers, { typePolicies: config.cacheConfig.typePolicies, @@ -92,6 +114,10 @@ describe('WorkItemMilestone component', () => { workItemId, workItemType, fullPath, + queryVariables: { + id: workItemId, + }, + fetchByIid, }, stubs: { GlDropdown, diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js index b66e250f428..0099dce77b3 100644 --- a/spec/frontend/work_items/mock_data.js +++ b/spec/frontend/work_items/mock_data.js @@ -301,11 +301,12 @@ export const workItemResponseFactory = ({ milestoneWidgetPresent ? { __typename: 'WorkItemWidgetMilestone', - dueDate: null, - expired: false, - id: 'gid://gitlab/Milestone/30', - title: 'v4.0', type: 'MILESTONE', + milestone: { + expired: false, + id: 'gid://gitlab/Milestone/30', + title: 'v4.0', + }, } : { type: 'MOCK TYPE' }, { @@ -610,6 +611,25 @@ export const workItemIterationSubscriptionResponse = { }, }; +export const workItemMilestoneSubscriptionResponse = { + data: { + issuableMilestoneUpdated: { + id: 'gid://gitlab/WorkItem/1', + widgets: [ + { + __typename: 'WorkItemWidgetMilestone', + type: 'MILESTONE', + milestone: { + id: 'gid://gitlab/Milestone/1125', + expired: false, + title: 'Milestone title', + }, + }, + ], + }, + }, +}; + export const workItemHierarchyEmptyResponse = { data: { workItem: { @@ -1116,7 +1136,7 @@ export const groupIterationsResponseWithNoIterations = { }; export const mockMilestoneWidgetResponse = { - dueDate: null, + state: 'active', expired: false, id: 'gid://gitlab/Milestone/30', title: 'v4.0', diff --git a/spec/frontend/work_items/router_spec.js b/spec/frontend/work_items/router_spec.js index eb81c38f889..982f9f71f9e 100644 --- a/spec/frontend/work_items/router_spec.js +++ b/spec/frontend/work_items/router_spec.js @@ -10,6 +10,8 @@ import { workItemTitleSubscriptionResponse, workItemWeightSubscriptionResponse, workItemLabelsSubscriptionResponse, + workItemMilestoneSubscriptionResponse, + workItemDescriptionSubscriptionResponse, } from 'jest/work_items/mock_data'; import App from '~/work_items/components/app.vue'; import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; @@ -17,6 +19,8 @@ import workItemDatesSubscription from '~/work_items/graphql/work_item_dates.subs import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql'; import workItemAssigneesSubscription from '~/work_items/graphql/work_item_assignees.subscription.graphql'; import workItemLabelsSubscription from 'ee_else_ce/work_items/graphql/work_item_labels.subscription.graphql'; +import workItemMilestoneSubscription from '~/work_items/graphql/work_item_milestone.subscription.graphql'; +import workItemDescriptionSubscription from '~/work_items/graphql/work_item_description.subscription.graphql'; import CreateWorkItem from '~/work_items/pages/create_work_item.vue'; import WorkItemsRoot from '~/work_items/pages/work_item_root.vue'; import { createRouter } from '~/work_items/router'; @@ -34,6 +38,12 @@ describe('Work items router', () => { .fn() .mockResolvedValue(workItemAssigneesSubscriptionResponse); const labelsSubscriptionHandler = jest.fn().mockResolvedValue(workItemLabelsSubscriptionResponse); + const milestoneSubscriptionHandler = jest + .fn() + .mockResolvedValue(workItemMilestoneSubscriptionResponse); + const descriptionSubscriptionHandler = jest + .fn() + .mockResolvedValue(workItemDescriptionSubscriptionResponse); const createComponent = async (routeArg) => { const router = createRouter('/work_item'); @@ -47,6 +57,8 @@ describe('Work items router', () => { [workItemTitleSubscription, titleSubscriptionHandler], [workItemAssigneesSubscription, assigneesSubscriptionHandler], [workItemLabelsSubscription, labelsSubscriptionHandler], + [workItemMilestoneSubscription, milestoneSubscriptionHandler], + [workItemDescriptionSubscription, descriptionSubscriptionHandler], ]; if (IS_EE) { @@ -59,6 +71,7 @@ describe('Work items router', () => { provide: { fullPath: 'full-path', issuesListPath: 'full-path/-/issues', + hasIssueWeightsFeature: false, }, }); }; |