import * as React from 'react';
import kebabCase from 'lodash/kebabCase';
import { render, screen } from '@testing-library/react';
import {
ComponentPropsToStylePropsMap,
FlexContainerStyleProps,
} from '../../types';
import { errorMessageWrapper } from '../../utils/testUtils';
import { Flex } from '../Flex';
export const testFlexProps: FlexContainerStyleProps = {
direction: 'column-reverse',
gap: '10%',
justifyContent: 'flex-end',
alignItems: 'center',
alignContent: 'space-between',
wrap: 'wrap',
};
export const expectFlexContainerStyleProps = (element: HTMLElement): void => {
Object.keys(testFlexProps).forEach((key) => {
errorMessageWrapper(
() =>
expect(
element.style.getPropertyValue(
kebabCase(ComponentPropsToStylePropsMap[key])
)
).toBe(testFlexProps[key]),
`Flex container "${key}" style prop error (see above)`
);
});
};
describe('Flex:', () => {
const flexText = 'Flex primitive';
it('can apply styling via props', async () => {
render({flexText});
const flex = await screen.findByText(flexText);
expectFlexContainerStyleProps(flex);
});
it('can apply a custom className', async () => {
render({flexText});
const flex = await screen.findByText(flexText);
expect(flex.classList.contains('custom-flex')).toBe(true);
});
it('should forward ref to DOM element', async () => {
const ref = React.createRef();
render({flexText});
await screen.findByText(flexText);
expect(ref.current?.nodeName).toBe('DIV');
});
it('can render any arbitrary data-* attribute', async () => {
render(
{flexText}
);
const view = await screen.findByTestId('dataTest');
expect(view.dataset['demo']).toBe('true');
});
});