summaryrefslogtreecommitdiff
path: root/spec/frontend
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-07-02 15:09:08 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-07-02 15:09:08 +0000
commit840d5ecdbbf8da3e03a7f0b8b465a89d1519807c (patch)
tree4e197815c026a947057f7b5cbcb5e3cf106cc22f /spec/frontend
parentb0107e8756bf3287f8a6221252c800209a9c46f6 (diff)
downloadgitlab-ce-840d5ecdbbf8da3e03a7f0b8b465a89d1519807c.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
-rw-r--r--spec/frontend/monitoring/mock_data.js17
-rw-r--r--spec/frontend/monitoring/pages/dashboard_page_spec.js15
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_suggest_pipeline_spec.js82
-rw-r--r--spec/frontend/vue_mr_widget/components/pipeline_tour_mock_data.js7
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_pipeline_tour_spec.js153
-rw-r--r--spec/frontend/vue_mr_widget/components/states/pipeline_tour_mock_data.js10
-rw-r--r--spec/frontend/vue_shared/components/rich_content_editor/mock_data.js5
-rw-r--r--spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_embedded_ruby_spec.js28
-rw-r--r--spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_identifier_text_spec.js2
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,