Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/releases/stores/modules')
-rw-r--r--spec/frontend/releases/stores/modules/detail/actions_spec.js344
-rw-r--r--spec/frontend/releases/stores/modules/detail/getters_spec.js89
-rw-r--r--spec/frontend/releases/stores/modules/list/actions_spec.js172
-rw-r--r--spec/frontend/releases/stores/modules/list/mutations_spec.js28
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({});
});
});