import { fireEvent, render, screen } from '@testing-library/react'; import { setupUser } from '../../../../../core/src/utils/testUtils/userEvent'; import type { Mock } from 'vitest'; import React from 'react'; import type { ILabelEditorProps } from './LabelEditor'; import LabelEditor from './LabelEditor'; describe('', () => { let onChangeSpy: Mock; let props: ILabelEditorProps; beforeEach(() => { onChangeSpy = vi.fn(); props = { labelSelectors: [ { key: 'my-label-1', kind: 'EQUALS', values: ['my-value-1', 'my-value-2'], }, { key: 'my-label-2', kind: 'NOT_EQUALS', values: ['my-value-3'], }, ], onLabelSelectorsChange: onChangeSpy, }; render(); }); describe('view', () => { it('renders a row for each label selector', () => { expect(screen.getAllByRole('row')).toHaveLength(props.labelSelectors.length + 2); }); it('renders selector values as comma-separated lists', () => { const inputs = screen.getAllByRole('textbox'); expect(inputs[1]).toHaveValue('my-value-1, my-value-2'); expect(inputs[3]).toHaveValue('my-value-3'); }); }); describe('functionality', () => { it('calls `props.onLabelSelectorsChange` when selector properties are changed', () => { const inputs = screen.getAllByRole('textbox'); fireEvent.change(inputs[0], { target: { value: 'my-label-1-edited' } }); expect(onChangeSpy).toHaveBeenCalledWith([ { ...props.labelSelectors[0], key: 'my-label-1-edited', }, props.labelSelectors[1], ]); fireEvent.change(inputs[3], { target: { value: 'my-value-3, my-value-4' } }); expect(onChangeSpy).toHaveBeenCalledWith([ props.labelSelectors[0], { ...props.labelSelectors[1], values: ['my-value-3', 'my-value-4'], }, ]); }); it('handles adding label selectors', async () => { const user = setupUser(); await user.click(screen.getByRole('button', { name: 'Add Label' })); expect(onChangeSpy).toHaveBeenCalledWith([...props.labelSelectors, { key: '', kind: 'EQUALS', values: [] }]); }); it('handles removing label selectors', async () => { const user = setupUser(); await user.click(screen.getAllByRole('button', { name: 'Remove field' })[1]); expect(onChangeSpy).toHaveBeenCalledWith([ { ...props.labelSelectors[0], }, ]); }); }); });