import { render, screen, waitFor, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { Provider } from 'react-redux'; import { configureStore } from 'app/store/configureStore'; import LabelsField from './LabelsField'; const labels = [ { key: 'key1', value: 'value1' }, { key: 'key2', value: 'value2' }, ]; const FormProviderWrapper = ({ children }: React.PropsWithChildren<{}>) => { const methods = useForm({ defaultValues: { labels } }); return {children}; }; function renderAlertLabels(dataSourceName?: string) { const store = configureStore({}); render( {dataSourceName ? : } , { wrapper: FormProviderWrapper } ); } describe('LabelsField with suggestions', () => { it('Should display two dropdowns with the existing labels', async () => { renderAlertLabels('grafana'); await waitFor(() => expect(screen.getAllByTestId('alertlabel-key-picker')).toHaveLength(2)); expect(screen.getByTestId('label-key-0').textContent).toBe('key1'); expect(screen.getByTestId('label-key-1').textContent).toBe('key2'); expect(screen.getAllByTestId('alertlabel-value-picker')).toHaveLength(2); expect(screen.getByTestId('label-value-0').textContent).toBe('value1'); expect(screen.getByTestId('label-value-1').textContent).toBe('value2'); }); it('Should delete a key-value combination', async () => { renderAlertLabels('grafana'); await waitFor(() => expect(screen.getAllByTestId('alertlabel-key-picker')).toHaveLength(2)); expect(screen.getAllByTestId('alertlabel-key-picker')).toHaveLength(2); expect(screen.getAllByTestId('alertlabel-value-picker')).toHaveLength(2); await userEvent.click(screen.getByTestId('delete-label-1')); expect(screen.getAllByTestId('alertlabel-key-picker')).toHaveLength(1); expect(screen.getAllByTestId('alertlabel-value-picker')).toHaveLength(1); }); it('Should add new key-value dropdowns', async () => { renderAlertLabels('grafana'); await waitFor(() => expect(screen.getByText('Add label')).toBeVisible()); await userEvent.click(screen.getByText('Add label')); expect(screen.getAllByTestId('alertlabel-key-picker')).toHaveLength(3); expect(screen.getByTestId('label-key-0').textContent).toBe('key1'); expect(screen.getByTestId('label-key-1').textContent).toBe('key2'); expect(screen.getByTestId('label-key-2').textContent).toBe('Choose key'); expect(screen.getAllByTestId('alertlabel-value-picker')).toHaveLength(3); expect(screen.getByTestId('label-value-0').textContent).toBe('value1'); expect(screen.getByTestId('label-value-1').textContent).toBe('value2'); expect(screen.getByTestId('label-value-2').textContent).toBe('Choose value'); }); it('Should be able to write new keys and values using the dropdowns', async () => { renderAlertLabels('grafana'); await waitFor(() => expect(screen.getByText('Add label')).toBeVisible()); await userEvent.click(screen.getByText('Add label')); const LastKeyDropdown = within(screen.getByTestId('label-key-2')); const LastValueDropdown = within(screen.getByTestId('label-value-2')); await userEvent.type(LastKeyDropdown.getByRole('combobox'), 'key3{enter}'); await userEvent.type(LastValueDropdown.getByRole('combobox'), 'value3{enter}'); expect(screen.getByTestId('label-key-2').textContent).toBe('key3'); expect(screen.getByTestId('label-value-2').textContent).toBe('value3'); }); it('Should be able to write new keys and values using the dropdowns, case sensitive', async () => { renderAlertLabels('grafana'); await waitFor(() => expect(screen.getAllByTestId('alertlabel-key-picker')).toHaveLength(2)); expect(screen.getByTestId('label-key-0').textContent).toBe('key1'); expect(screen.getByTestId('label-key-1').textContent).toBe('key2'); expect(screen.getByTestId('label-value-0').textContent).toBe('value1'); expect(screen.getByTestId('label-value-1').textContent).toBe('value2'); const LastKeyDropdown = within(screen.getByTestId('label-key-1')); const LastValueDropdown = within(screen.getByTestId('label-value-1')); await userEvent.type(LastKeyDropdown.getByRole('combobox'), 'KEY2{enter}'); expect(screen.getByTestId('label-key-0').textContent).toBe('key1'); expect(screen.getByTestId('label-key-1').textContent).toBe('KEY2'); await userEvent.type(LastValueDropdown.getByRole('combobox'), 'VALUE2{enter}'); expect(screen.getByTestId('label-value-0').textContent).toBe('value1'); expect(screen.getByTestId('label-value-1').textContent).toBe('VALUE2'); }); }); describe('LabelsField without suggestions', () => { it('Should display two inputs without label suggestions', async () => { renderAlertLabels(); await waitFor(() => expect(screen.getAllByTestId('alertlabel-input-wrapper')).toHaveLength(2)); expect(screen.queryAllByTestId('alertlabel-key-picker')).toHaveLength(0); expect(screen.getByTestId('label-key-0')).toHaveValue('key1'); expect(screen.getByTestId('label-key-1')).toHaveValue('key2'); expect(screen.getByTestId('label-value-0')).toHaveValue('value1'); expect(screen.getByTestId('label-value-1')).toHaveValue('value2'); }); });