-
Notifications
You must be signed in to change notification settings - Fork 917
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[discover] undefined datasource fix for index patterns for PPL and SQL(…
…#8027) Deconstructing the dataSource caused an exception when no dataSource was set with the query. This can be the case with index patterns that are created and pointed to the default. Most times the default is the local cluster so there is no data source object in the query the case of the local. Accessing by dot notation with null operator fixes this issue. Adding tests to prevent this happening again. With query enhancements enabled we should considered ensuring index patterns always have a datasource object in the query. Signed-off-by: Kawika Avilla <[email protected]>
- Loading branch information
Showing
2 changed files
with
121 additions
and
2 deletions.
There are no files selected for viewing
119 changes: 119 additions & 0 deletions
119
src/plugins/query_enhancements/server/utils/facet.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
import { Logger } from 'opensearch-dashboards/server'; | ||
import { Facet, FacetProps } from './facet'; | ||
|
||
describe('Facet', () => { | ||
let facet: Facet; | ||
let mockClient: jest.Mock; | ||
let mockLogger: jest.Mocked<Logger>; | ||
let mockContext: any; | ||
let mockRequest: any; | ||
|
||
beforeEach(() => { | ||
mockClient = jest.fn(); | ||
mockLogger = ({ | ||
error: jest.fn(), | ||
} as unknown) as jest.Mocked<Logger>; | ||
|
||
const props: FacetProps = { | ||
client: { asScoped: jest.fn().mockReturnValue({ callAsCurrentUser: mockClient }) }, | ||
logger: mockLogger, | ||
endpoint: 'test-endpoint', | ||
}; | ||
|
||
facet = new Facet(props); | ||
|
||
mockContext = { | ||
dataSource: { | ||
opensearch: { | ||
legacy: { | ||
getClient: jest.fn().mockReturnValue({ callAPI: mockClient }), | ||
}, | ||
}, | ||
}, | ||
}; | ||
|
||
mockRequest = { | ||
body: { | ||
query: { | ||
query: 'test query', | ||
dataset: { | ||
dataSource: { | ||
id: 'test-id', | ||
meta: { | ||
name: 'test-name', | ||
sessionId: 'test-session', | ||
}, | ||
}, | ||
}, | ||
}, | ||
format: 'jdbc', | ||
lang: 'sql', | ||
}, | ||
}; | ||
}); | ||
|
||
describe('describeQuery', () => { | ||
it('should handle request with complete dataset information', async () => { | ||
mockClient.mockResolvedValue({ result: 'success' }); | ||
|
||
const result = await facet.describeQuery(mockContext, mockRequest); | ||
|
||
expect(result).toEqual({ success: true, data: { result: 'success' } }); | ||
expect(mockClient).toHaveBeenCalledWith('test-endpoint', { | ||
body: { | ||
query: 'test query', | ||
datasource: 'test-name', | ||
sessionId: 'test-session', | ||
lang: 'sql', | ||
}, | ||
}); | ||
}); | ||
|
||
it('should handle request with missing dataSource', async () => { | ||
mockRequest.body.query.dataset.dataSource = undefined; | ||
mockClient.mockResolvedValue({ result: 'success' }); | ||
|
||
const result = await facet.describeQuery(mockContext, mockRequest); | ||
|
||
expect(result).toEqual({ success: true, data: { result: 'success' } }); | ||
expect(mockClient).toHaveBeenCalledWith('test-endpoint', { | ||
body: { | ||
query: 'test query', | ||
lang: 'sql', | ||
}, | ||
}); | ||
}); | ||
|
||
it('should handle request with missing dataset', async () => { | ||
mockRequest.body.query.dataset = undefined; | ||
mockClient.mockResolvedValue({ result: 'success' }); | ||
|
||
const result = await facet.describeQuery(mockContext, mockRequest); | ||
|
||
expect(result).toEqual({ success: true, data: { result: 'success' } }); | ||
expect(mockClient).toHaveBeenCalledWith('test-endpoint', { | ||
body: { | ||
query: 'test query', | ||
lang: 'sql', | ||
}, | ||
}); | ||
}); | ||
|
||
it('should handle errors', async () => { | ||
const error = new Error('Test error'); | ||
mockClient.mockRejectedValue(error); | ||
|
||
const result = await facet.describeQuery(mockContext, mockRequest); | ||
|
||
expect(result).toEqual({ success: false, data: error }); | ||
expect(mockLogger.error).toHaveBeenCalledWith( | ||
'Facet fetch: test-endpoint: Error: Test error' | ||
); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters