diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-02 15:09:08 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-02 15:09:08 +0000 |
commit | 840d5ecdbbf8da3e03a7f0b8b465a89d1519807c (patch) | |
tree | 4e197815c026a947057f7b5cbcb5e3cf106cc22f /spec/frontend | |
parent | b0107e8756bf3287f8a6221252c800209a9c46f6 (diff) | |
download | gitlab-ce-840d5ecdbbf8da3e03a7f0b8b465a89d1519807c.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
9 files changed, 111 insertions, 208 deletions
diff --git a/spec/frontend/monitoring/mock_data.js b/spec/frontend/monitoring/mock_data.js index 6a0a3eeb5ae..e5b25a37976 100644 --- a/spec/frontend/monitoring/mock_data.js +++ b/spec/frontend/monitoring/mock_data.js @@ -5,23 +5,6 @@ import { TEST_HOST } from '../helpers/test_constants'; export const mockProjectDir = '/frontend-fixtures/environments-project'; export const mockApiEndpoint = `${TEST_HOST}/monitoring/mock`; -export const propsData = { - hasMetrics: false, - documentationPath: '/path/to/docs', - settingsPath: '/path/to/settings', - clustersPath: '/path/to/clusters', - tagsPath: '/path/to/tags', - defaultBranch: 'master', - emptyGettingStartedSvgPath: '/path/to/getting-started.svg', - emptyLoadingSvgPath: '/path/to/loading.svg', - emptyNoDataSvgPath: '/path/to/no-data.svg', - emptyNoDataSmallSvgPath: '/path/to/no-data-small.svg', - emptyUnableToConnectSvgPath: '/path/to/unable-to-connect.svg', - customMetricsAvailable: false, - customMetricsPath: '', - validateQueryPath: '', -}; - export const customDashboardBasePath = '.gitlab/dashboards'; const customDashboardsData = new Array(30).fill(null).map((_, idx) => ({ diff --git a/spec/frontend/monitoring/pages/dashboard_page_spec.js b/spec/frontend/monitoring/pages/dashboard_page_spec.js index e3c56ef4cbf..974dda5d3de 100644 --- a/spec/frontend/monitoring/pages/dashboard_page_spec.js +++ b/spec/frontend/monitoring/pages/dashboard_page_spec.js @@ -1,7 +1,7 @@ import { shallowMount } from '@vue/test-utils'; import DashboardPage from '~/monitoring/pages/dashboard_page.vue'; import Dashboard from '~/monitoring/components/dashboard.vue'; -import { propsData } from '../mock_data'; +import { dashboardProps } from '../fixture_data'; describe('monitoring/pages/dashboard_page', () => { let wrapper; @@ -28,9 +28,18 @@ describe('monitoring/pages/dashboard_page', () => { }); it('renders the dashboard page with dashboard component', () => { - buildWrapper({ dashboardProps: propsData }); + buildWrapper({ dashboardProps }); + + const allProps = { + ...dashboardProps, + // default props values + rearrangePanelsAvailable: false, + showHeader: true, + showPanels: true, + smallEmptyState: false, + }; - expect(findDashboardComponent().props()).toMatchObject(propsData); expect(findDashboardComponent()).toExist(); + expect(allProps).toMatchObject(findDashboardComponent().props()); }); }); diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_suggest_pipeline_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_suggest_pipeline_spec.js index b77305277ea..e2673653ac4 100644 --- a/spec/frontend/vue_mr_widget/components/mr_widget_suggest_pipeline_spec.js +++ b/spec/frontend/vue_mr_widget/components/mr_widget_suggest_pipeline_spec.js @@ -1,23 +1,25 @@ import { mount } from '@vue/test-utils'; import { GlLink, GlSprintf } from '@gitlab/ui'; import suggestPipelineComponent from '~/vue_merge_request_widget/components/mr_widget_suggest_pipeline.vue'; -import stubChildren from 'helpers/stub_children'; -import PipelineTourState from '~/vue_merge_request_widget/components/states/mr_widget_pipeline_tour.vue'; import MrWidgetIcon from '~/vue_merge_request_widget/components/mr_widget_icon.vue'; import { mockTracking, triggerEvent, unmockTracking } from 'helpers/tracking_helper'; +import { popoverProps, iconName } from './pipeline_tour_mock_data'; -describe('MRWidgetHeader', () => { +describe('MRWidgetSuggestPipeline', () => { let wrapper; - const pipelinePath = '/foo/bar/add/pipeline/path'; - const pipelineSvgPath = '/foo/bar/pipeline/svg/path'; - const humanAccess = 'maintainer'; - const iconName = 'status_notfound'; + let trackingSpy; + + const mockTrackingOnWrapper = () => { + trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn); + }; beforeEach(() => { + document.body.dataset.page = 'projects:merge_requests:show'; + trackingSpy = mockTracking('_category_', undefined, jest.spyOn); + wrapper = mount(suggestPipelineComponent, { - propsData: { pipelinePath, pipelineSvgPath, humanAccess }, + propsData: popoverProps, stubs: { - ...stubChildren(PipelineTourState), GlSprintf, }, }); @@ -25,14 +27,17 @@ describe('MRWidgetHeader', () => { afterEach(() => { wrapper.destroy(); + unmockTracking(); }); describe('template', () => { + const findOkBtn = () => wrapper.find('[data-testid="ok"]'); + it('renders add pipeline file link', () => { const link = wrapper.find(GlLink); expect(link.exists()).toBe(true); - expect(link.attributes().href).toBe(pipelinePath); + expect(link.attributes().href).toBe(popoverProps.pipelinePath); }); it('renders the expected text', () => { @@ -52,25 +57,60 @@ describe('MRWidgetHeader', () => { ); }); + it('renders the show me how button', () => { + const button = findOkBtn(); + + expect(button.exists()).toBe(true); + expect(button.classes('btn-info')).toEqual(true); + expect(button.attributes('href')).toBe(popoverProps.pipelinePath); + }); + + it('renders the help link', () => { + const link = wrapper.find('[data-testid="help"]'); + + expect(link.exists()).toBe(true); + expect(link.attributes('href')).toBe(wrapper.vm.$options.helpURL); + }); + + it('renders the empty pipelines image', () => { + const image = wrapper.find('[data-testid="pipeline-image"]'); + + expect(image.exists()).toBe(true); + expect(image.attributes().src).toBe(popoverProps.pipelineSvgPath); + }); + describe('tracking', () => { - let spy; + it('send event for basic view of the suggest pipeline widget', () => { + const expectedCategory = undefined; + const expectedAction = undefined; - beforeEach(() => { - spy = mockTracking('_category_', wrapper.element, jest.spyOn); + expect(trackingSpy).toHaveBeenCalledWith(expectedCategory, expectedAction, { + label: wrapper.vm.$options.trackLabel, + property: popoverProps.humanAccess, + }); }); - afterEach(() => { - unmockTracking(); + it('send an event when add pipeline link is clicked', () => { + mockTrackingOnWrapper(); + const link = wrapper.find('[data-testid="add-pipeline-link"]'); + triggerEvent(link.element); + + expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_link', { + label: wrapper.vm.$options.trackLabel, + property: popoverProps.humanAccess, + value: '30', + }); }); it('send an event when ok button is clicked', () => { - const link = wrapper.find(GlLink); - triggerEvent(link.element); + mockTrackingOnWrapper(); + const okBtn = findOkBtn(); + triggerEvent(okBtn.element); - expect(spy).toHaveBeenCalledWith('_category_', 'click_link', { - label: 'no_pipeline_noticed', - property: humanAccess, - value: '30', + expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_button', { + label: wrapper.vm.$options.trackLabel, + property: popoverProps.humanAccess, + value: '10', }); }); }); diff --git a/spec/frontend/vue_mr_widget/components/pipeline_tour_mock_data.js b/spec/frontend/vue_mr_widget/components/pipeline_tour_mock_data.js new file mode 100644 index 00000000000..c749c434079 --- /dev/null +++ b/spec/frontend/vue_mr_widget/components/pipeline_tour_mock_data.js @@ -0,0 +1,7 @@ +export const popoverProps = { + pipelinePath: '/foo/bar/add/pipeline/path', + pipelineSvgPath: 'assets/illustrations/something.svg', + humanAccess: 'maintainer', +}; + +export const iconName = 'status_notfound'; diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_pipeline_tour_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_pipeline_tour_spec.js deleted file mode 100644 index acb7316ae27..00000000000 --- a/spec/frontend/vue_mr_widget/components/states/mr_widget_pipeline_tour_spec.js +++ /dev/null @@ -1,153 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { GlPopover, GlLink, GlSprintf } from '@gitlab/ui'; -import Cookies from 'js-cookie'; -import { mockTracking, triggerEvent, unmockTracking } from 'helpers/tracking_helper'; -import pipelineTourState from '~/vue_merge_request_widget/components/states/mr_widget_pipeline_tour.vue'; -import { popoverProps, cookieKey } from './pipeline_tour_mock_data'; - -describe('MRWidgetPipelineTour', () => { - let wrapper; - - afterEach(() => { - wrapper.destroy(); - }); - - describe('template', () => { - describe(`when ${cookieKey} cookie is set`, () => { - beforeEach(() => { - Cookies.set(cookieKey, true); - wrapper = shallowMount(pipelineTourState, { - propsData: popoverProps, - }); - }); - - it('does not render the popover', () => { - const popover = wrapper.find(GlPopover); - - expect(popover.exists()).toBe(false); - }); - - describe('tracking', () => { - let trackingSpy; - - beforeEach(() => { - trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn); - }); - - afterEach(() => { - unmockTracking(); - }); - it('does not call tracking', () => { - expect(trackingSpy).not.toHaveBeenCalled(); - }); - }); - }); - - describe(`when ${cookieKey} cookie is not set`, () => { - const findOkBtn = () => wrapper.find({ ref: 'ok' }); - const findDismissBtn = () => wrapper.find({ ref: 'no-thanks' }); - - beforeEach(() => { - Cookies.remove(cookieKey); - wrapper = shallowMount(pipelineTourState, { - propsData: popoverProps, - stubs: { - GlSprintf, - }, - }); - }); - - it('renders the popover', () => { - const popover = wrapper.find(GlPopover); - - expect(popover.exists()).toBe(true); - }); - - it('renders the help link', () => { - const link = wrapper.find(GlLink); - - expect(link.exists()).toBe(true); - expect(link.attributes('href')).toBe(wrapper.vm.$options.helpURL); - }); - - it('renders the show me how button', () => { - const button = findOkBtn(); - - expect(button.exists()).toBe(true); - expect(button.attributes().category).toBe('primary'); - }); - - it('renders the dismiss button', () => { - const button = findDismissBtn(); - - expect(button.exists()).toBe(true); - expect(button.attributes().category).toBe('secondary'); - }); - - it('renders the empty pipelines image', () => { - const image = wrapper.find('img'); - - expect(image.exists()).toBe(true); - expect(image.attributes().src).toBe(popoverProps.pipelineSvgPath); - }); - - describe('tracking', () => { - let trackingSpy; - - beforeEach(() => { - trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn); - }); - - afterEach(() => { - unmockTracking(); - }); - - it('send event for basic view of popover', () => { - document.body.dataset.page = 'projects:merge_requests:show'; - - wrapper.vm.trackOnShow(); - - expect(trackingSpy).toHaveBeenCalledWith(undefined, undefined, { - label: popoverProps.trackLabel, - property: popoverProps.humanAccess, - }); - }); - - it('send an event when ok button is clicked', () => { - const okBtn = findOkBtn(); - triggerEvent(okBtn.element); - - expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_button', { - label: popoverProps.trackLabel, - property: popoverProps.humanAccess, - value: '10', - }); - }); - - it('send an event when dismiss button is clicked', () => { - const dismissBtn = findDismissBtn(); - triggerEvent(dismissBtn.element); - - expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_button', { - label: popoverProps.trackLabel, - property: popoverProps.humanAccess, - value: '20', - }); - }); - }); - - describe('dismissPopover', () => { - it('updates popoverDismissed', () => { - const button = findDismissBtn(); - const popover = wrapper.find(GlPopover); - button.vm.$emit('click'); - - return wrapper.vm.$nextTick().then(() => { - expect(Cookies.get(cookieKey)).toBe('true'); - expect(popover.exists()).toBe(false); - }); - }); - }); - }); - }); -}); diff --git a/spec/frontend/vue_mr_widget/components/states/pipeline_tour_mock_data.js b/spec/frontend/vue_mr_widget/components/states/pipeline_tour_mock_data.js deleted file mode 100644 index 39bc89e459c..00000000000 --- a/spec/frontend/vue_mr_widget/components/states/pipeline_tour_mock_data.js +++ /dev/null @@ -1,10 +0,0 @@ -export const popoverProps = { - pipelinePath: '/foo/bar/add/pipeline/path', - pipelineSvgPath: 'assets/illustrations/something.svg', - humanAccess: 'maintainer', - popoverTarget: 'suggest-popover', - popoverContainer: 'suggest-pipeline', - trackLabel: 'some_tracking_label', -}; - -export const cookieKey = 'suggest_pipeline_dismissed'; diff --git a/spec/frontend/vue_shared/components/rich_content_editor/mock_data.js b/spec/frontend/vue_shared/components/rich_content_editor/mock_data.js index f6d2717e117..629105dd085 100644 --- a/spec/frontend/vue_shared/components/rich_content_editor/mock_data.js +++ b/spec/frontend/vue_shared/components/rich_content_editor/mock_data.js @@ -19,9 +19,7 @@ const buildMockTextNodeWithAdjacentInlineCode = isForward => { type: 'code', [direction]: { literal: isForward ? literalClose : literalOpen, - [direction]: { - literal: null, - }, + [direction]: null, }, }, }; @@ -47,6 +45,7 @@ export const kramdownTextNode = buildMockTextNode('{:toc}'); export const identifierTextNode = buildMockTextNode('[Some text]: https://link.com'); export const identifierInlineCodeTextEnteringNode = buildMockTextNodeWithAdjacentInlineCode(true); export const identifierInlineCodeTextExitingNode = buildMockTextNodeWithAdjacentInlineCode(false); +export const embeddedRubyTextNode = buildMockTextNode('<%= partial("some/path") %>'); export const normalTextNode = buildMockTextNode('This is just normal text.'); const uneditableOpenToken = { diff --git a/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_embedded_ruby_spec.js b/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_embedded_ruby_spec.js new file mode 100644 index 00000000000..34a4efb6a69 --- /dev/null +++ b/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_embedded_ruby_spec.js @@ -0,0 +1,28 @@ +import renderer from '~/vue_shared/components/rich_content_editor/services/renderers/render_embedded_ruby_text'; +import { buildUneditableTokens } from '~/vue_shared/components/rich_content_editor/services/renderers/build_uneditable_token'; + +import { embeddedRubyTextNode, normalTextNode } from '../../mock_data'; + +describe('Render Embedded Ruby Text renderer', () => { + describe('canRender', () => { + it('should return true when the argument `literal` has embedded ruby syntax', () => { + expect(renderer.canRender(embeddedRubyTextNode)).toBe(true); + }); + + it('should return false when the argument `literal` lacks embedded ruby syntax', () => { + expect(renderer.canRender(normalTextNode)).toBe(false); + }); + }); + + describe('render', () => { + const origin = jest.fn(); + + it('should return uneditable tokens', () => { + const context = { origin }; + + expect(renderer.render(embeddedRubyTextNode, context)).toStrictEqual( + buildUneditableTokens(origin()), + ); + }); + }); +}); diff --git a/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_text_spec.js b/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_text_spec.js index 257a37d1af8..1a44ccbf0a8 100644 --- a/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_text_spec.js +++ b/spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_text_spec.js @@ -3,7 +3,7 @@ import { buildUneditableOpenTokens, buildUneditableCloseTokens, buildUneditableTokens, -} from '~/vue_shared/components/rich_content_editor/services/renderers//build_uneditable_token'; +} from '~/vue_shared/components/rich_content_editor/services/renderers/build_uneditable_token'; import { identifierTextNode, |