diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-15 06:09:35 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-15 06:09:35 +0000 |
commit | 7d5d23819bd51063dc641c29bff7b334cea83d84 (patch) | |
tree | 4ac915d07f45b1f9dad4f7665b647d5be5f44f90 /spec/frontend | |
parent | e2235ff50a3296ebcad70b3ebde4fd47dfd74854 (diff) | |
download | gitlab-ce-7d5d23819bd51063dc641c29bff7b334cea83d84.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
9 files changed, 172 insertions, 23 deletions
diff --git a/spec/frontend/alert_management/components/alert_management_empty_state_spec.js b/spec/frontend/alert_management/components/alert_management_empty_state_spec.js index 09ff552b667..0d1214211d3 100644 --- a/spec/frontend/alert_management/components/alert_management_empty_state_spec.js +++ b/spec/frontend/alert_management/components/alert_management_empty_state_spec.js @@ -10,6 +10,7 @@ describe('AlertManagementEmptyState', () => { alertManagementEnabled: false, userCanEnableAlertManagement: false, }, + stubs = {}, } = {}) { wrapper = shallowMount(AlertManagementEmptyState, { propsData: { @@ -17,6 +18,7 @@ describe('AlertManagementEmptyState', () => { emptyAlertSvgPath: 'illustration/path', ...props, }, + stubs, }); } @@ -30,9 +32,23 @@ describe('AlertManagementEmptyState', () => { } }); + const EmptyState = () => wrapper.find(GlEmptyState); + describe('Empty state', () => { it('shows empty state', () => { - expect(wrapper.find(GlEmptyState).exists()).toBe(true); + expect(EmptyState().exists()).toBe(true); + }); + + it('show OpsGenie integration state when OpsGenie mcv is true', () => { + mountComponent({ + props: { + alertManagementEnabled: false, + userCanEnableAlertManagement: false, + opsgenieMvcEnabled: true, + opsgenieMvcTargetUrl: 'https://opsgenie-url.com', + }, + }); + expect(EmptyState().props('title')).toBe('Opsgenie is enabled'); }); }); }); diff --git a/spec/frontend/alert_settings/__snapshots__/alert_settings_form_spec.js.snap b/spec/frontend/alert_settings/__snapshots__/alert_settings_form_spec.js.snap index 828a2971c15..1f5c3a80fbb 100644 --- a/spec/frontend/alert_settings/__snapshots__/alert_settings_form_spec.js.snap +++ b/spec/frontend/alert_settings/__snapshots__/alert_settings_form_spec.js.snap @@ -13,20 +13,20 @@ exports[`AlertsSettingsForm with default values renders the initial template 1`] </div> <gl-form-stub> <gl-form-group-stub label=\\"Integrations\\" label-for=\\"integrations\\" label-class=\\"label-bold\\"> - <gl-form-select-stub options=\\"[object Object],[object Object]\\" data-testid=\\"alert-settings-select\\" value=\\"generic\\"></gl-form-select-stub> <span class=\\"gl-text-gray-400\\"><gl-sprintf-stub message=\\"Learn more about our %{linkStart}upcoming integrations%{linkEnd}\\"></gl-sprintf-stub></span> + <gl-form-select-stub options=\\"[object Object],[object Object],[object Object]\\" data-testid=\\"alert-settings-select\\" value=\\"generic\\"></gl-form-select-stub> <span class=\\"gl-text-gray-400\\"><gl-sprintf-stub message=\\"Learn more about our %{linkStart}upcoming integrations%{linkEnd}\\"></gl-sprintf-stub></span> </gl-form-group-stub> <gl-form-group-stub label=\\"Active\\" label-for=\\"activated\\" label-class=\\"label-bold\\"> <toggle-button-stub id=\\"activated\\"></toggle-button-stub> </gl-form-group-stub> <!----> <gl-form-group-stub label=\\"Webhook URL\\" label-for=\\"url\\" label-class=\\"label-bold\\"> - <gl-form-input-group-stub value=\\"/alerts/notify.json\\" predefinedoptions=\\"[object Object]\\" id=\\"url\\" readonly=\\"true\\"></gl-form-input-group-stub> <span class=\\"gl-text-gray-400\\"> + <gl-form-input-group-stub value=\\"/alerts/notify.json\\" predefinedoptions=\\"[object Object]\\" id=\\"url\\" readonly=\\"\\"></gl-form-input-group-stub> <span class=\\"gl-text-gray-400\\"> - </span> + </span> </gl-form-group-stub> <gl-form-group-stub label=\\"Authorization key\\" label-for=\\"authorization-key\\" label-class=\\"label-bold\\"> - <gl-form-input-group-stub value=\\"abcedfg123\\" predefinedoptions=\\"[object Object]\\" id=\\"authorization-key\\" readonly=\\"true\\" class=\\"gl-mb-2\\"></gl-form-input-group-stub> - <gl-button-stub category=\\"tertiary\\" variant=\\"default\\" size=\\"medium\\" icon=\\"\\" class=\\"gl-mt-3\\" role=\\"button\\" tabindex=\\"0\\">Reset key</gl-button-stub> + <gl-form-input-group-stub value=\\"abcedfg123\\" predefinedoptions=\\"[object Object]\\" id=\\"authorization-key\\" readonly=\\"\\" class=\\"gl-mb-2\\"></gl-form-input-group-stub> + <gl-button-stub category=\\"tertiary\\" variant=\\"default\\" size=\\"medium\\" icon=\\"\\" disabled=\\"true\\" class=\\"gl-mt-3\\" role=\\"button\\" tabindex=\\"0\\">Reset key</gl-button-stub> <gl-modal-stub modalid=\\"authKeyModal\\" titletag=\\"h4\\" modalclass=\\"\\" size=\\"md\\" title=\\"Reset key\\" ok-title=\\"Reset key\\" ok-variant=\\"danger\\"> Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in. </gl-modal-stub> @@ -36,10 +36,10 @@ exports[`AlertsSettingsForm with default values renders the initial template 1`] </gl-form-group-stub> <gl-button-stub category=\\"tertiary\\" variant=\\"default\\" size=\\"medium\\" icon=\\"\\" disabled=\\"true\\">Test alert payload</gl-button-stub> <div class=\\"footer-block row-content-block gl-display-flex gl-justify-content-space-between\\"> - <gl-button-stub category=\\"primary\\" variant=\\"success\\" size=\\"medium\\" icon=\\"\\" disabled=\\"true\\" type=\\"submit\\"> + <gl-button-stub category=\\"primary\\" variant=\\"success\\" size=\\"medium\\" icon=\\"\\" disabled=\\"true\\"> Save changes </gl-button-stub> - <gl-button-stub category=\\"primary\\" variant=\\"default\\" size=\\"medium\\" icon=\\"\\" type=\\"reset\\"> + <gl-button-stub category=\\"primary\\" variant=\\"default\\" size=\\"medium\\" icon=\\"\\" disabled=\\"true\\"> Cancel </gl-button-stub> </div> diff --git a/spec/frontend/alert_settings/alert_settings_form_spec.js b/spec/frontend/alert_settings/alert_settings_form_spec.js index 0448644144c..e45c05032ca 100644 --- a/spec/frontend/alert_settings/alert_settings_form_spec.js +++ b/spec/frontend/alert_settings/alert_settings_form_spec.js @@ -18,13 +18,19 @@ const defaultProps = { url: GENERIC_URL, alertsSetupUrl: INVALID_URL, alertsUsageUrl: INVALID_URL, - initialActivated: ACTIVATED, + activated: ACTIVATED, }, prometheus: { prometheusAuthorizationKey: KEY, prometheusFormPath: INVALID_URL, prometheusUrl: PROMETHEUS_URL, - prometheusIsActivated: ACTIVATED, + activated: ACTIVATED, + }, + opsgenie: { + opsgenieMvcIsAvailable: true, + formPath: INVALID_URL, + activated: ACTIVATED, + opsgenieMvcTargetUrl: GENERIC_URL, }, }; @@ -139,7 +145,9 @@ describe('AlertsSettingsForm', () => { createComponent( { prometheus: { ...defaultProps.prometheus, prometheusIsActivated: true } }, {}, - true, + { + selectedEndpoint: 'prometheus', + }, ); }); @@ -151,12 +159,27 @@ describe('AlertsSettingsForm', () => { expect(findApiUrl().exists()).toBe(true); }); - it('show a valid Alert URL', () => { - expect(findUrl().exists()).toBe(true); + it('shows the correct default API URL', () => { expect(findUrl().attributes('value')).toBe(PROMETHEUS_URL); }); }); + describe('opsgenie is active', () => { + beforeEach(() => { + createComponent( + { opsgenie: { ...defaultProps.opsgenie, opsgenieMvcActivated: true } }, + {}, + { + selectedEndpoint: 'opsgenie', + }, + ); + }); + + it('shows a input for the opsgenie target URL', () => { + expect(findApiUrl().exists()).toBe(true); + }); + }); + describe('trigger test alert', () => { beforeEach(() => { createComponent({ generic: { ...defaultProps.generic, initialActivated: true } }, {}, true); @@ -168,7 +191,7 @@ describe('AlertsSettingsForm', () => { }); it('should validate JSON input', () => { - createComponent({ generic: { ...defaultProps.generic } }, {}, true, { + createComponent({ generic: { ...defaultProps.generic } }, true, { testAlertJson: '{ "value": "test" }', }); @@ -186,7 +209,7 @@ describe('AlertsSettingsForm', () => { createComponent({ generic: { ...defaultProps.generic, formPath } }); - return wrapper.vm.toggleGenericActivated(toggleService).then(() => { + return wrapper.vm.toggleActivated(toggleService).then(() => { expect(wrapper.find(GlAlert).attributes('variant')).toBe('info'); }); }); @@ -198,7 +221,7 @@ describe('AlertsSettingsForm', () => { createComponent({ generic: { ...defaultProps.generic, formPath } }); - return wrapper.vm.toggleGenericActivated(toggleService).then(() => { + return wrapper.vm.toggleActivated(toggleService).then(() => { expect(wrapper.find(GlAlert).attributes('variant')).toBe('danger'); }); }); diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js index 57e3a93c6f4..b7f03f35dfb 100644 --- a/spec/frontend/diffs/components/app_spec.js +++ b/spec/frontend/diffs/components/app_spec.js @@ -56,6 +56,7 @@ describe('diffs/components/app', () => { changesEmptyStateIllustration: '', dismissEndpoint: '', showSuggestPopover: true, + viewDiffsFileByFile: false, ...props, }, provide, @@ -829,4 +830,58 @@ describe('diffs/components/app', () => { expect(toggleShowTreeList).not.toHaveBeenCalled(); }); }); + + describe('file-by-file', () => { + it('renders a single diff', () => { + createComponent({ viewDiffsFileByFile: true }, ({ state }) => { + state.diffs.diffFiles.push({ file_hash: '123' }); + state.diffs.diffFiles.push({ file_hash: '312' }); + }); + + expect(wrapper.findAll(DiffFile).length).toBe(1); + }); + + describe('pagination', () => { + it('sets previous button as disabled', () => { + createComponent({ viewDiffsFileByFile: true }, ({ state }) => { + state.diffs.diffFiles.push({ file_hash: '123' }, { file_hash: '312' }); + }); + + expect(wrapper.find('[data-testid="singleFilePrevious"]').props('disabled')).toBe(true); + expect(wrapper.find('[data-testid="singleFileNext"]').props('disabled')).toBe(false); + }); + + it('sets next button as disabled', () => { + createComponent({ viewDiffsFileByFile: true }, ({ state }) => { + state.diffs.diffFiles.push({ file_hash: '123' }, { file_hash: '312' }); + state.diffs.currentDiffFileId = '312'; + }); + + expect(wrapper.find('[data-testid="singleFilePrevious"]').props('disabled')).toBe(false); + expect(wrapper.find('[data-testid="singleFileNext"]').props('disabled')).toBe(true); + }); + + it.each` + currentDiffFileId | button | index + ${'123'} | ${'singleFileNext'} | ${1} + ${'312'} | ${'singleFilePrevious'} | ${0} + `( + 'it calls navigateToDiffFileIndex with $index when $button is clicked', + ({ currentDiffFileId, button, index }) => { + createComponent({ viewDiffsFileByFile: true }, ({ state }) => { + state.diffs.diffFiles.push({ file_hash: '123' }, { file_hash: '312' }); + state.diffs.currentDiffFileId = currentDiffFileId; + }); + + jest.spyOn(wrapper.vm, 'navigateToDiffFileIndex'); + + wrapper.find(`[data-testid="${button}"]`).vm.$emit('click'); + + return wrapper.vm.$nextTick().then(() => { + expect(wrapper.vm.navigateToDiffFileIndex).toHaveBeenCalledWith(index); + }); + }, + ); + }); + }); }); diff --git a/spec/frontend/diffs/components/diff_file_header_spec.js b/spec/frontend/diffs/components/diff_file_header_spec.js index e0b7e0bc0f3..671dced080c 100644 --- a/spec/frontend/diffs/components/diff_file_header_spec.js +++ b/spec/frontend/diffs/components/diff_file_header_spec.js @@ -87,6 +87,7 @@ describe('DiffFileHeader component', () => { propsData: { diffFile, canCurrentUserFork: false, + viewDiffsFileByFile: false, ...props, }, localVue, diff --git a/spec/frontend/diffs/components/diff_file_row_spec.js b/spec/frontend/diffs/components/diff_file_row_spec.js index 856622b89cb..afdd4bfb335 100644 --- a/spec/frontend/diffs/components/diff_file_row_spec.js +++ b/spec/frontend/diffs/components/diff_file_row_spec.js @@ -73,4 +73,15 @@ describe('Diff File Row component', () => { expect(wrapper.find(FileRowStats).exists()).toEqual(value); }); }); + + it('adds is-active class when currentDiffFileId matches file_hash', () => { + createComponent({ + level: 0, + currentDiffFileId: '123', + file: { fileHash: '123' }, + hideFileStats: false, + }); + + expect(wrapper.classes('is-active')).toBe(true); + }); }); diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js index 71e975f2409..7e154d76f45 100644 --- a/spec/frontend/diffs/components/diff_file_spec.js +++ b/spec/frontend/diffs/components/diff_file_spec.js @@ -15,6 +15,7 @@ describe('DiffFile', () => { vm = createComponentWithStore(Vue.extend(DiffFileComponent), createStore(), { file: JSON.parse(JSON.stringify(diffFileMockDataReadable)), canCurrentUserFork: false, + viewDiffsFileByFile: false, }).$mount(); trackingSpy = mockTracking('_category_', vm.$el, jest.spyOn); }); @@ -113,6 +114,7 @@ describe('DiffFile', () => { vm = createComponentWithStore(Vue.extend(DiffFileComponent), createStore(), { file: JSON.parse(JSON.stringify(diffFileMockDataUnreadable)), canCurrentUserFork: false, + viewDiffsFileByFile: false, }).$mount(); vm.renderIt = false; @@ -235,6 +237,7 @@ describe('DiffFile', () => { vm = createComponentWithStore(Vue.extend(DiffFileComponent), createStore(), { file: JSON.parse(JSON.stringify(diffFileMockDataUnreadable)), canCurrentUserFork: false, + viewDiffsFileByFile: false, }).$mount(); jest.spyOn(vm, 'handleLoadCollapsedDiff').mockImplementation(() => {}); diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js index ee55669cd9b..2b069e1ebc9 100644 --- a/spec/frontend/diffs/store/actions_spec.js +++ b/spec/frontend/diffs/store/actions_spec.js @@ -46,6 +46,8 @@ import { setSuggestPopoverDismissed, changeCurrentCommit, moveToNeighboringCommit, + setCurrentDiffFileIdFromNote, + navigateToDiffFileIndex, } from '~/diffs/store/actions'; import eventHub from '~/notes/event_hub'; import * as types from '~/diffs/store/mutation_types'; @@ -189,8 +191,8 @@ describe('DiffsStoreActions', () => { it('should fetch batch diff files', done => { const endpointBatch = '/fetch/diffs_batch'; - const res1 = { diff_files: [], pagination: { next_page: 2 } }; - const res2 = { diff_files: [], pagination: {} }; + const res1 = { diff_files: [{ file_hash: 'test' }], pagination: { next_page: 2 } }; + const res2 = { diff_files: [{ file_hash: 'test2' }], pagination: {} }; mock .onGet( mergeUrlParams( @@ -226,8 +228,10 @@ describe('DiffsStoreActions', () => { { type: types.SET_RETRIEVING_BATCHES, payload: true }, { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: res1.diff_files } }, { type: types.SET_BATCH_LOADING, payload: false }, - { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: [] } }, + { type: types.UPDATE_CURRENT_DIFF_FILE_ID, payload: 'test' }, + { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: res2.diff_files } }, { type: types.SET_BATCH_LOADING, payload: false }, + { type: types.UPDATE_CURRENT_DIFF_FILE_ID, payload: 'test2' }, { type: types.SET_RETRIEVING_BATCHES, payload: false }, ], [], @@ -311,6 +315,7 @@ describe('DiffsStoreActions', () => { showWhitespace: false, diffViewType: 'inline', useSingleDiffStyle: false, + currentDiffFileId: null, }, [ { type: types.SET_LOADING, payload: true }, @@ -347,8 +352,8 @@ describe('DiffsStoreActions', () => { it('should fetch batch diff files', done => { const endpointBatch = '/fetch/diffs_batch'; - const res1 = { diff_files: [], pagination: { next_page: 2 } }; - const res2 = { diff_files: [], pagination: {} }; + const res1 = { diff_files: [{ file_hash: 'test' }], pagination: { next_page: 2 } }; + const res2 = { diff_files: [{ file_hash: 'test2' }], pagination: {} }; mock .onGet(mergeUrlParams({ per_page: DIFFS_PER_PAGE, w: '1', page: 1 }, endpointBatch)) .reply(200, res1) @@ -358,14 +363,16 @@ describe('DiffsStoreActions', () => { testAction( fetchDiffFilesBatch, {}, - { endpointBatch, useSingleDiffStyle: false }, + { endpointBatch, useSingleDiffStyle: false, currentDiffFileId: null }, [ { type: types.SET_BATCH_LOADING, payload: true }, { type: types.SET_RETRIEVING_BATCHES, payload: true }, { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: res1.diff_files } }, { type: types.SET_BATCH_LOADING, payload: false }, - { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: [] } }, + { type: types.UPDATE_CURRENT_DIFF_FILE_ID, payload: 'test' }, + { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: res2.diff_files } }, { type: types.SET_BATCH_LOADING, payload: false }, + { type: types.UPDATE_CURRENT_DIFF_FILE_ID, payload: 'test2' }, { type: types.SET_RETRIEVING_BATCHES, payload: false }, ], [], @@ -1565,4 +1572,31 @@ describe('DiffsStoreActions', () => { }, ); }); + + describe('setCurrentDiffFileIdFromNote', () => { + it('commits UPDATE_CURRENT_DIFF_FILE_ID', () => { + const commit = jest.fn(); + const rootGetters = { + getDiscussion: () => ({ diff_file: { file_hash: '123' } }), + notesById: { '1': { discussion_id: '2' } }, + }; + + setCurrentDiffFileIdFromNote({ commit, rootGetters }, '1'); + + expect(commit).toHaveBeenCalledWith(types.UPDATE_CURRENT_DIFF_FILE_ID, '123'); + }); + }); + + describe('navigateToDiffFileIndex', () => { + it('commits UPDATE_CURRENT_DIFF_FILE_ID', done => { + testAction( + navigateToDiffFileIndex, + 0, + { diffFiles: [{ file_hash: '123' }] }, + [{ type: types.UPDATE_CURRENT_DIFF_FILE_ID, payload: '123' }], + [], + done, + ); + }); + }); }); diff --git a/spec/frontend/notes/mixins/discussion_navigation_spec.js b/spec/frontend/notes/mixins/discussion_navigation_spec.js index ae30a36fc81..ecff95b6fe0 100644 --- a/spec/frontend/notes/mixins/discussion_navigation_spec.js +++ b/spec/frontend/notes/mixins/discussion_navigation_spec.js @@ -91,6 +91,8 @@ describe('Discussion navigation mixin', () => { beforeEach(() => { window.mrTabs.currentAction = 'show'; wrapper.vm[fn](...args); + + return wrapper.vm.$nextTick(); }); it('sets current discussion', () => { @@ -112,6 +114,8 @@ describe('Discussion navigation mixin', () => { beforeEach(() => { window.mrTabs.currentAction = 'diffs'; wrapper.vm[fn](...args); + + return wrapper.vm.$nextTick(); }); it('sets current discussion', () => { @@ -137,6 +141,8 @@ describe('Discussion navigation mixin', () => { beforeEach(() => { window.mrTabs.currentAction = 'other'; wrapper.vm[fn](...args); + + return wrapper.vm.$nextTick(); }); it('sets current discussion', () => { |