mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 08:35:43 -06:00
* Convert QueryOperationRow test to RTL * Convert QueryOperationRow test to RTL * Convert QueryOperationRow test to RTL * Convert QueryOperationRow test to RTL * Update QueryOperationRow.test.tsx * update betterer Co-authored-by: Ashley Harrison <ashley.harrison@grafana.com>
102 lines
3.5 KiB
TypeScript
102 lines
3.5 KiB
TypeScript
import { render, screen } from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import React from 'react';
|
|
|
|
import { QueryOperationRow, QueryOperationRowProps } from './QueryOperationRow';
|
|
|
|
const setup = (propOverrides?: Partial<QueryOperationRowProps>) => {
|
|
const props: QueryOperationRowProps = {
|
|
title: 'test-title',
|
|
headerElement: '',
|
|
index: 0,
|
|
id: 'test-id',
|
|
children: <div>children</div>,
|
|
...propOverrides,
|
|
};
|
|
return render(<QueryOperationRow {...props}></QueryOperationRow>);
|
|
};
|
|
|
|
describe('QueryOperationRow', () => {
|
|
it('renders without exploding', () => {
|
|
expect(() => setup()).not.toThrow();
|
|
});
|
|
|
|
it('renders the component content', () => {
|
|
setup();
|
|
expect(screen.getByText(/^test-title$/)).toBeInTheDocument();
|
|
});
|
|
|
|
describe('callbacks', () => {
|
|
it('should call onOpen when row is opened and onClose when row is collapsed', async () => {
|
|
const onOpenSpy = jest.fn();
|
|
const onCloseSpy = jest.fn();
|
|
setup({ isOpen: false, onOpen: onOpenSpy, onClose: onCloseSpy });
|
|
|
|
const queryRow = screen.getByText(/^test-title$/);
|
|
expect(queryRow).toBeInTheDocument();
|
|
|
|
// open row on click
|
|
await userEvent.click(queryRow);
|
|
// close row on click
|
|
await userEvent.click(queryRow);
|
|
|
|
expect(onOpenSpy).toBeCalledTimes(1);
|
|
expect(onCloseSpy).toBeCalledTimes(1);
|
|
});
|
|
});
|
|
|
|
describe('headerElement rendering', () => {
|
|
it('should render headerElement provided as element', () => {
|
|
const title = <div aria-label="test title">test-header-element</div>;
|
|
setup({ headerElement: title, id: 'test-id', index: 0 });
|
|
|
|
expect(screen.getByText(/^test-header-element$/)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render headerElement provided as function', () => {
|
|
const title = () => <div aria-label="test title">test-function-header</div>;
|
|
setup({ headerElement: title, id: 'test-id', index: 0 });
|
|
|
|
expect(screen.getByText(/^test-function-header$/)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should expose api to headerElement rendered as function', () => {
|
|
const propsSpy = jest.fn();
|
|
const title = (props: Partial<QueryOperationRowProps>) => {
|
|
propsSpy(props);
|
|
return <div aria-label="test title">Test</div>;
|
|
};
|
|
setup({ headerElement: title, id: 'test-id', index: 0 });
|
|
|
|
expect(Object.keys(propsSpy.mock.calls[0][0])).toContain('isOpen');
|
|
});
|
|
});
|
|
|
|
describe('actions rendering', () => {
|
|
it('should render actions provided as element', () => {
|
|
const actions = <div aria-label="test actions">test-actions</div>;
|
|
setup({ actions: actions, id: 'test-id', index: 0 });
|
|
|
|
expect(screen.getByText(/^test-actions$/)).toBeInTheDocument();
|
|
});
|
|
it('should render actions provided as function', () => {
|
|
const actions = () => <div aria-label="test actions">test-actions</div>;
|
|
setup({ actions: actions, id: 'test-id', index: 0 });
|
|
|
|
expect(screen.getByText(/^test-actions$/)).toBeInTheDocument();
|
|
});
|
|
|
|
it('should expose api to title rendered as function', () => {
|
|
const propsSpy = jest.fn();
|
|
const actions = (props: Partial<QueryOperationRowProps>) => {
|
|
propsSpy(props);
|
|
return <div aria-label="test actions">test-actions</div>;
|
|
};
|
|
setup({ actions: actions, id: 'test-id', index: 0 });
|
|
|
|
expect(screen.getByText(/^test-actions$/)).toBeInTheDocument();
|
|
expect(Object.keys(propsSpy.mock.calls[0][0])).toEqual(['isOpen', 'onOpen', 'onClose']);
|
|
});
|
|
});
|
|
});
|