import { fireEvent, queryByAttribute } from '@testing-library/react'
import pick from 'lodash/pick'
import * as React from 'react'
import renderWithTheme from '../../tests/helpers/renderWithTheme'
import RadioButtonField from './RadioButtonField'
describe('component: RadioButtonField', () => {
test('should generate a unique id when none is provided', () => {
const { container, getByText } = renderWithTheme(
)
const getById = queryByAttribute.bind(null, 'id')
const labelElement = getByText('Find This') as HTMLLabelElement
expect(labelElement.htmlFor).toContain('field_name')
expect(getById(container, labelElement.htmlFor)).not.toBeNull()
})
test('should trigger onChange event', () => {
const box: any = {}
const onChange = jest.fn((e) => Object.assign(box, pick(e.target, ['name', 'value'])))
const { getByLabelText } = renderWithTheme(
)
fireEvent.click(getByLabelText('Levi'))
expect(onChange).toHaveBeenCalledTimes(1)
expect(box).toEqual({ name: 'rbf', value: 'on' })
})
test('should trigger onFocus event', () => {
const onFocus = jest.fn()
const { getByLabelText } = renderWithTheme(
)
fireEvent.focus(getByLabelText('Eren'))
expect(onFocus).toHaveBeenCalled()
})
test('should trigger onBlur event', () => {
const onBlur = jest.fn()
const { getByLabelText } = renderWithTheme(
)
fireEvent.blur(getByLabelText('Aegon'))
expect(onBlur).toHaveBeenCalled()
})
test('should support margin space props', () => {
const { getByTestId } = renderWithTheme(
<>
>
)
const blank = { marginTop: '', marginRight: '', marginBottom: '', marginLeft: '' }
expect(getByTestId('first').parentElement?.parentElement).toHaveStyle(blank)
expect(getByTestId('default').parentElement?.parentElement).toHaveStyle({
...blank,
marginTop: '8px',
marginBottom: '4px',
})
expect(getByTestId('override').parentElement?.parentElement).toHaveStyle({
...blank,
marginTop: '16px',
})
})
test('should support flex item props', () => {
const { getByTestId } = renderWithTheme(
)
const radioField = getByTestId('flex-rbf').parentElement?.parentElement
expect(radioField).toHaveStyle('flex: 1')
expect(radioField).toHaveStyle('flex-grow: 1')
expect(radioField).toHaveStyle('flex-shrink: 0')
expect(radioField).toHaveStyle('flex-basis: 0')
})
test('should support ref prop', () => {
const ref = React.createRef()
const { getByLabelText } = renderWithTheme(
)
expect(getByLabelText('Oui')).toBe(ref.current)
expect(ref.current).toBeChecked()
})
})