* feat: added dynamic variables creation flow (#7541) * feat: added dynamic variables creation flow * feat: added keys and value apis and hooks * feat: added api and select component changes * feat: added keys fetching and preview values * feat: added dynamic variable to variable items * feat: handled value persistence and tab switches * feat: added default value and formed a schema for dyn-variables * feat: added client and server side searches * feat: corrected the initial load getfieldKey api * feat: removed fetch on mount restriction * feat: added dynamic variable to the dashboard details (#7755) * feat: added dynamic variable to the dashboard details * feat: added new component to existing variables * feat: added enhancement to multiselect and select for dyn-variables * feat: added refetch method between all dynamic-variables * feat: correct error handling * feat: correct error handling * feat: enforced non-empty selectedvalues and default value * feat: added client and server side searches * feat: retry on error * feat: correct error handling * feat: handle defautl value in existing variables * feat: lowercase the source for payload * feat: fixed the incorrect assignment of active indices * feat: improved handling of all option * feat: improved the ALL option visuals * feat: handled default value enforcement in existing variables * feat: added unix time to values call * feat: added incomplete data message and info to search * feat: changed dashboard panel call handling with existing variables * feat: adjusted the response type and data with the new API schema for values * feat: code refactor * feat: made dyn-variable option as the default * feat: added test cases for dyn variable creation and completion * feat: updated test cases * feat: fix lint and test cases * feat: fix typo * feat: resolved comments and refactoring * feat: added dynamic variable suggestion in where clause (#8875) * feat: added dynamic variable suggestion in where clause * feat: added test cases for hooks and api call functions * feat: added test case for querybuildersearchv2 suggestion changes * feat: code refactor * feat: corrected the regex matcher for resolved titles * feat: fixed test cases * feat: added ability to add/remove variable filter to one or more existing panels (#8876) * feat: added ability to add/remove variable filter to one or more existing panels * feat: added widgetselector on variable creation * feat: show labels in widget selector * feat: added apply to all and variable removal logical * feat: refectch only related and affected panels in case of dynamic variables * feat: added button loader for apply-all * feat: light-mode styles * fix: added migration to filter expression for crud operations of variable * feat: added type in the variables in query_range payload for dynamic * feat: correct the variable addition to panel format for new qb expression * feat: added test cases for dynamic variable and add/remove panel feat * feat: implemented where clause suggestion in new qb v5 * feat: added retries for dyn variable and fixed on-enter selection issue * feat: added relatedValues and existing query in param related changes * feat: sanitized data storage and removed duplicates * fix: fixed typechecks * feat: updated panel wait and refetch logic and ALL option selection * feat: fixed variable tabel reordering issue * feat: added empty name validation in variable creation * feat: change value to searchtext in values API * feat: added option for regex in the component, disabled for now * feat: added beta and not rec. tag in variable tabs * feat: added check to prevent api and updates calls with same payload * feat: optimized localstorage for all selection in dynamic variable and updated __all__ case * feat: resolved variable tables infinite loop update error * feat: aded variable name auto-update based on attribute name entered for dynamic variables * feat: modified only/all click behaviour and set all selection always true for dynamic variable * feat: fix dropdown closing doesn't reset us back to our all available values when we have a search * feat: handled all state distinction and carry forward in existing variables * feat: trucate + n more tooltip content to 10 * feat: fixed infinite loop because of dependency of frequently changing object ref in var table * feat: fixed inconsist search implementations * feat: reverted only - all updated area implementation * feat: added more space for search in multiselect component * feat: checked for variable id instead of variable key for refetch * feat: improved performance around multiselect component and added confirm modal for apply to all * feat: rewrite functionality around add and remove panels * feat: changed color for apply to all modal * feat: added changes under flag to handle variable specific removal for removeKeysFromExpression func * feat: added validation in variable edit panel * feat: fixed failing test cases due to recent logic change * feat: added doc links in the dynamic variable feat * feat: resolved comments and refactoring * feat: resolved comments and refactoring * feat: fixed test cases * feat: fixed test cases
215 lines
5.3 KiB
TypeScript
215 lines
5.3 KiB
TypeScript
/* eslint-disable sonarjs/no-duplicate-string */
|
|
import { ApiBaseInstance } from 'api';
|
|
|
|
import { getFieldValues } from '../getFieldValues';
|
|
|
|
// Mock the API instance
|
|
jest.mock('api', () => ({
|
|
ApiBaseInstance: {
|
|
get: jest.fn(),
|
|
},
|
|
}));
|
|
|
|
describe('getFieldValues API', () => {
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
it('should call the API with correct parameters (no options)', async () => {
|
|
// Mock API response
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce({
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend', 'backend'],
|
|
},
|
|
complete: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
// Call function without parameters
|
|
await getFieldValues();
|
|
|
|
// Verify API was called correctly with empty params
|
|
expect(ApiBaseInstance.get).toHaveBeenCalledWith('/fields/values', {
|
|
params: {},
|
|
});
|
|
});
|
|
|
|
it('should call the API with signal parameter', async () => {
|
|
// Mock API response
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce({
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend', 'backend'],
|
|
},
|
|
complete: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
// Call function with signal parameter
|
|
await getFieldValues('traces');
|
|
|
|
// Verify API was called with signal parameter
|
|
expect(ApiBaseInstance.get).toHaveBeenCalledWith('/fields/values', {
|
|
params: { signal: 'traces' },
|
|
});
|
|
});
|
|
|
|
it('should call the API with name parameter', async () => {
|
|
// Mock API response
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce({
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend', 'backend'],
|
|
},
|
|
complete: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
// Call function with name parameter
|
|
await getFieldValues(undefined, 'service.name');
|
|
|
|
// Verify API was called with name parameter
|
|
expect(ApiBaseInstance.get).toHaveBeenCalledWith('/fields/values', {
|
|
params: { name: 'service.name' },
|
|
});
|
|
});
|
|
|
|
it('should call the API with value parameter', async () => {
|
|
// Mock API response
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce({
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend'],
|
|
},
|
|
complete: false,
|
|
},
|
|
},
|
|
});
|
|
|
|
// Call function with value parameter
|
|
await getFieldValues(undefined, 'service.name', 'front');
|
|
|
|
// Verify API was called with value parameter
|
|
expect(ApiBaseInstance.get).toHaveBeenCalledWith('/fields/values', {
|
|
params: { name: 'service.name', searchText: 'front' },
|
|
});
|
|
});
|
|
|
|
it('should call the API with time range parameters', async () => {
|
|
// Mock API response
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce({
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend', 'backend'],
|
|
},
|
|
complete: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
// Call function with time range parameters
|
|
const startUnixMilli = 1625097600000000; // Note: nanoseconds
|
|
const endUnixMilli = 1625184000000000;
|
|
await getFieldValues(
|
|
'logs',
|
|
'service.name',
|
|
undefined,
|
|
startUnixMilli,
|
|
endUnixMilli,
|
|
);
|
|
|
|
// Verify API was called with time range parameters (converted to milliseconds)
|
|
expect(ApiBaseInstance.get).toHaveBeenCalledWith('/fields/values', {
|
|
params: {
|
|
signal: 'logs',
|
|
name: 'service.name',
|
|
startUnixMilli: '1625097600', // Should be converted to seconds (divided by 1000000)
|
|
endUnixMilli: '1625184000', // Should be converted to seconds (divided by 1000000)
|
|
},
|
|
});
|
|
});
|
|
|
|
it('should normalize the response values', async () => {
|
|
// Mock API response with multiple value types
|
|
const mockResponse = {
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend', 'backend'],
|
|
numberValues: [200, 404],
|
|
boolValues: [true, false],
|
|
},
|
|
complete: true,
|
|
},
|
|
},
|
|
};
|
|
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce(mockResponse);
|
|
|
|
// Call the function
|
|
const result = await getFieldValues('traces', 'mixed.values');
|
|
|
|
// Verify the response has normalized values array
|
|
expect(result.data?.normalizedValues).toContain('frontend');
|
|
expect(result.data?.normalizedValues).toContain('backend');
|
|
expect(result.data?.normalizedValues).toContain('200');
|
|
expect(result.data?.normalizedValues).toContain('404');
|
|
expect(result.data?.normalizedValues).toContain('true');
|
|
expect(result.data?.normalizedValues).toContain('false');
|
|
expect(result.data?.normalizedValues?.length).toBe(6);
|
|
});
|
|
|
|
it('should return a properly formatted success response', async () => {
|
|
// Create mock response
|
|
const mockApiResponse = {
|
|
status: 200,
|
|
data: {
|
|
status: 'success',
|
|
data: {
|
|
values: {
|
|
stringValues: ['frontend', 'backend'],
|
|
},
|
|
complete: true,
|
|
},
|
|
},
|
|
};
|
|
|
|
// Mock API to return our response
|
|
(ApiBaseInstance.get as jest.Mock).mockResolvedValueOnce(mockApiResponse);
|
|
|
|
// Call the function
|
|
const result = await getFieldValues('traces', 'service.name');
|
|
|
|
// Verify the returned structure matches SuccessResponseV2 format
|
|
expect(result).toEqual({
|
|
httpStatusCode: 200,
|
|
data: expect.objectContaining({
|
|
values: expect.any(Object),
|
|
normalizedValues: expect.any(Array),
|
|
complete: true,
|
|
}),
|
|
});
|
|
});
|
|
});
|