diff options
Diffstat (limited to 'spec/frontend')
4 files changed, 58 insertions, 124 deletions
diff --git a/spec/frontend/vue_merge_request_widget/components/checks/draft_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/draft_spec.js index cc605c8c83d..a7695431a02 100644 --- a/spec/frontend/vue_merge_request_widget/components/checks/draft_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/checks/draft_spec.js @@ -16,7 +16,7 @@ import { DRAFT_CHECK_READY, DRAFT_CHECK_ERROR, } from '~/vue_merge_request_widget/components/checks/i18n'; -import { FAILURE_REASONS } from '~/vue_merge_request_widget/components/checks/message.vue'; +import { FAILURE_REASONS } from '~/vue_merge_request_widget/components/checks/constants'; import draftQuery from '~/vue_merge_request_widget/queries/states/draft.query.graphql'; import getStateQuery from '~/vue_merge_request_widget/queries/get_state.query.graphql'; diff --git a/spec/frontend/vue_merge_request_widget/components/merge_checks_spec.js b/spec/frontend/vue_merge_request_widget/components/merge_checks_spec.js index 48c01e3efad..054e90640c5 100644 --- a/spec/frontend/vue_merge_request_widget/components/merge_checks_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/merge_checks_spec.js @@ -136,19 +136,19 @@ describe('Merge request merge checks component', () => { }); it.each` - identifier - ${'conflict'} - ${'discussions_not_resolved'} - ${'need_rebase'} - ${'default'} - `('renders $identifier merge check', async ({ identifier }) => { + identifier | componentName + ${'conflict'} | ${'conflict'} + ${'discussions_not_resolved'} | ${'discussions_not_resolved'} + ${'need_rebase'} | ${'need_rebase'} + ${'policies_denied'} | ${'default'} + `('renders $identifier merge check', async ({ identifier, componentName }) => { shallowMountComponent({ mergeabilityChecks: [{ status: 'failed', identifier }] }); wrapper.findComponent(StateContainer).vm.$emit('toggle'); await waitForPromises(); - const { default: component } = await COMPONENTS[identifier](); + const { default: component } = await COMPONENTS[componentName](); expect(wrapper.findComponent(component).exists()).toBe(true); }); @@ -166,9 +166,9 @@ describe('Merge request merge checks component', () => { it('sorts merge checks', async () => { mountComponent({ mergeabilityChecks: [ - { identifier: 'discussions', status: 'SUCCESS' }, - { identifier: 'discussions', status: 'INACTIVE' }, - { identifier: 'rebase', status: 'FAILED' }, + { identifier: 'discussions_not_resolved', status: 'SUCCESS' }, + { identifier: 'status_checks_must_pass', status: 'INACTIVE' }, + { identifier: 'need_rebase', status: 'FAILED' }, ], }); @@ -184,4 +184,21 @@ describe('Merge request merge checks component', () => { expect.objectContaining({ status: 'SUCCESS' }), ); }); + + it('does not render check component if no message exists', async () => { + mountComponent({ + mergeabilityChecks: [ + { identifier: 'discussions_not_resolved', status: 'SUCCESS' }, + { identifier: 'fakemessage', status: 'FAILED' }, + ], + }); + + await waitForPromises(); + + await wrapper.findByTestId('widget-toggle').trigger('click'); + + const mergeChecks = wrapper.findAllByTestId('merge-check'); + + expect(mergeChecks.length).toBe(1); + }); }); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js index 1d6834a5604..3c621b1ad4a 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js @@ -122,6 +122,7 @@ describe('BaseToken', () => { const findGlFilteredSearchToken = () => wrapper.findComponent(GlFilteredSearchToken); const findMockSuggestionList = () => wrapper.findByTestId(mockSuggestionListTestId); + const getMockSuggestionListSuggestions = () => JSON.parse(findMockSuggestionList().attributes('data-suggestions')); @@ -410,30 +411,6 @@ describe('BaseToken', () => { expect(setTokenValueToRecentlyUsed).not.toHaveBeenCalled(); }); - - it('emits token-selected event when groupMultiSelectTokens: true', () => { - const config = { ...mockConfig, multiSelect: true }; - wrapper = createComponent({ - props: { suggestions: mockLabels, config, value: { operator: '||' } }, - groupMultiSelectTokens: true, - }); - - findGlFilteredSearchToken().vm.$emit('select', mockTokenValue.title); - - expect(wrapper.emitted('token-selected')).toEqual([[mockTokenValue.title]]); - }); - - it('does not emit token-selected event when groupMultiSelectTokens: false', () => { - const config = { ...mockConfig, multiSelect: true }; - wrapper = createComponent({ - props: { suggestions: mockLabels, config, value: { operator: '||' } }, - groupMultiSelectTokens: false, - }); - - findGlFilteredSearchToken().vm.$emit('select', mockTokenValue.title); - - expect(wrapper.emitted('token-selected')).toBeUndefined(); - }); }); }); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js index decf843091e..581adef7e32 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js @@ -1,4 +1,5 @@ import { + GlFilteredSearchToken, GlFilteredSearchTokenSegment, GlFilteredSearchSuggestion, GlDropdownDivider, @@ -310,6 +311,34 @@ describe('UserToken', () => { expect(mockInput).toHaveBeenLastCalledWith([{ data: 'mockData', operator: '=' }]); }); + describe('when loading', () => { + beforeEach(() => { + wrapper = createComponent({ + active: true, + config: { + ...mockAuthorToken, + preloadedUsers: mockPreloadedUsers, + defaultUsers: [], + }, + stubs: { Portal: true }, + }); + }); + + it('shows current user', () => { + const firstSuggestion = wrapper.findComponent(GlFilteredSearchSuggestion).text(); + expect(firstSuggestion).toContain('Administrator'); + expect(firstSuggestion).toContain('@root'); + }); + + it('does not show non-matching user while searching', async () => { + wrapper.findComponent(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' }); + + await nextTick(); + + expect(wrapper.findComponent(GlFilteredSearchSuggestion).exists()).toBe(false); + }); + }); + describe('multiSelect', () => { it('renders check icons in suggestions when multiSelect is true', async () => { wrapper = createComponent({ @@ -322,15 +351,11 @@ describe('UserToken', () => { stubs: { Portal: true }, groupMultiSelectTokens: true, }); - await activateSuggestionsList(); - const suggestions = wrapper.findAllComponents(GlFilteredSearchSuggestion); - expect(findIconAtSuggestion(0).props('name')).toBe('check'); expect(findIconAtSuggestion(1).props('name')).toBe('check'); expect(findIconAtSuggestion(2).exists()).toBe(false); - // test for left padding on unchecked items (so alignment is correct) expect(suggestions.at(2).find('.gl-pl-6').exists()).toBe(true); }); @@ -344,101 +369,16 @@ describe('UserToken', () => { config: { ...mockAuthorToken, multiSelect: true, initialUsers: mockUsers }, groupMultiSelectTokens: true, }); - await nextTick(); const tokenSegments = wrapper.findAllComponents(GlFilteredSearchTokenSegment); - expect(tokenSegments).toHaveLength(3); // Author, =, "Administrator" - const tokenValue = tokenSegments.at(2); - const [user1, user2] = mockUsers; - expect(tokenValue.findAllComponents(GlAvatar).at(1).props('src')).toBe( mockUsers[1].avatar_url, ); expect(tokenValue.text()).toBe(`${user1.name},${user2.name}`); }); - - it('adds new user to multi-select-values', () => { - wrapper = createComponent({ - value: { data: [mockUsers[0].username], operator: '||' }, - data: { - users: mockUsers, - }, - config: { ...mockAuthorToken, multiSelect: true, initialUsers: mockUsers }, - active: true, - groupMultiSelectTokens: true, - }); - - findBaseToken().vm.$emit('token-selected', mockUsers[1].username); - - expect(findBaseToken().props().multiSelectValues).toEqual([ - mockUsers[0].username, - mockUsers[1].username, - ]); - }); - - it('removes existing user from array', () => { - const initialUsers = [mockUsers[0].username, mockUsers[1].username]; - wrapper = createComponent({ - value: { data: initialUsers, operator: '||' }, - data: { - users: mockUsers, - }, - config: { ...mockAuthorToken, multiSelect: true, initialUsers: mockUsers }, - active: true, - groupMultiSelectTokens: true, - }); - - findBaseToken().vm.$emit('token-selected', mockUsers[0].username); - - expect(findBaseToken().props().multiSelectValues).toEqual([mockUsers[1].username]); - }); - - it('clears input field after token selected', () => { - wrapper = createComponent({ - value: { data: [mockUsers[0].username, mockUsers[1].username], operator: '||' }, - data: { - users: mockUsers, - }, - config: { ...mockAuthorToken, multiSelect: true, initialUsers: mockUsers }, - active: true, - groupMultiSelectTokens: true, - }); - - findBaseToken().vm.$emit('token-selected', 'test'); - - expect(wrapper.emitted('input')).toEqual([[{ operator: '||', data: '' }]]); - }); - }); - - describe('when loading', () => { - beforeEach(() => { - wrapper = createComponent({ - active: true, - config: { - ...mockAuthorToken, - preloadedUsers: mockPreloadedUsers, - defaultUsers: [], - }, - stubs: { Portal: true }, - }); - }); - - it('shows current user', () => { - const firstSuggestion = wrapper.findComponent(GlFilteredSearchSuggestion).text(); - expect(firstSuggestion).toContain('Administrator'); - expect(firstSuggestion).toContain('@root'); - }); - - it('does not show current user while searching', async () => { - wrapper.findComponent(BaseToken).vm.handleInput({ data: 'foo' }); - - await nextTick(); - - expect(wrapper.findComponent(GlFilteredSearchSuggestion).exists()).toBe(false); - }); }); }); }); |