/* global describe, it, expect */ import React from 'react' import renderer from 'react-test-renderer' import { matchers } from '@emotion/jest' import { Box, extractBoxibleProps } from './box' import { SIZES, SCREEN_SIZES } from './styles' // Add the custom matchers provided by '@emotion/jest' expect.extend(matchers) describe('Box Component', () => { beforeEach(() => { SIZES.lg = '1rem' SCREEN_SIZES.lg = 'min-width: 992px' }) it('renders and matches snapshot', () => { const tree = renderer.create( A test ).toJSON(); expect(tree).toMatchSnapshot() expect(tree).toHaveStyleRule('margin', '.2rem') expect(tree).toHaveStyleRule('padding', '1rem') expect(tree).toHaveStyleRule('flex-wrap', 'wrap') }) it('supports numbers for sizes', () => { const tree = renderer.create( something ).toJSON() expect(tree).toHaveStyleRule('padding', '10px') expect(tree).toHaveStyleRule('margin-left', '11px') expect(tree).toHaveStyleRule('margin-right', '1rem') }) it('can set shrink/grow/basis at once', () => { const tree = renderer.create( something ).toJSON() expect(tree).toMatchSnapshot() expect(tree).toHaveStyleRule('flex', '3 0 50%') expect( renderer.create(something).toJSON() ).toHaveStyleRule('flex', '1 1 42.2%') }) it('allows hacking sizes', () => { SIZES.lg = '103px' SCREEN_SIZES.lg = 'min-width: 1001px' const box = renderer.create(l) const tree = box.toJSON() expect(tree).toHaveStyleRule('padding-top', '103px') expect(tree).toHaveStyleRule('gap', '3px') expect(tree).toHaveStyleRule('justify-content', 'flex-start', { media: `@media (min-width: 1001px)`, }) expect(box).toMatchSnapshot(); }) it('renders using `as`', () => { const box = renderer.create(btn).toJSON() as any expect(box['type']).toEqual('button') }) it('is responsive', () => { const box = renderer.create( btn ) expect(box).toMatchSnapshot() const tree = box.toJSON() expect(tree).toHaveStyleRule('align-items', 'stretch', { media: `@media (${SCREEN_SIZES.md})`, }) expect(tree).toHaveStyleRule('justify-content', 'space-evenly', { media: `@media (${SCREEN_SIZES.lg})`, }) expect(tree).toHaveStyleRule('align-content', 'space-between', { media: `@media (${SCREEN_SIZES.lg})`, }) expect(tree).toHaveStyleRule('gap', '18px', { media: `@media (${SCREEN_SIZES.lg})`, }) expect(tree).toHaveStyleRule('gap', '1rem', { media: `@media (${SCREEN_SIZES.sm})`, }) }) it('can extract props', () => { type OtherProps = { other: string } const [boxProps, others] = extractBoxibleProps({ other: 'a', className: 'b', align: 'center', }) expect(boxProps).toEqual({ align: 'center', className: 'b' }) expect(others).toEqual({ other: 'a' }) }) })