summaryrefslogtreecommitdiff
path: root/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js')
-rw-r--r--spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js141
1 files changed, 141 insertions, 0 deletions
diff --git a/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js b/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js
new file mode 100644
index 00000000000..76b6efa15b6
--- /dev/null
+++ b/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js
@@ -0,0 +1,141 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlIcon } from '@gitlab/ui';
+import {
+ mockRegularLabel,
+ mockScopedLabel,
+} from 'jest/sidebar/components/labels/labels_select_widget/mock_data';
+import IssuableLabelSelector from '~/vue_shared/issuable/create/components/issuable_label_selector.vue';
+import LabelsSelect from '~/sidebar/components/labels/labels_select_widget/labels_select_root.vue';
+import {
+ DropdownVariant,
+ LabelType,
+} from '~/sidebar/components/labels/labels_select_widget/constants';
+import { WorkspaceType } from '~/issues/constants';
+import { __ } from '~/locale';
+
+const allowLabelRemove = true;
+const attrWorkspacePath = '/workspace-path';
+const fieldName = 'field_name[]';
+const fullPath = '/full-path';
+const labelsFilterBasePath = '/labels-filter-base-path';
+const initialLabels = [];
+const issuableType = 'issue';
+const labelType = LabelType.project;
+const variant = DropdownVariant.Embedded;
+const workspaceType = WorkspaceType.project;
+
+describe('IssuableLabelSelector', () => {
+ let wrapper;
+
+ const findTitle = () => wrapper.find('label').text().replace(/\s+/, ' ');
+ const findLabelIcon = () => wrapper.findComponent(GlIcon);
+ const findAllHiddenInputs = () => wrapper.findAll('input[type="hidden"]');
+ const findLabelSelector = () => wrapper.findComponent(LabelsSelect);
+
+ const createComponent = (injectedProps = {}) => {
+ return shallowMount(IssuableLabelSelector, {
+ provide: {
+ allowLabelRemove,
+ attrWorkspacePath,
+ fieldName,
+ fullPath,
+ labelsFilterBasePath,
+ initialLabels,
+ issuableType,
+ labelType,
+ variant,
+ workspaceType,
+ ...injectedProps,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const expectTitleWithCount = (count) => {
+ const title = findTitle();
+
+ expect(title).toContain(__('Labels'));
+ expect(title).toContain(count.toString());
+ };
+
+ describe('by default', () => {
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ it('has the selected labels count', () => {
+ expectTitleWithCount(0);
+ expect(findLabelIcon().props('name')).toBe('labels');
+ });
+
+ it('has the label selector', () => {
+ expect(findLabelSelector().props()).toMatchObject({
+ allowLabelRemove,
+ allowMultiselect: true,
+ showEmbeddedLabelsList: true,
+ fullPath,
+ attrWorkspacePath,
+ labelsFilterBasePath,
+ dropdownButtonText: __('Select label'),
+ labelsListTitle: __('Select label'),
+ footerCreateLabelTitle: __('Create project label'),
+ footerManageLabelTitle: __('Manage project labels'),
+ variant,
+ workspaceType,
+ labelCreateType: labelType,
+ selectedLabels: initialLabels,
+ });
+
+ expect(findLabelSelector().text()).toBe(__('None'));
+ });
+ });
+
+ it('passing initial labels applies them to the form', () => {
+ wrapper = createComponent({ initialLabels: [mockRegularLabel, mockScopedLabel] });
+
+ expectTitleWithCount(2);
+ expect(findLabelSelector().props('selectedLabels')).toStrictEqual([
+ mockRegularLabel,
+ mockScopedLabel,
+ ]);
+ expect(findAllHiddenInputs().wrappers.map((input) => input.element.value)).toStrictEqual([
+ `${mockRegularLabel.id}`,
+ `${mockScopedLabel.id}`,
+ ]);
+ });
+
+ it('updates the selected labels on the `updateSelectedLabels` event', async () => {
+ wrapper = createComponent();
+
+ expectTitleWithCount(0);
+ expect(findLabelSelector().props('selectedLabels')).toStrictEqual([]);
+ expect(findAllHiddenInputs()).toHaveLength(0);
+
+ await findLabelSelector().vm.$emit('updateSelectedLabels', { labels: [mockRegularLabel] });
+
+ expectTitleWithCount(1);
+ expect(findLabelSelector().props('selectedLabels')).toStrictEqual([mockRegularLabel]);
+ expect(findAllHiddenInputs().wrappers.map((input) => input.element.value)).toStrictEqual([
+ `${mockRegularLabel.id}`,
+ ]);
+ });
+
+ it('updates the selected labels on the `onLabelRemove` event', async () => {
+ wrapper = createComponent({ initialLabels: [mockRegularLabel] });
+
+ expectTitleWithCount(1);
+ expect(findLabelSelector().props('selectedLabels')).toStrictEqual([mockRegularLabel]);
+ expect(findAllHiddenInputs().wrappers.map((input) => input.element.value)).toStrictEqual([
+ `${mockRegularLabel.id}`,
+ ]);
+
+ await findLabelSelector().vm.$emit('onLabelRemove', mockRegularLabel.id);
+
+ expectTitleWithCount(0);
+ expect(findLabelSelector().props('selectedLabels')).toStrictEqual([]);
+ expect(findAllHiddenInputs()).toHaveLength(0);
+ });
+});