Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js')
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js141
1 files changed, 55 insertions, 86 deletions
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 84f0151d9db..dd9bf2ff598 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
@@ -1,5 +1,6 @@
-import { GlFilteredSearchToken } from '@gitlab/ui';
+import { GlFilteredSearchToken, GlLoadingIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
+import { nextTick } from 'vue';
import {
mockRegularLabel,
mockLabels,
@@ -61,13 +62,10 @@ const mockProps = {
getActiveTokenValue: (labels, data) => labels.find((label) => label.title === data),
};
-function createComponent({
- props = { ...mockProps },
- stubs = defaultStubs,
- slots = defaultSlots,
-} = {}) {
+function createComponent({ props = {}, stubs = defaultStubs, slots = defaultSlots } = {}) {
return mount(BaseToken, {
propsData: {
+ ...mockProps,
...props,
},
provide: {
@@ -83,15 +81,7 @@ function createComponent({
describe('BaseToken', () => {
let wrapper;
- beforeEach(() => {
- wrapper = createComponent({
- props: {
- ...mockProps,
- value: { data: `"${mockRegularLabel.title}"` },
- suggestions: mockLabels,
- },
- });
- });
+ const findGlFilteredSearchToken = () => wrapper.findComponent(GlFilteredSearchToken);
afterEach(() => {
wrapper.destroy();
@@ -99,21 +89,25 @@ describe('BaseToken', () => {
describe('data', () => {
it('calls `getRecentlyUsedSuggestions` to populate `recentSuggestions` when `recentSuggestionsStorageKey` is defined', () => {
+ wrapper = createComponent();
+
expect(getRecentlyUsedSuggestions).toHaveBeenCalledWith(mockStorageKey);
});
});
describe('computed', () => {
describe('activeTokenValue', () => {
- it('calls `getActiveTokenValue` when it is provided', async () => {
+ it('calls `getActiveTokenValue` when it is provided', () => {
const mockGetActiveTokenValue = jest.fn();
- wrapper.setProps({
- getActiveTokenValue: mockGetActiveTokenValue,
+ wrapper = createComponent({
+ props: {
+ value: { data: `"${mockRegularLabel.title}"` },
+ suggestions: mockLabels,
+ getActiveTokenValue: mockGetActiveTokenValue,
+ },
});
- await wrapper.vm.$nextTick();
-
expect(mockGetActiveTokenValue).toHaveBeenCalledTimes(1);
expect(mockGetActiveTokenValue).toHaveBeenCalledWith(
mockLabels,
@@ -125,33 +119,19 @@ describe('BaseToken', () => {
describe('watch', () => {
describe('active', () => {
- let wrapperWithTokenActive;
-
beforeEach(() => {
- wrapperWithTokenActive = createComponent({
+ wrapper = createComponent({
props: {
- ...mockProps,
value: { data: `"${mockRegularLabel.title}"` },
active: true,
},
});
});
- afterEach(() => {
- wrapperWithTokenActive.destroy();
- });
-
it('emits `fetch-suggestions` event on the component when value of this prop is changed to false and `suggestions` array is empty', async () => {
- wrapperWithTokenActive.setProps({
- active: false,
- });
-
- await wrapperWithTokenActive.vm.$nextTick();
+ await wrapper.setProps({ active: false });
- expect(wrapperWithTokenActive.emitted('fetch-suggestions')).toBeTruthy();
- expect(wrapperWithTokenActive.emitted('fetch-suggestions')).toEqual([
- [`"${mockRegularLabel.title}"`],
- ]);
+ expect(wrapper.emitted('fetch-suggestions')).toEqual([[`"${mockRegularLabel.title}"`]]);
});
});
});
@@ -161,17 +141,15 @@ describe('BaseToken', () => {
const mockTokenValue = mockLabels[0];
it('calls `setTokenValueToRecentlyUsed` when `recentSuggestionsStorageKey` is defined', () => {
+ wrapper = createComponent({ props: { suggestions: mockLabels } });
+
wrapper.vm.handleTokenValueSelected(mockTokenValue.title);
expect(setTokenValueToRecentlyUsed).toHaveBeenCalledWith(mockStorageKey, mockTokenValue);
});
- it('does not add token from preloadedSuggestions', async () => {
- wrapper.setProps({
- preloadedSuggestions: [mockTokenValue],
- });
-
- await wrapper.vm.$nextTick();
+ it('does not add token from preloadedSuggestions', () => {
+ wrapper = createComponent({ props: { preloadedSuggestions: [mockTokenValue] } });
wrapper.vm.handleTokenValueSelected(mockTokenValue.title);
@@ -182,58 +160,60 @@ describe('BaseToken', () => {
describe('template', () => {
it('renders gl-filtered-search-token component', () => {
- const wrapperWithNoStubs = createComponent({
- stubs: {},
- });
- const glFilteredSearchToken = wrapperWithNoStubs.find(GlFilteredSearchToken);
-
- expect(glFilteredSearchToken.exists()).toBe(true);
- expect(glFilteredSearchToken.props('config')).toEqual(mockProps.config);
+ wrapper = createComponent({ stubs: {} });
- wrapperWithNoStubs.destroy();
+ expect(findGlFilteredSearchToken().props('config')).toEqual(mockProps.config);
});
it('renders `view-token` slot when present', () => {
+ wrapper = createComponent();
+
expect(wrapper.find('.js-view-token').exists()).toBe(true);
});
it('renders `view` slot when present', () => {
+ wrapper = createComponent();
+
expect(wrapper.find('.js-view').exists()).toBe(true);
});
- describe('events', () => {
- let wrapperWithNoStubs;
-
- afterEach(() => {
- wrapperWithNoStubs.destroy();
+ it('renders loading spinner when loading', () => {
+ wrapper = createComponent({
+ props: {
+ active: true,
+ config: mockLabelToken,
+ suggestionsLoading: true,
+ },
+ stubs: { Portal: true },
});
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
+ });
+
+ describe('events', () => {
describe('when activeToken has been selected', () => {
beforeEach(() => {
- wrapperWithNoStubs = createComponent({
- props: {
- ...mockProps,
- getActiveTokenValue: () => ({ title: '' }),
- suggestionsLoading: true,
- },
+ wrapper = createComponent({
+ props: { getActiveTokenValue: () => ({ title: '' }) },
stubs: { Portal: true },
});
});
+
it('does not emit `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
jest.useFakeTimers();
- wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' });
- await wrapperWithNoStubs.vm.$nextTick();
+ findGlFilteredSearchToken().vm.$emit('input', { data: 'foo' });
+ await nextTick();
jest.runAllTimers();
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')).toEqual([['']]);
+ expect(wrapper.emitted('fetch-suggestions')).toEqual([['']]);
});
});
describe('when activeToken has not been selected', () => {
beforeEach(() => {
- wrapperWithNoStubs = createComponent({
+ wrapper = createComponent({
stubs: { Portal: true },
});
});
@@ -241,38 +221,27 @@ describe('BaseToken', () => {
it('emits `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
jest.useFakeTimers();
- wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' });
- await wrapperWithNoStubs.vm.$nextTick();
+ findGlFilteredSearchToken().vm.$emit('input', { data: 'foo' });
+ await nextTick();
jest.runAllTimers();
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')).toBeTruthy();
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')[2]).toEqual(['foo']);
+ expect(wrapper.emitted('fetch-suggestions')[2]).toEqual(['foo']);
});
describe('when search is started with a quote', () => {
- it('emits `fetch-suggestions` with filtered value', async () => {
- jest.useFakeTimers();
-
- wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: '"foo' });
- await wrapperWithNoStubs.vm.$nextTick();
+ it('emits `fetch-suggestions` with filtered value', () => {
+ findGlFilteredSearchToken().vm.$emit('input', { data: '"foo' });
- jest.runAllTimers();
-
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')[2]).toEqual(['foo']);
+ expect(wrapper.emitted('fetch-suggestions')[2]).toEqual(['foo']);
});
});
describe('when search starts and ends with a quote', () => {
- it('emits `fetch-suggestions` with filtered value', async () => {
- jest.useFakeTimers();
-
- wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: '"foo"' });
- await wrapperWithNoStubs.vm.$nextTick();
-
- jest.runAllTimers();
+ it('emits `fetch-suggestions` with filtered value', () => {
+ findGlFilteredSearchToken().vm.$emit('input', { data: '"foo"' });
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')[2]).toEqual(['foo']);
+ expect(wrapper.emitted('fetch-suggestions')[2]).toEqual(['foo']);
});
});
});