diff options
Diffstat (limited to 'spec/frontend/releases/stores/modules')
4 files changed, 330 insertions, 303 deletions
diff --git a/spec/frontend/releases/stores/modules/detail/actions_spec.js b/spec/frontend/releases/stores/modules/detail/actions_spec.js index b116d601ca4..688ec4c0a50 100644 --- a/spec/frontend/releases/stores/modules/detail/actions_spec.js +++ b/spec/frontend/releases/stores/modules/detail/actions_spec.js @@ -1,18 +1,16 @@ -import axios from 'axios'; -import MockAdapter from 'axios-mock-adapter'; import { cloneDeep } from 'lodash'; import { getJSONFixture } from 'helpers/fixtures'; import testAction from 'helpers/vuex_action_helper'; -import api from '~/api'; import { deprecatedCreateFlash as createFlash } from '~/flash'; -import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; -import httpStatus from '~/lib/utils/http_status'; import { redirectTo } from '~/lib/utils/url_utility'; import { ASSET_LINK_TYPE } from '~/releases/constants'; +import createReleaseAssetLinkMutation from '~/releases/graphql/mutations/create_release_link.mutation.graphql'; +import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_release_link.mutation.graphql'; +import updateReleaseMutation from '~/releases/graphql/mutations/update_release.mutation.graphql'; import * as actions from '~/releases/stores/modules/edit_new/actions'; import * as types from '~/releases/stores/modules/edit_new/mutation_types'; import createState from '~/releases/stores/modules/edit_new/state'; -import { releaseToApiJson, apiJsonToRelease } from '~/releases/util'; +import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util'; jest.mock('~/flash'); @@ -21,12 +19,21 @@ jest.mock('~/lib/utils/url_utility', () => ({ joinPaths: jest.requireActual('~/lib/utils/url_utility').joinPaths, })); -const originalRelease = getJSONFixture('api/releases/release.json'); +jest.mock('~/releases/util', () => ({ + ...jest.requireActual('~/releases/util'), + gqClient: { + query: jest.fn(), + mutate: jest.fn(), + }, +})); + +const originalOneReleaseForEditingQueryResponse = getJSONFixture( + 'graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json', +); describe('Release edit/new actions', () => { let state; - let release; - let mock; + let releaseResponse; let error; const setupState = (updates = {}) => { @@ -34,38 +41,26 @@ describe('Release edit/new actions', () => { isExistingRelease: true, }; - const rootState = { - featureFlags: { - graphqlIndividualReleasePage: false, - }, - }; - state = { ...createState({ projectId: '18', - tagName: release.tag_name, + tagName: releaseResponse.tag_name, releasesPagePath: 'path/to/releases/page', markdownDocsPath: 'path/to/markdown/docs', markdownPreviewPath: 'path/to/markdown/preview', }), ...getters, - ...rootState, ...updates, }; }; beforeEach(() => { - release = cloneDeep(originalRelease); - mock = new MockAdapter(axios); + releaseResponse = cloneDeep(originalOneReleaseForEditingQueryResponse); gon.api_version = 'v4'; - error = { message: 'An error occurred' }; + error = new Error('Yikes!'); createFlash.mockClear(); }); - afterEach(() => { - mock.restore(); - }); - describe('when creating a new release', () => { beforeEach(() => { setupState({ isExistingRelease: false }); @@ -118,15 +113,9 @@ describe('Release edit/new actions', () => { beforeEach(setupState); describe('fetchRelease', () => { - let getReleaseUrl; - - beforeEach(() => { - getReleaseUrl = `/api/v4/projects/${state.projectId}/releases/${state.tagName}`; - }); - describe('when the network request to the Release API is successful', () => { beforeEach(() => { - mock.onGet(getReleaseUrl).replyOnce(httpStatus.OK, release); + gqClient.query.mockResolvedValue(releaseResponse); }); it(`commits ${types.REQUEST_RELEASE} and then commits ${types.RECEIVE_RELEASE_SUCCESS} with the converted release object`, () => { @@ -136,15 +125,15 @@ describe('Release edit/new actions', () => { }, { type: types.RECEIVE_RELEASE_SUCCESS, - payload: apiJsonToRelease(release, { deep: true }), + payload: convertOneReleaseGraphQLResponse(releaseResponse).data, }, ]); }); }); - describe('when the network request to the Release API fails', () => { + describe('when the GraphQL network request fails', () => { beforeEach(() => { - mock.onGet(getReleaseUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR); + gqClient.query.mockRejectedValue(error); }); it(`commits ${types.REQUEST_RELEASE} and then commits ${types.RECEIVE_RELEASE_ERROR} with an error object`, () => { @@ -282,44 +271,50 @@ describe('Release edit/new actions', () => { describe('receiveSaveReleaseSuccess', () => { it(`commits ${types.RECEIVE_SAVE_RELEASE_SUCCESS}`, () => - testAction(actions.receiveSaveReleaseSuccess, release, state, [ + testAction(actions.receiveSaveReleaseSuccess, releaseResponse, state, [ { type: types.RECEIVE_SAVE_RELEASE_SUCCESS }, ])); it("redirects to the release's dedicated page", () => { - actions.receiveSaveReleaseSuccess({ commit: jest.fn(), state }, release); + const { selfUrl } = releaseResponse.data.project.release.links; + actions.receiveSaveReleaseSuccess({ commit: jest.fn(), state }, selfUrl); expect(redirectTo).toHaveBeenCalledTimes(1); - expect(redirectTo).toHaveBeenCalledWith(release._links.self); + expect(redirectTo).toHaveBeenCalledWith(selfUrl); }); }); describe('createRelease', () => { - let createReleaseUrl; let releaseLinksToCreate; beforeEach(() => { - const camelCasedRelease = convertObjectPropsToCamelCase(release); + const { data: release } = convertOneReleaseGraphQLResponse( + originalOneReleaseForEditingQueryResponse, + ); - releaseLinksToCreate = camelCasedRelease.assets.links.slice(0, 1); + releaseLinksToCreate = release.assets.links.slice(0, 1); setupState({ - release: camelCasedRelease, + release, releaseLinksToCreate, }); - - createReleaseUrl = `/api/v4/projects/${state.projectId}/releases`; }); - describe('when the network request to the Release API is successful', () => { + describe('when the GraphQL request is successful', () => { + const selfUrl = 'url/to/self'; + beforeEach(() => { - const expectedRelease = releaseToApiJson({ - ...state.release, - assets: { - links: releaseLinksToCreate, + gqClient.mutate.mockResolvedValue({ + data: { + releaseCreate: { + release: { + links: { + selfUrl, + }, + }, + errors: [], + }, }, }); - - mock.onPost(createReleaseUrl, expectedRelease).replyOnce(httpStatus.CREATED, release); }); it(`dispatches "receiveSaveReleaseSuccess" with the converted release object`, () => { @@ -331,16 +326,16 @@ describe('Release edit/new actions', () => { [ { type: 'receiveSaveReleaseSuccess', - payload: apiJsonToRelease(release, { deep: true }), + payload: selfUrl, }, ], ); }); }); - describe('when the network request to the Release API fails', () => { + describe('when the GraphQL network request fails', () => { beforeEach(() => { - mock.onPost(createReleaseUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR); + gqClient.mutate.mockRejectedValue(error); }); it(`commits ${types.RECEIVE_SAVE_RELEASE_ERROR} with an error object`, () => { @@ -358,7 +353,7 @@ describe('Release edit/new actions', () => { .then(() => { expect(createFlash).toHaveBeenCalledTimes(1); expect(createFlash).toHaveBeenCalledWith( - 'Something went wrong while creating a new release', + 'Something went wrong while creating a new release.', ); }); }); @@ -369,112 +364,209 @@ describe('Release edit/new actions', () => { let getters; let dispatch; let commit; - let callOrder; + let release; beforeEach(() => { getters = { releaseLinksToDelete: [{ id: '1' }, { id: '2' }], - releaseLinksToCreate: [{ id: 'new-link-1' }, { id: 'new-link-2' }], + releaseLinksToCreate: [ + { id: 'new-link-1', name: 'Link 1', url: 'https://example.com/1', linkType: 'Other' }, + { id: 'new-link-2', name: 'Link 2', url: 'https://example.com/2', linkType: 'Package' }, + ], + releaseUpdateMutatationVariables: {}, }; + release = convertOneReleaseGraphQLResponse(releaseResponse).data; + setupState({ - release: convertObjectPropsToCamelCase(release), + release, ...getters, }); dispatch = jest.fn(); commit = jest.fn(); - callOrder = []; - jest.spyOn(api, 'updateRelease').mockImplementation(() => { - callOrder.push('updateRelease'); - return Promise.resolve({ data: release }); - }); - jest.spyOn(api, 'deleteReleaseLink').mockImplementation(() => { - callOrder.push('deleteReleaseLink'); - return Promise.resolve(); - }); - jest.spyOn(api, 'createReleaseLink').mockImplementation(() => { - callOrder.push('createReleaseLink'); - return Promise.resolve(); + gqClient.mutate.mockResolvedValue({ + data: { + releaseUpdate: { + errors: [], + }, + releaseAssetLinkDelete: { + errors: [], + }, + releaseAssetLinkCreate: { + errors: [], + }, + }, }); }); describe('when the network request to the Release API is successful', () => { - it('dispatches receiveSaveReleaseSuccess', () => { - return actions.updateRelease({ commit, dispatch, state, getters }).then(() => { - expect(dispatch.mock.calls).toEqual([ - ['receiveSaveReleaseSuccess', apiJsonToRelease(release)], - ]); - }); + it('dispatches receiveSaveReleaseSuccess', async () => { + await actions.updateRelease({ commit, dispatch, state, getters }); + expect(dispatch.mock.calls).toEqual([['receiveSaveReleaseSuccess', release._links.self]]); }); - it('updates the Release, then deletes all existing links, and then recreates new links', () => { - return actions.updateRelease({ dispatch, state, getters }).then(() => { - expect(callOrder).toEqual([ - 'updateRelease', - 'deleteReleaseLink', - 'deleteReleaseLink', - 'createReleaseLink', - 'createReleaseLink', - ]); + it('updates the Release, then deletes all existing links, and then recreates new links', async () => { + await actions.updateRelease({ commit, dispatch, state, getters }); - expect(api.updateRelease.mock.calls).toEqual([ - [ - state.projectId, - state.tagName, - releaseToApiJson({ - ...state.release, - assets: { - links: getters.releaseLinksToCreate, - }, - }), - ], - ]); + // First, update the release + expect(gqClient.mutate.mock.calls[0]).toEqual([ + { + mutation: updateReleaseMutation, + variables: getters.releaseUpdateMutatationVariables, + }, + ]); - expect(api.deleteReleaseLink).toHaveBeenCalledTimes( - getters.releaseLinksToDelete.length, - ); - getters.releaseLinksToDelete.forEach((link) => { - expect(api.deleteReleaseLink).toHaveBeenCalledWith( - state.projectId, - state.tagName, - link.id, - ); - }); + // Then, delete the first asset link + expect(gqClient.mutate.mock.calls[1]).toEqual([ + { + mutation: deleteReleaseAssetLinkMutation, + variables: { input: { id: getters.releaseLinksToDelete[0].id } }, + }, + ]); - expect(api.createReleaseLink).toHaveBeenCalledTimes( - getters.releaseLinksToCreate.length, - ); - getters.releaseLinksToCreate.forEach((link) => { - expect(api.createReleaseLink).toHaveBeenCalledWith( - state.projectId, - state.tagName, - link, - ); - }); - }); + // And the second + expect(gqClient.mutate.mock.calls[2]).toEqual([ + { + mutation: deleteReleaseAssetLinkMutation, + variables: { input: { id: getters.releaseLinksToDelete[1].id } }, + }, + ]); + + // Recreate the first asset link + expect(gqClient.mutate.mock.calls[3]).toEqual([ + { + mutation: createReleaseAssetLinkMutation, + variables: { + input: { + projectPath: state.projectPath, + tagName: state.tagName, + name: getters.releaseLinksToCreate[0].name, + url: getters.releaseLinksToCreate[0].url, + linkType: getters.releaseLinksToCreate[0].linkType.toUpperCase(), + }, + }, + }, + ]); + + // And finally, recreate the second + expect(gqClient.mutate.mock.calls[4]).toEqual([ + { + mutation: createReleaseAssetLinkMutation, + variables: { + input: { + projectPath: state.projectPath, + tagName: state.tagName, + name: getters.releaseLinksToCreate[1].name, + url: getters.releaseLinksToCreate[1].url, + linkType: getters.releaseLinksToCreate[1].linkType.toUpperCase(), + }, + }, + }, + ]); }); }); - describe('when the network request to the Release API fails', () => { + describe('when the GraphQL network request fails', () => { beforeEach(() => { - jest.spyOn(api, 'updateRelease').mockRejectedValue(error); + gqClient.mutate.mockRejectedValue(error); }); - it('dispatches requestUpdateRelease and receiveUpdateReleaseError with an error object', () => { - return actions.updateRelease({ commit, dispatch, state, getters }).then(() => { - expect(commit.mock.calls).toEqual([[types.RECEIVE_SAVE_RELEASE_ERROR, error]]); - }); + it('dispatches requestUpdateRelease and receiveUpdateReleaseError with an error object', async () => { + await actions.updateRelease({ commit, dispatch, state, getters }); + + expect(commit.mock.calls).toEqual([[types.RECEIVE_SAVE_RELEASE_ERROR, error]]); + }); + + it('shows a flash message', async () => { + await actions.updateRelease({ commit, dispatch, state, getters }); + + expect(createFlash).toHaveBeenCalledTimes(1); + expect(createFlash).toHaveBeenCalledWith( + 'Something went wrong while saving the release details.', + ); }); + }); + + describe('when the GraphQL mutation returns errors-as-data', () => { + const expectCorrectErrorHandling = () => { + it('dispatches requestUpdateRelease and receiveUpdateReleaseError with an error object', async () => { + await actions.updateRelease({ commit, dispatch, state, getters }); + + expect(commit.mock.calls).toEqual([ + [types.RECEIVE_SAVE_RELEASE_ERROR, expect.any(Error)], + ]); + }); + + it('shows a flash message', async () => { + await actions.updateRelease({ commit, dispatch, state, getters }); - it('shows a flash message', () => { - return actions.updateRelease({ commit, dispatch, state, getters }).then(() => { expect(createFlash).toHaveBeenCalledTimes(1); expect(createFlash).toHaveBeenCalledWith( - 'Something went wrong while saving the release details', + 'Something went wrong while saving the release details.', ); }); + }; + + describe('when the releaseUpdate mutation returns errors-as-data', () => { + beforeEach(() => { + gqClient.mutate.mockResolvedValue({ + data: { + releaseUpdate: { + errors: ['Something went wrong!'], + }, + releaseAssetLinkDelete: { + errors: [], + }, + releaseAssetLinkCreate: { + errors: [], + }, + }, + }); + }); + + expectCorrectErrorHandling(); + }); + + describe('when the releaseAssetLinkDelete mutation returns errors-as-data', () => { + beforeEach(() => { + gqClient.mutate.mockResolvedValue({ + data: { + releaseUpdate: { + errors: [], + }, + releaseAssetLinkDelete: { + errors: ['Something went wrong!'], + }, + releaseAssetLinkCreate: { + errors: [], + }, + }, + }); + }); + + expectCorrectErrorHandling(); + }); + + describe('when the releaseAssetLinkCreate mutation returns errors-as-data', () => { + beforeEach(() => { + gqClient.mutate.mockResolvedValue({ + data: { + releaseUpdate: { + errors: [], + }, + releaseAssetLinkDelete: { + errors: [], + }, + releaseAssetLinkCreate: { + errors: ['Something went wrong!'], + }, + }, + }); + }); + + expectCorrectErrorHandling(); }); }); }); diff --git a/spec/frontend/releases/stores/modules/detail/getters_spec.js b/spec/frontend/releases/stores/modules/detail/getters_spec.js index 1449c064d77..66f24ac9559 100644 --- a/spec/frontend/releases/stores/modules/detail/getters_spec.js +++ b/spec/frontend/releases/stores/modules/detail/getters_spec.js @@ -257,4 +257,93 @@ describe('Release edit/new getters', () => { }); }); }); + + describe.each([ + [ + 'returns all the data needed for the releaseUpdate GraphQL query', + { + projectPath: 'projectPath', + release: { + tagName: 'release.tagName', + name: 'release.name', + description: 'release.description', + milestones: ['release.milestone[0].title'], + }, + }, + { + projectPath: 'projectPath', + tagName: 'release.tagName', + name: 'release.name', + description: 'release.description', + milestones: ['release.milestone[0].title'], + }, + ], + [ + 'trims whitespace from the release name', + { release: { name: ' name \t\n' } }, + { name: 'name' }, + ], + [ + 'returns the name as null if the name is nothing but whitespace', + { release: { name: ' \t\n' } }, + { name: null }, + ], + ['returns the name as null if the name is undefined', { release: {} }, { name: null }], + [ + 'returns just the milestone titles even if the release includes full milestone objects', + { release: { milestones: [{ title: 'release.milestone[0].title' }] } }, + { milestones: ['release.milestone[0].title'] }, + ], + ])('releaseUpdateMutatationVariables', (description, state, expectedVariables) => { + it(description, () => { + const expectedVariablesObject = { input: expect.objectContaining(expectedVariables) }; + + const actualVariables = getters.releaseUpdateMutatationVariables(state); + + expect(actualVariables).toEqual(expectedVariablesObject); + }); + }); + + describe('releaseCreateMutatationVariables', () => { + it('returns all the data needed for the releaseCreate GraphQL query', () => { + const state = { + createFrom: 'main', + }; + + const otherGetters = { + releaseUpdateMutatationVariables: { + input: { + name: 'release.name', + }, + }, + releaseLinksToCreate: [ + { + name: 'link.name', + url: 'link.url', + linkType: 'link.linkType', + }, + ], + }; + + const expectedVariables = { + input: { + name: 'release.name', + ref: 'main', + assets: { + links: [ + { + name: 'link.name', + url: 'link.url', + linkType: 'LINK.LINKTYPE', + }, + ], + }, + }, + }; + + const actualVariables = getters.releaseCreateMutatationVariables(state, otherGetters); + + expect(actualVariables).toEqual(expectedVariables); + }); + }); }); diff --git a/spec/frontend/releases/stores/modules/list/actions_spec.js b/spec/frontend/releases/stores/modules/list/actions_spec.js index 4dc996174bc..af520c2eb20 100644 --- a/spec/frontend/releases/stores/modules/list/actions_spec.js +++ b/spec/frontend/releases/stores/modules/list/actions_spec.js @@ -1,43 +1,29 @@ import { cloneDeep } from 'lodash'; import { getJSONFixture } from 'helpers/fixtures'; import testAction from 'helpers/vuex_action_helper'; -import api from '~/api'; -import { - normalizeHeaders, - parseIntPagination, - convertObjectPropsToCamelCase, -} from '~/lib/utils/common_utils'; import { PAGE_SIZE } from '~/releases/constants'; -import allReleasesQuery from '~/releases/queries/all_releases.query.graphql'; +import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql'; import { fetchReleases, - fetchReleasesGraphQl, - fetchReleasesRest, receiveReleasesError, setSorting, } from '~/releases/stores/modules/index/actions'; import * as types from '~/releases/stores/modules/index/mutation_types'; import createState from '~/releases/stores/modules/index/state'; import { gqClient, convertAllReleasesGraphQLResponse } from '~/releases/util'; -import { pageInfoHeadersWithoutPagination } from '../../../mock_data'; - -const originalRelease = getJSONFixture('api/releases/release.json'); -const originalReleases = [originalRelease]; const originalGraphqlReleasesResponse = getJSONFixture( - 'graphql/releases/queries/all_releases.query.graphql.json', + 'graphql/releases/graphql/queries/all_releases.query.graphql.json', ); describe('Releases State actions', () => { let mockedState; - let releases; let graphqlReleasesResponse; const projectPath = 'root/test-project'; const projectId = 19; const before = 'testBeforeCursor'; const after = 'testAfterCursor'; - const page = 2; beforeEach(() => { mockedState = { @@ -47,57 +33,10 @@ describe('Releases State actions', () => { }), }; - releases = convertObjectPropsToCamelCase(originalReleases, { deep: true }); graphqlReleasesResponse = cloneDeep(originalGraphqlReleasesResponse); }); - describe('when all the necessary GraphQL feature flags are enabled', () => { - beforeEach(() => { - mockedState.useGraphQLEndpoint = true; - }); - - describe('fetchReleases', () => { - it('dispatches fetchReleasesGraphQl with before and after parameters', () => { - return testAction( - fetchReleases, - { before, after, page }, - mockedState, - [], - [ - { - type: 'fetchReleasesGraphQl', - payload: { before, after }, - }, - ], - ); - }); - }); - }); - - describe('when at least one of the GraphQL feature flags is disabled', () => { - beforeEach(() => { - mockedState.useGraphQLEndpoint = false; - }); - - describe('fetchReleases', () => { - it('dispatches fetchReleasesRest with a page parameter', () => { - return testAction( - fetchReleases, - { before, after, page }, - mockedState, - [], - [ - { - type: 'fetchReleasesRest', - payload: { page }, - }, - ], - ); - }); - }); - }); - - describe('fetchReleasesGraphQl', () => { + describe('fetchReleases', () => { describe('GraphQL query variables', () => { let vuexParams; @@ -109,7 +48,7 @@ describe('Releases State actions', () => { describe('when neither a before nor an after parameter is provided', () => { beforeEach(() => { - fetchReleasesGraphQl(vuexParams, { before: undefined, after: undefined }); + fetchReleases(vuexParams, { before: undefined, after: undefined }); }); it('makes a GraphQl query with a first variable', () => { @@ -122,7 +61,7 @@ describe('Releases State actions', () => { describe('when only a before parameter is provided', () => { beforeEach(() => { - fetchReleasesGraphQl(vuexParams, { before, after: undefined }); + fetchReleases(vuexParams, { before, after: undefined }); }); it('makes a GraphQl query with last and before variables', () => { @@ -135,7 +74,7 @@ describe('Releases State actions', () => { describe('when only an after parameter is provided', () => { beforeEach(() => { - fetchReleasesGraphQl(vuexParams, { before: undefined, after }); + fetchReleases(vuexParams, { before: undefined, after }); }); it('makes a GraphQl query with first and after variables', () => { @@ -148,12 +87,12 @@ describe('Releases State actions', () => { describe('when both before and after parameters are provided', () => { it('throws an error', () => { - const callFetchReleasesGraphQl = () => { - fetchReleasesGraphQl(vuexParams, { before, after }); + const callFetchReleases = () => { + fetchReleases(vuexParams, { before, after }); }; - expect(callFetchReleasesGraphQl).toThrowError( - 'Both a `before` and an `after` parameter were provided to fetchReleasesGraphQl. These parameters cannot be used together.', + expect(callFetchReleases).toThrowError( + 'Both a `before` and an `after` parameter were provided to fetchReleases. These parameters cannot be used together.', ); }); }); @@ -171,7 +110,7 @@ describe('Releases State actions', () => { mockedState.sorting.sort = sort; mockedState.sorting.orderBy = orderBy; - fetchReleasesGraphQl(vuexParams, { before: undefined, after: undefined }); + fetchReleases(vuexParams, { before: undefined, after: undefined }); expect(gqClient.query).toHaveBeenCalledWith({ query: allReleasesQuery, @@ -191,7 +130,7 @@ describe('Releases State actions', () => { const convertedResponse = convertAllReleasesGraphQLResponse(graphqlReleasesResponse); return testAction( - fetchReleasesGraphQl, + fetchReleases, {}, mockedState, [ @@ -202,7 +141,7 @@ describe('Releases State actions', () => { type: types.RECEIVE_RELEASES_SUCCESS, payload: { data: convertedResponse.data, - graphQlPageInfo: convertedResponse.paginationInfo, + pageInfo: convertedResponse.paginationInfo, }, }, ], @@ -218,90 +157,7 @@ describe('Releases State actions', () => { it(`commits ${types.REQUEST_RELEASES} and dispatch receiveReleasesError`, () => { return testAction( - fetchReleasesGraphQl, - {}, - mockedState, - [ - { - type: types.REQUEST_RELEASES, - }, - ], - [ - { - type: 'receiveReleasesError', - }, - ], - ); - }); - }); - }); - - describe('fetchReleasesRest', () => { - describe('REST query parameters', () => { - let vuexParams; - - beforeEach(() => { - jest - .spyOn(api, 'releases') - .mockResolvedValue({ data: releases, headers: pageInfoHeadersWithoutPagination }); - - vuexParams = { dispatch: jest.fn(), commit: jest.fn(), state: mockedState }; - }); - - describe('when a page parameter is provided', () => { - beforeEach(() => { - fetchReleasesRest(vuexParams, { page: 2 }); - }); - - it('makes a REST query with a page query parameter', () => { - expect(api.releases).toHaveBeenCalledWith(projectId, { - page, - order_by: 'released_at', - sort: 'desc', - }); - }); - }); - }); - - describe('when the request is successful', () => { - beforeEach(() => { - jest - .spyOn(api, 'releases') - .mockResolvedValue({ data: releases, headers: pageInfoHeadersWithoutPagination }); - }); - - it(`commits ${types.REQUEST_RELEASES} and ${types.RECEIVE_RELEASES_SUCCESS}`, () => { - return testAction( - fetchReleasesRest, - {}, - mockedState, - [ - { - type: types.REQUEST_RELEASES, - }, - { - type: types.RECEIVE_RELEASES_SUCCESS, - payload: { - data: convertObjectPropsToCamelCase(releases, { deep: true }), - restPageInfo: parseIntPagination( - normalizeHeaders(pageInfoHeadersWithoutPagination), - ), - }, - }, - ], - [], - ); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - jest.spyOn(api, 'releases').mockRejectedValue(new Error('Something went wrong!')); - }); - - it(`commits ${types.REQUEST_RELEASES} and dispatch receiveReleasesError`, () => { - return testAction( - fetchReleasesRest, + fetchReleases, {}, mockedState, [ diff --git a/spec/frontend/releases/stores/modules/list/mutations_spec.js b/spec/frontend/releases/stores/modules/list/mutations_spec.js index 8b35ba5d7ac..08d803b3c2c 100644 --- a/spec/frontend/releases/stores/modules/list/mutations_spec.js +++ b/spec/frontend/releases/stores/modules/list/mutations_spec.js @@ -1,28 +1,25 @@ import { getJSONFixture } from 'helpers/fixtures'; -import { parseIntPagination, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; +import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import * as types from '~/releases/stores/modules/index/mutation_types'; import mutations from '~/releases/stores/modules/index/mutations'; import createState from '~/releases/stores/modules/index/state'; import { convertAllReleasesGraphQLResponse } from '~/releases/util'; -import { pageInfoHeadersWithoutPagination } from '../../../mock_data'; const originalRelease = getJSONFixture('api/releases/release.json'); const originalReleases = [originalRelease]; const graphqlReleasesResponse = getJSONFixture( - 'graphql/releases/queries/all_releases.query.graphql.json', + 'graphql/releases/graphql/queries/all_releases.query.graphql.json', ); describe('Releases Store Mutations', () => { let stateCopy; - let restPageInfo; - let graphQlPageInfo; + let pageInfo; let releases; beforeEach(() => { stateCopy = createState({}); - restPageInfo = parseIntPagination(pageInfoHeadersWithoutPagination); - graphQlPageInfo = convertAllReleasesGraphQLResponse(graphqlReleasesResponse).paginationInfo; + pageInfo = convertAllReleasesGraphQLResponse(graphqlReleasesResponse).paginationInfo; releases = convertObjectPropsToCamelCase(originalReleases, { deep: true }); }); @@ -37,8 +34,7 @@ describe('Releases Store Mutations', () => { describe('RECEIVE_RELEASES_SUCCESS', () => { beforeEach(() => { mutations[types.RECEIVE_RELEASES_SUCCESS](stateCopy, { - restPageInfo, - graphQlPageInfo, + pageInfo, data: releases, }); }); @@ -55,20 +51,15 @@ describe('Releases Store Mutations', () => { expect(stateCopy.releases).toEqual(releases); }); - it('sets restPageInfo', () => { - expect(stateCopy.restPageInfo).toEqual(restPageInfo); - }); - - it('sets graphQlPageInfo', () => { - expect(stateCopy.graphQlPageInfo).toEqual(graphQlPageInfo); + it('sets pageInfo', () => { + expect(stateCopy.pageInfo).toEqual(pageInfo); }); }); describe('RECEIVE_RELEASES_ERROR', () => { it('resets data', () => { mutations[types.RECEIVE_RELEASES_SUCCESS](stateCopy, { - restPageInfo, - graphQlPageInfo, + pageInfo, data: releases, }); @@ -76,8 +67,7 @@ describe('Releases Store Mutations', () => { expect(stateCopy.isLoading).toEqual(false); expect(stateCopy.releases).toEqual([]); - expect(stateCopy.restPageInfo).toEqual({}); - expect(stateCopy.graphQlPageInfo).toEqual({}); + expect(stateCopy.pageInfo).toEqual({}); }); }); |