import { render } from '@testing-library/react';
import { ExpressionQuery } from '../types';
import { SqlExpr } from './SqlExpr';
jest.mock('@grafana/ui', () => ({
...jest.requireActual('@grafana/ui'),
useStyles2: jest.fn().mockImplementation(() => ({})),
}));
jest.mock('@grafana/plugin-ui', () => ({
SQLEditor: () =>
SQL Editor Mock
,
}));
describe('SqlExpr', () => {
it('initializes new expressions with default query', () => {
const onChange = jest.fn();
const refIds = [{ value: 'A' }];
const query = { refId: 'expr1', type: 'sql', expression: '' } as ExpressionQuery;
render();
// Verify onChange was called
expect(onChange).toHaveBeenCalled();
// Verify essential SQL structure without exact string matching
const updatedQuery = onChange.mock.calls[0][0];
expect(updatedQuery.expression.toUpperCase()).toContain('SELECT');
});
it('preserves existing expressions when mounted', () => {
const onChange = jest.fn();
const refIds = [{ value: 'A' }];
const existingExpression = 'SELECT 1 AS foo';
const query = { refId: 'expr1', type: 'sql', expression: existingExpression } as ExpressionQuery;
render();
// Check if onChange was called
if (onChange.mock.calls.length > 0) {
// If called, ensure it didn't change the expression value
const updatedQuery = onChange.mock.calls[0][0];
expect(updatedQuery.expression).toBe(existingExpression);
}
// The SQLEditor should receive the existing expression
expect(query.expression).toBe(existingExpression);
});
it('adds alerting format when alerting prop is true', () => {
const onChange = jest.fn();
const refIds = [{ value: 'A' }];
const query = { refId: 'expr1', type: 'sql' } as ExpressionQuery;
render();
const updatedQuery = onChange.mock.calls[0][0];
expect(updatedQuery.format).toBe('alerting');
});
});