diff options
Diffstat (limited to 'spec/frontend/issues_list')
-rw-r--r-- | spec/frontend/issues_list/components/issuable_spec.js | 37 | ||||
-rw-r--r-- | spec/frontend/issues_list/components/issuables_list_app_spec.js | 84 |
2 files changed, 90 insertions, 31 deletions
diff --git a/spec/frontend/issues_list/components/issuable_spec.js b/spec/frontend/issues_list/components/issuable_spec.js index b47a84ad7f6..a8bf124373b 100644 --- a/spec/frontend/issues_list/components/issuable_spec.js +++ b/spec/frontend/issues_list/components/issuable_spec.js @@ -1,20 +1,26 @@ -import { shallowMount } from '@vue/test-utils'; import { GlSprintf, GlLabel, GlIcon } from '@gitlab/ui'; +import { shallowMount } from '@vue/test-utils'; import { TEST_HOST } from 'helpers/test_constants'; import { trimText } from 'helpers/text_helper'; -import initUserPopovers from '~/user_popovers'; +import Issuable from '~/issues_list/components/issuable.vue'; +import { isScopedLabel } from '~/lib/utils/common_utils'; import { formatDate } from '~/lib/utils/datetime_utility'; import { mergeUrlParams } from '~/lib/utils/url_utility'; -import Issuable from '~/issues_list/components/issuable.vue'; +import initUserPopovers from '~/user_popovers'; import IssueAssignees from '~/vue_shared/components/issue/issue_assignees.vue'; import { simpleIssue, testAssignees, testLabels } from '../issuable_list_test_data'; -import { isScopedLabel } from '~/lib/utils/common_utils'; jest.mock('~/user_popovers'); -const TEST_NOW = '2019-08-28T20:03:04.713Z'; -const TEST_MONTH_AGO = '2019-07-28'; -const TEST_MONTH_LATER = '2019-09-30'; +const TODAY = new Date(); + +const createTestDateFromDelta = (timeDelta) => + formatDate(new Date(TODAY.getTime() + timeDelta), 'yyyy-mm-dd'); + +// TODO: Encapsulate date helpers https://gitlab.com/gitlab-org/gitlab/-/issues/320883 +const MONTHS_IN_MS = 1000 * 60 * 60 * 24 * 31; +const TEST_MONTH_AGO = createTestDateFromDelta(-MONTHS_IN_MS); +const TEST_MONTH_LATER = createTestDateFromDelta(MONTHS_IN_MS); const DATE_FORMAT = 'mmm d, yyyy'; const TEST_USER_NAME = 'Tyler Durden'; const TEST_BASE_URL = `${TEST_HOST}/issues`; @@ -26,16 +32,8 @@ const TEST_MILESTONE = { const TEXT_CLOSED = 'CLOSED'; const TEST_META_COUNT = 100; -// Use FixedDate so that time sensitive info in snapshots don't fail -class FixedDate extends Date { - constructor(date = TEST_NOW) { - super(date); - } -} - describe('Issuable component', () => { let issuable; - let DateOrig; let wrapper; const factory = (props = {}, scopedLabelsAvailable = false) => { @@ -63,15 +61,6 @@ describe('Issuable component', () => { wrapper = null; }); - beforeAll(() => { - DateOrig = window.Date; - window.Date = FixedDate; - }); - - afterAll(() => { - window.Date = DateOrig; - }); - const checkExists = (findFn) => () => findFn().exists(); const hasIcon = (iconName, iconWrapper = wrapper) => iconWrapper.findAll(GlIcon).wrappers.some((icon) => icon.props('name') === iconName); diff --git a/spec/frontend/issues_list/components/issuables_list_app_spec.js b/spec/frontend/issues_list/components/issuables_list_app_spec.js index 9d603099ff7..fe3d2114463 100644 --- a/spec/frontend/issues_list/components/issuables_list_app_spec.js +++ b/spec/frontend/issues_list/components/issuables_list_app_spec.js @@ -1,19 +1,19 @@ -import axios from 'axios'; -import MockAdapter from 'axios-mock-adapter'; -import { shallowMount } from '@vue/test-utils'; import { GlEmptyState, GlPagination, GlDeprecatedSkeletonLoading as GlSkeletonLoading, } from '@gitlab/ui'; -import waitForPromises from 'helpers/wait_for_promises'; +import { shallowMount } from '@vue/test-utils'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; import { TEST_HOST } from 'helpers/test_constants'; +import waitForPromises from 'helpers/wait_for_promises'; import { deprecatedCreateFlash as flash } from '~/flash'; -import IssuablesListApp from '~/issues_list/components/issuables_list_app.vue'; import Issuable from '~/issues_list/components/issuable.vue'; -import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; -import issueablesEventBus from '~/issues_list/eventhub'; +import IssuablesListApp from '~/issues_list/components/issuables_list_app.vue'; import { PAGE_SIZE, PAGE_SIZE_MANUAL, RELATIVE_POSITION } from '~/issues_list/constants'; +import issueablesEventBus from '~/issues_list/eventhub'; +import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; jest.mock('~/flash'); jest.mock('~/issues_list/eventhub'); @@ -591,5 +591,75 @@ describe('Issuables list component', () => { expect(findFilteredSearchBar().props('initialFilterValue')).toEqual(['free text']); }); }); + + describe('on filter search', () => { + beforeEach(() => { + factory({ type: 'jira' }); + + window.history.pushState = jest.fn(); + }); + + afterEach(() => { + window.history.pushState.mockRestore(); + }); + + const emitOnFilter = (filter) => findFilteredSearchBar().vm.$emit('onFilter', filter); + + describe('empty filter', () => { + const mockFilter = []; + + it('updates URL with correct params', () => { + emitOnFilter(mockFilter); + + expect(window.history.pushState).toHaveBeenCalledWith( + {}, + '', + `${TEST_LOCATION}?state=opened`, + ); + }); + }); + + describe('filter with search term', () => { + const mockFilter = [ + { + type: 'filtered-search-term', + value: { data: 'free' }, + }, + ]; + + it('updates URL with correct params', () => { + emitOnFilter(mockFilter); + + expect(window.history.pushState).toHaveBeenCalledWith( + {}, + '', + `${TEST_LOCATION}?state=opened&search=free`, + ); + }); + }); + + describe('filter with multiple search terms', () => { + const mockFilter = [ + { + type: 'filtered-search-term', + value: { data: 'free' }, + }, + { + type: 'filtered-search-term', + value: { data: 'text' }, + }, + ]; + + it('updates URL with correct params', () => { + emitOnFilter(mockFilter); + + expect(window.history.pushState).toHaveBeenCalledWith( + {}, + '', + `${TEST_LOCATION}?state=opened&search=free+text`, + ); + }); + }); + }); }); }); |