Commit 93649e1f by Giordano Ricci Committed by GitHub

Elasticsearch: ensure query model has timeField configured in datasource settings (#29807)

parent ac09baae
import React, { FunctionComponent } from 'react'; import React, { FunctionComponent } from 'react';
import { renderHook } from '@testing-library/react-hooks'; import { renderHook } from '@testing-library/react-hooks';
import { render } from '@testing-library/react';
import { ElasticsearchProvider, useDatasource, useQuery } from './ElasticsearchQueryContext'; import { ElasticsearchProvider, useDatasource, useQuery } from './ElasticsearchQueryContext';
import { ElasticsearchQuery } from '../../types'; import { ElasticsearchQuery } from '../../types';
import { ElasticDatasource } from '../../datasource'; import { ElasticDatasource } from '../../datasource';
...@@ -11,6 +12,22 @@ const query: ElasticsearchQuery = { ...@@ -11,6 +12,22 @@ const query: ElasticsearchQuery = {
}; };
describe('ElasticsearchQueryContext', () => { describe('ElasticsearchQueryContext', () => {
it('Should call onChange with the default query when the query is empty', () => {
const datasource = { timeField: 'TIMEFIELD' } as ElasticDatasource;
const onChange = jest.fn();
render(<ElasticsearchProvider query={{ refId: 'A' }} onChange={onChange} datasource={datasource} />);
const changedQuery: ElasticsearchQuery = onChange.mock.calls[0][0];
expect(changedQuery.query).toBeDefined();
expect(changedQuery.alias).toBeDefined();
expect(changedQuery.metrics).toBeDefined();
expect(changedQuery.bucketAggs).toBeDefined();
// Should also set timeField to the configured `timeField` option in datasource configuration
expect(changedQuery.timeField).toBe(datasource.timeField);
});
describe('useQuery Hook', () => { describe('useQuery Hook', () => {
it('Should throw when used outside of ElasticsearchQueryContext', () => { it('Should throw when used outside of ElasticsearchQueryContext', () => {
const { result } = renderHook(() => useQuery()); const { result } = renderHook(() => useQuery());
......
...@@ -24,7 +24,12 @@ export const ElasticsearchProvider: FunctionComponent<Props> = ({ children, onCh ...@@ -24,7 +24,12 @@ export const ElasticsearchProvider: FunctionComponent<Props> = ({ children, onCh
bucketAggs: bucketAggsReducer, bucketAggs: bucketAggsReducer,
}); });
const dispatch = useStatelessReducer(newState => onChange({ ...query, ...newState }), query, reducer); const dispatch = useStatelessReducer(
// timeField is part of the query model, but its value is always set to be the one from datasource settings.
newState => onChange({ ...query, ...newState, timeField: datasource.timeField }),
query,
reducer
);
// This initializes the query by dispatching an init action to each reducer. // This initializes the query by dispatching an init action to each reducer.
// useStatelessReducer will then call `onChange` with the newly generated query // useStatelessReducer will then call `onChange` with the newly generated query
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment