diff options
Diffstat (limited to 'spec/frontend/releases/stores/modules/detail')
3 files changed, 115 insertions, 0 deletions
diff --git a/spec/frontend/releases/stores/modules/detail/actions_spec.js b/spec/frontend/releases/stores/modules/detail/actions_spec.js index d8329fb82b1..41653f62ebf 100644 --- a/spec/frontend/releases/stores/modules/detail/actions_spec.js +++ b/spec/frontend/releases/stores/modules/detail/actions_spec.js @@ -1,8 +1,10 @@ import { cloneDeep } from 'lodash'; import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json'; import testAction from 'helpers/vuex_action_helper'; +import { getTag } from '~/api/tags_api'; import createFlash from '~/flash'; import { redirectTo } from '~/lib/utils/url_utility'; +import { s__ } from '~/locale'; 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'; @@ -12,6 +14,8 @@ import * as types from '~/releases/stores/modules/edit_new/mutation_types'; import createState from '~/releases/stores/modules/edit_new/state'; import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util'; +jest.mock('~/api/tags_api'); + jest.mock('~/flash'); jest.mock('~/lib/utils/url_utility', () => ({ @@ -567,4 +571,46 @@ describe('Release edit/new actions', () => { }); }); }); + + describe('fetchTagNotes', () => { + const tagName = 'v8.0.0'; + + it('saves the tag notes on succes', async () => { + const tag = { message: 'this is a tag' }; + getTag.mockResolvedValue({ data: tag }); + + await testAction( + actions.fetchTagNotes, + tagName, + state, + [ + { type: types.REQUEST_TAG_NOTES }, + { type: types.RECEIVE_TAG_NOTES_SUCCESS, payload: tag }, + ], + [], + ); + + expect(getTag).toHaveBeenCalledWith(state.projectId, tagName); + }); + it('creates a flash on error', async () => { + error = new Error(); + getTag.mockRejectedValue(error); + + await testAction( + actions.fetchTagNotes, + tagName, + state, + [ + { type: types.REQUEST_TAG_NOTES }, + { type: types.RECEIVE_TAG_NOTES_ERROR, payload: error }, + ], + [], + ); + + expect(createFlash).toHaveBeenCalledWith({ + message: s__('Release|Unable to fetch the tag notes.'), + }); + expect(getTag).toHaveBeenCalledWith(state.projectId, tagName); + }); + }); }); diff --git a/spec/frontend/releases/stores/modules/detail/getters_spec.js b/spec/frontend/releases/stores/modules/detail/getters_spec.js index c32969c131e..c42c6c00f56 100644 --- a/spec/frontend/releases/stores/modules/detail/getters_spec.js +++ b/spec/frontend/releases/stores/modules/detail/getters_spec.js @@ -1,3 +1,4 @@ +import { s__ } from '~/locale'; import * as getters from '~/releases/stores/modules/edit_new/getters'; describe('Release edit/new getters', () => { @@ -145,6 +146,8 @@ describe('Release edit/new getters', () => { ], }, }, + // tag has an existing release + existingRelease: {}, }; actualErrors = getters.validationErrors(state); @@ -158,6 +161,14 @@ describe('Release edit/new getters', () => { expect(actualErrors).toMatchObject(expectedErrors); }); + it('returns a validation error if the tag has an existing release', () => { + const expectedErrors = { + existingRelease: true, + }; + + expect(actualErrors).toMatchObject(expectedErrors); + }); + it('returns a validation error if links share a URL', () => { const expectedErrors = { assets: { @@ -369,4 +380,25 @@ describe('Release edit/new getters', () => { expect(actualVariables).toEqual(expectedVariables); }); }); + + describe('formattedReleaseNotes', () => { + it.each` + description | includeTagNotes | tagNotes | included + ${'release notes'} | ${true} | ${'tag notes'} | ${true} + ${'release notes'} | ${true} | ${''} | ${false} + ${'release notes'} | ${false} | ${'tag notes'} | ${false} + `( + 'should include tag notes=$included when includeTagNotes=$includeTagNotes and tagNotes=$tagNotes', + ({ description, includeTagNotes, tagNotes, included }) => { + const state = { release: { description }, includeTagNotes, tagNotes }; + + const text = `### ${s__('Releases|Tag message')}\n\n${tagNotes}\n`; + if (included) { + expect(getters.formattedReleaseNotes(state)).toContain(text); + } else { + expect(getters.formattedReleaseNotes(state)).not.toContain(text); + } + }, + ); + }); }); diff --git a/spec/frontend/releases/stores/modules/detail/mutations_spec.js b/spec/frontend/releases/stores/modules/detail/mutations_spec.js index 24dcedb3580..85844831e0b 100644 --- a/spec/frontend/releases/stores/modules/detail/mutations_spec.js +++ b/spec/frontend/releases/stores/modules/detail/mutations_spec.js @@ -237,4 +237,41 @@ describe('Release edit/new mutations', () => { expect(state.release.assets.links).not.toContainEqual(linkToRemove); }); }); + describe(`${types.REQUEST_TAG_NOTES}`, () => { + it('sets isFetchingTagNotes to true', () => { + state.isFetchingTagNotes = false; + mutations[types.REQUEST_TAG_NOTES](state); + expect(state.isFetchingTagNotes).toBe(true); + }); + }); + describe(`${types.RECEIVE_TAG_NOTES_SUCCESS}`, () => { + it('sets the tag notes in the state', () => { + state.isFetchingTagNotes = true; + const message = 'tag notes'; + + mutations[types.RECEIVE_TAG_NOTES_SUCCESS](state, { message, release }); + expect(state.tagNotes).toBe(message); + expect(state.isFetchingTagNotes).toBe(false); + expect(state.existingRelease).toBe(release); + }); + }); + describe(`${types.RECEIVE_TAG_NOTES_ERROR}`, () => { + it('sets tag notes to empty', () => { + const message = 'there was an error'; + state.isFetchingTagNotes = true; + state.tagNotes = 'tag notes'; + + mutations[types.RECEIVE_TAG_NOTES_ERROR](state, { message }); + expect(state.tagNotes).toBe(''); + expect(state.isFetchingTagNotes).toBe(false); + }); + }); + describe(`${types.UPDATE_INCLUDE_TAG_NOTES}`, () => { + it('sets whether or not to include the tag notes', () => { + state.includeTagNotes = false; + + mutations[types.UPDATE_INCLUDE_TAG_NOTES](state, true); + expect(state.includeTagNotes).toBe(true); + }); + }); }); |