-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
07a0050
commit 9b19596
Showing
2 changed files
with
234 additions
and
0 deletions.
There are no files selected for viewing
66 changes: 66 additions & 0 deletions
66
...ck/packages/observability/observability_utils/es/utils/esql_result_to_plan_object.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,66 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* 2.0; you may not use this file except in compliance with the Elastic License | ||
* 2.0. | ||
*/ | ||
|
||
import type { ESQLSearchResponse } from '@kbn/es-types'; | ||
import { esqlResultToPlainObjects } from './esql_result_to_plain_objects'; | ||
|
||
describe('esqlResultToPlainObjects', () => { | ||
it('should return an empty array for an empty result', () => { | ||
const result: ESQLSearchResponse = { | ||
columns: [], | ||
values: [], | ||
}; | ||
const output = esqlResultToPlainObjects(result); | ||
expect(output).toEqual([]); | ||
}); | ||
|
||
it('should return plain objects', () => { | ||
const result: ESQLSearchResponse = { | ||
columns: [{ name: 'name', type: 'keyword' }], | ||
values: [['Foo Bar']], | ||
}; | ||
const output = esqlResultToPlainObjects(result); | ||
expect(output).toEqual([{ name: 'Foo Bar' }]); | ||
}); | ||
|
||
it('should return columns without "text" or "keyword" in their names', () => { | ||
const result: ESQLSearchResponse = { | ||
columns: [ | ||
{ name: 'name.text', type: 'text' }, | ||
{ name: 'age', type: 'keyword' }, | ||
], | ||
values: [ | ||
['Foo Bar', 30], | ||
['Foo Qux', 25], | ||
], | ||
}; | ||
const output = esqlResultToPlainObjects(result); | ||
expect(output).toEqual([ | ||
{ name: 'Foo Bar', age: 30 }, | ||
{ name: 'Foo Qux', age: 25 }, | ||
]); | ||
}); | ||
|
||
it('should handle mixed columns correctly', () => { | ||
const result: ESQLSearchResponse = { | ||
columns: [ | ||
{ name: 'name', type: 'text' }, | ||
{ name: 'name.text', type: 'text' }, | ||
{ name: 'age', type: 'keyword' }, | ||
], | ||
values: [ | ||
['Foo Bar', 'Foo Bar', 30], | ||
['Foo Qux', 'Foo Qux', 25], | ||
], | ||
}; | ||
const output = esqlResultToPlainObjects(result); | ||
expect(output).toEqual([ | ||
{ name: 'Foo Bar', age: 30 }, | ||
{ name: 'Foo Qux', age: 25 }, | ||
]); | ||
}); | ||
}); |
168 changes: 168 additions & 0 deletions
168
...ck/plugins/observability_solution/inventory/public/hooks/use_detail_view_redirect.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,168 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License | ||
* 2.0; you may not use this file except in compliance with the Elastic License | ||
* 2.0. | ||
*/ | ||
|
||
import { renderHook } from '@testing-library/react-hooks'; | ||
import { useDetailViewRedirect } from './use_detail_view_redirect'; | ||
import { useKibana } from './use_kibana'; | ||
import { | ||
AGENT_NAME, | ||
CLOUD_PROVIDER, | ||
CONTAINER_ID, | ||
ENTITY_DEFINITION_ID, | ||
ENTITY_DISPLAY_NAME, | ||
ENTITY_ID, | ||
ENTITY_IDENTITY_FIELDS, | ||
ENTITY_LAST_SEEN, | ||
ENTITY_TYPE, | ||
HOST_NAME, | ||
SERVICE_ENVIRONMENT, | ||
SERVICE_NAME, | ||
} from '@kbn/observability-shared-plugin/common'; | ||
import { unflattenEntity } from '../../common/utils/unflatten_entity'; | ||
import type { Entity } from '../../common/entities'; | ||
|
||
jest.mock('./use_kibana'); | ||
jest.mock('../../common/utils/unflatten_entity'); | ||
|
||
const useKibanaMock = useKibana as jest.Mock; | ||
const unflattenEntityMock = unflattenEntity as jest.Mock; | ||
|
||
const commonEntityFields: Partial<Entity> = { | ||
[ENTITY_LAST_SEEN]: '2023-10-09T00:00:00Z', | ||
[ENTITY_ID]: '1', | ||
[ENTITY_DISPLAY_NAME]: 'entity_name', | ||
[ENTITY_DEFINITION_ID]: 'entity_definition_id', | ||
}; | ||
|
||
describe('useDetailViewRedirect', () => { | ||
const mockGetIdentityFieldsValue = jest.fn(); | ||
const mockAsKqlFilter = jest.fn(); | ||
const mockGetRedirectUrl = jest.fn(); | ||
|
||
beforeEach(() => { | ||
jest.clearAllMocks(); | ||
|
||
useKibanaMock.mockReturnValue({ | ||
services: { | ||
share: { | ||
url: { | ||
locators: { | ||
get: jest.fn().mockReturnValue({ | ||
getRedirectUrl: mockGetRedirectUrl, | ||
}), | ||
}, | ||
}, | ||
}, | ||
entityManager: { | ||
entityClient: { | ||
getIdentityFieldsValue: mockGetIdentityFieldsValue, | ||
asKqlFilter: mockAsKqlFilter, | ||
}, | ||
}, | ||
}, | ||
}); | ||
|
||
unflattenEntityMock.mockImplementation((entity) => entity); | ||
}); | ||
|
||
it('getEntityRedirectUrl should return the correct URL for host entity', () => { | ||
const entity: Entity = { | ||
...(commonEntityFields as Entity), | ||
[ENTITY_IDENTITY_FIELDS]: [HOST_NAME], | ||
[ENTITY_TYPE]: 'host', | ||
[HOST_NAME]: 'host-1', | ||
[CLOUD_PROVIDER]: null, | ||
}; | ||
|
||
mockGetIdentityFieldsValue.mockReturnValue({ [HOST_NAME]: 'host-1' }); | ||
mockGetRedirectUrl.mockReturnValue('asset-details-url'); | ||
|
||
const { result } = renderHook(() => useDetailViewRedirect()); | ||
const url = result.current.getEntityRedirectUrl(entity); | ||
|
||
expect(url).toBe('asset-details-url'); | ||
expect(mockGetRedirectUrl).toHaveBeenCalledWith({ assetId: 'host-1', assetType: 'host' }); | ||
}); | ||
|
||
it('getEntityRedirectUrl should return the correct URL for container entity', () => { | ||
const entity: Entity = { | ||
...(commonEntityFields as Entity), | ||
[ENTITY_IDENTITY_FIELDS]: [CONTAINER_ID], | ||
[ENTITY_TYPE]: 'container', | ||
[CONTAINER_ID]: 'container-1', | ||
[CLOUD_PROVIDER]: null, | ||
}; | ||
|
||
mockGetIdentityFieldsValue.mockReturnValue({ [CONTAINER_ID]: 'container-1' }); | ||
mockGetRedirectUrl.mockReturnValue('asset-details-url'); | ||
|
||
const { result } = renderHook(() => useDetailViewRedirect()); | ||
const url = result.current.getEntityRedirectUrl(entity); | ||
|
||
expect(url).toBe('asset-details-url'); | ||
expect(mockGetRedirectUrl).toHaveBeenCalledWith({ | ||
assetId: 'container-1', | ||
assetType: 'container', | ||
}); | ||
}); | ||
|
||
it('getEntityRedirectUrl should return the correct URL for service entity', () => { | ||
const entity: Entity = { | ||
...(commonEntityFields as Entity), | ||
[ENTITY_IDENTITY_FIELDS]: [SERVICE_NAME], | ||
[ENTITY_TYPE]: 'service', | ||
[SERVICE_NAME]: 'service-1', | ||
[SERVICE_ENVIRONMENT]: 'prod', | ||
[AGENT_NAME]: 'node', | ||
}; | ||
mockGetIdentityFieldsValue.mockReturnValue({ [SERVICE_NAME]: 'service-1' }); | ||
mockGetRedirectUrl.mockReturnValue('service-overview-url'); | ||
|
||
const { result } = renderHook(() => useDetailViewRedirect()); | ||
const url = result.current.getEntityRedirectUrl(entity); | ||
|
||
expect(url).toBe('service-overview-url'); | ||
expect(mockGetRedirectUrl).toHaveBeenCalledWith({ | ||
serviceName: 'service-1', | ||
environment: 'prod', | ||
}); | ||
}); | ||
|
||
[ | ||
['kubernetes_cluster_ecs', 'kubernetes-f4dc26db-1b53-4ea2-a78b-1bfab8ea267c'], | ||
['kubernetes_cron_job_ecs', 'kubernetes-0a672d50-bcb1-11ec-b64f-7dd6e8e82013'], | ||
['kubernetes_daemon_set_ecs', 'kubernetes-85879010-bcb1-11ec-b64f-7dd6e8e82013'], | ||
['kubernetes_deployment_ecs', 'kubernetes-5be46210-bcb1-11ec-b64f-7dd6e8e82013'], | ||
['kubernetes_job_ecs', 'kubernetes-9bf990a0-bcb1-11ec-b64f-7dd6e8e82013'], | ||
['kubernetes_node_ecs', 'kubernetes-b945b7b0-bcb1-11ec-b64f-7dd6e8e82013'], | ||
['kubernetes_pod_ecs', 'kubernetes-3d4d9290-bcb1-11ec-b64f-7dd6e8e82013'], | ||
['kubernetes_stateful_set_ecs', 'kubernetes-21694370-bcb2-11ec-b64f-7dd6e8e82013'], | ||
].forEach(([entityType, dashboardId]) => { | ||
it(`getEntityRedirectUrl should return the correct URL for ${entityType} entity`, () => { | ||
const entity: Entity = { | ||
...(commonEntityFields as Entity), | ||
[ENTITY_IDENTITY_FIELDS]: ['some.field'], | ||
[ENTITY_TYPE]: entityType, | ||
}; | ||
|
||
mockAsKqlFilter.mockReturnValue('kql-query'); | ||
mockGetRedirectUrl.mockReturnValue('dashboard-url'); | ||
|
||
const { result } = renderHook(() => useDetailViewRedirect()); | ||
const url = result.current.getEntityRedirectUrl(entity); | ||
|
||
expect(url).toBe('dashboard-url'); | ||
expect(mockGetRedirectUrl).toHaveBeenCalledWith({ | ||
dashboardId, | ||
query: { | ||
language: 'kuery', | ||
query: 'kql-query', | ||
}, | ||
}); | ||
}); | ||
}); | ||
}); |