mirror of https://github.com/grafana/grafana
Tempo: Switch out Select with AsyncSelect component to get loading state in Tempo Search (#45110)
* Replace Select with AsyncSelect to get loading statepull/45555/head
parent
4fcbfab711
commit
fcd85951a7
@ -0,0 +1,109 @@ |
|||||||
|
import NativeSearch from './NativeSearch'; |
||||||
|
import React from 'react'; |
||||||
|
import { act, render, screen } from '@testing-library/react'; |
||||||
|
import { TempoDatasource, TempoQuery } from '../datasource'; |
||||||
|
import userEvent from '@testing-library/user-event'; |
||||||
|
|
||||||
|
const getOptions = jest.fn().mockImplementation(() => { |
||||||
|
return Promise.resolve([ |
||||||
|
{ |
||||||
|
value: 'customer', |
||||||
|
label: 'customer', |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: 'driver', |
||||||
|
label: 'driver', |
||||||
|
}, |
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
jest.mock('../language_provider', () => { |
||||||
|
return jest.fn().mockImplementation(() => { |
||||||
|
return { getOptions }; |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
const mockQuery = { |
||||||
|
refId: 'A', |
||||||
|
queryType: 'nativeSearch', |
||||||
|
key: 'Q-595a9bbc-2a25-49a7-9249-a52a0a475d83-0', |
||||||
|
serviceName: 'driver', |
||||||
|
} as TempoQuery; |
||||||
|
|
||||||
|
describe('NativeSearch', () => { |
||||||
|
it('should call the `onChange` function on click of the Input', async () => { |
||||||
|
const promise = Promise.resolve(); |
||||||
|
const handleOnChange = jest.fn(() => promise); |
||||||
|
const fakeOptionChoice = { |
||||||
|
key: 'Q-595a9bbc-2a25-49a7-9249-a52a0a475d83-0', |
||||||
|
queryType: 'nativeSearch', |
||||||
|
refId: 'A', |
||||||
|
serviceName: 'driver', |
||||||
|
spanName: 'driver', |
||||||
|
}; |
||||||
|
|
||||||
|
render( |
||||||
|
<NativeSearch |
||||||
|
datasource={{} as TempoDatasource} |
||||||
|
query={mockQuery} |
||||||
|
onChange={handleOnChange} |
||||||
|
onRunQuery={() => {}} |
||||||
|
/> |
||||||
|
); |
||||||
|
|
||||||
|
const asyncServiceSelect = await screen.findByRole('combobox', { name: 'select-span-name' }); |
||||||
|
|
||||||
|
expect(asyncServiceSelect).toBeInTheDocument(); |
||||||
|
userEvent.click(asyncServiceSelect); |
||||||
|
|
||||||
|
const driverOption = await screen.findByText('driver'); |
||||||
|
userEvent.click(driverOption); |
||||||
|
|
||||||
|
expect(handleOnChange).toHaveBeenCalledWith(fakeOptionChoice); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('TempoLanguageProvider with delay', () => { |
||||||
|
const getOptions2 = jest.fn().mockImplementation(() => { |
||||||
|
return Promise.resolve([ |
||||||
|
{ |
||||||
|
value: 'customer', |
||||||
|
label: 'customer', |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: 'driver', |
||||||
|
label: 'driver', |
||||||
|
}, |
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
jest.mock('../language_provider', () => { |
||||||
|
return jest.fn().mockImplementation(() => { |
||||||
|
setTimeout(() => { |
||||||
|
return { getOptions2 }; |
||||||
|
}, 3000); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show loader', async () => { |
||||||
|
const promise = Promise.resolve(); |
||||||
|
const handleOnChange = jest.fn(() => promise); |
||||||
|
|
||||||
|
render( |
||||||
|
<NativeSearch |
||||||
|
datasource={{} as TempoDatasource} |
||||||
|
query={mockQuery} |
||||||
|
onChange={handleOnChange} |
||||||
|
onRunQuery={() => {}} |
||||||
|
/> |
||||||
|
); |
||||||
|
|
||||||
|
const asyncServiceSelect = screen.getByRole('combobox', { name: 'select-span-name' }); |
||||||
|
|
||||||
|
userEvent.click(asyncServiceSelect); |
||||||
|
const loader = screen.getByText('Loading options...'); |
||||||
|
|
||||||
|
expect(loader).toBeInTheDocument(); |
||||||
|
await act(() => promise); |
||||||
|
}); |
||||||
|
}); |
Loading…
Reference in new issue