mirror of
https://github.com/grafana/grafana.git
synced 2024-12-01 21:19:28 -06:00
d04dce6a37
* Search: add search wrapper * Search: add DashboardSearch.tsx * Search: enable search * Search: update types * Search: useReducer for saving search results * Search: use default query * Search: add toggle custom action * Search: add onQueryChange * Search: debounce search * Search: pas dispatch as a prop * Search: add tag filter * Search: Fix types * Search: revert changes * Search: close overlay on esc * Search: enable tag filtering * Search: clear query * Search: add autofocus to search field * Search: Rename close to closeSearch * Search: Add no results message * Search: Add loading state * Search: Remove Select from Forms namespace * Remove Add selectedIndex * Remove Add getFlattenedSections * Remove Enable selecting items * Search: add hasId * Search: preselect first item * Search: Add utils tests * Search: Fix moving selection down * Search: Add findSelected * Search: Add type to section * Search: Handle Enter key press on item highlight * Search: Move reducer et al. to separate files * Search: Remove redundant render check * Search: Close overlay on Esc and ArrowLeft press * Search: Add close button * Search: Document utils * Search: use Icon for remove icon * Search: Add DashboardSearch.test.tsx * Search: Move test data to a separate file * Search: Finalise DashboardSearch.test.tsx * Add search reducer tests * Search: Add search results loading indicator * Search: Remove inline function * Search: Do not mutate item * Search: Tweak utils * Search: Do not clear query on tag clear * Search: Fix folder:current search * Search: Fix results scroll * Search: Update tests * Search: Close overlay on cog icon click * Add mobile styles for close button * Search: Use CustomScrollbar * Search: Memoize TagList.tsx * Search: Fix type errors * Search: More strictNullChecks fixes * Search: Consistent handler names * Search: Fix search items types in test * Search: Fix merge conflicts * Search: Fix strictNullChecks errors
107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
import React from 'react';
|
|
import { mount } from 'enzyme';
|
|
import { act } from 'react-dom/test-utils';
|
|
import { mockSearch } from './mocks';
|
|
import { DashboardSearch } from './DashboardSearch';
|
|
import { searchResults } from '../testData';
|
|
|
|
beforeEach(() => {
|
|
jest.useFakeTimers();
|
|
mockSearch.mockClear();
|
|
});
|
|
|
|
afterEach(() => {
|
|
jest.useRealTimers();
|
|
});
|
|
|
|
/**
|
|
* Need to wrap component render in async act and use jest.runAllTimers to test
|
|
* calls inside useDebounce hook
|
|
*/
|
|
describe('DashboardSearch', () => {
|
|
it('should call search api with default query when initialised', async () => {
|
|
await act(() => {
|
|
mount(<DashboardSearch onCloseSearch={() => {}} />);
|
|
jest.runAllTimers();
|
|
});
|
|
|
|
expect(mockSearch).toHaveBeenCalledTimes(1);
|
|
expect(mockSearch).toHaveBeenCalledWith({
|
|
query: '',
|
|
parsedQuery: { text: '' },
|
|
tags: [],
|
|
tag: [],
|
|
starred: false,
|
|
folderIds: [],
|
|
});
|
|
});
|
|
|
|
it('should call api with updated query on query change', async () => {
|
|
let wrapper: any;
|
|
await act(() => {
|
|
wrapper = mount(<DashboardSearch onCloseSearch={() => {}} />);
|
|
jest.runAllTimers();
|
|
});
|
|
|
|
await act(() => {
|
|
wrapper.find({ placeholder: 'Search dashboards by name' }).prop('onChange')({ currentTarget: { value: 'Test' } });
|
|
jest.runAllTimers();
|
|
});
|
|
|
|
expect(mockSearch).toHaveBeenCalledWith({
|
|
query: 'Test',
|
|
parsedQuery: { text: 'Test' },
|
|
tags: [],
|
|
tag: [],
|
|
starred: false,
|
|
folderIds: [],
|
|
});
|
|
});
|
|
|
|
it("should render 'No results' message when there are no dashboards", async () => {
|
|
let wrapper: any;
|
|
await act(() => {
|
|
wrapper = mount(<DashboardSearch onCloseSearch={() => {}} />);
|
|
jest.runAllTimers();
|
|
});
|
|
wrapper.update();
|
|
expect(
|
|
wrapper.findWhere((c: any) => c.type() === 'h6' && c.text() === 'No dashboards matching your query were found.')
|
|
).toHaveLength(1);
|
|
});
|
|
|
|
it('should render search results', async () => {
|
|
//@ts-ignore
|
|
mockSearch.mockImplementation(() => Promise.resolve(searchResults));
|
|
let wrapper: any;
|
|
await act(() => {
|
|
wrapper = mount(<DashboardSearch onCloseSearch={() => {}} />);
|
|
jest.runAllTimers();
|
|
});
|
|
wrapper.update();
|
|
expect(wrapper.find({ 'aria-label': 'Search section' })).toHaveLength(2);
|
|
expect(wrapper.find({ 'aria-label': 'Search items' }).children()).toHaveLength(2);
|
|
});
|
|
|
|
it('should call search with selected tags', async () => {
|
|
let wrapper: any;
|
|
await act(() => {
|
|
wrapper = mount(<DashboardSearch onCloseSearch={() => {}} />);
|
|
jest.runAllTimers();
|
|
});
|
|
|
|
await act(() => {
|
|
wrapper.find('TagFilter').prop('onChange')(['TestTag']);
|
|
jest.runAllTimers();
|
|
});
|
|
expect(mockSearch).toHaveBeenCalledWith({
|
|
query: '',
|
|
parsedQuery: { text: '' },
|
|
tags: ['TestTag'],
|
|
tag: ['TestTag'],
|
|
starred: false,
|
|
folderIds: [],
|
|
});
|
|
});
|
|
});
|