import React from 'react';
import { omit } from '../src/styled';
const renderer = require('react-test-renderer');
const { styled } = require('../src');
it('renders tag with display name and class name', () => {
const Test = styled('h1')({
name: 'TestComponent',
class: 'abcdefg',
});
expect(Test.displayName).toBe('TestComponent');
expect(Test.__linaria.className).toBe('abcdefg');
expect(Test.__linaria.extends).toBe('h1');
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('renders component with display name and class name', () => {
const Custom: React.FC = (props) =>
;
const Test = styled(Custom)({
name: 'TestComponent',
class: 'abcdefg',
});
expect(Test.displayName).toBe('TestComponent');
expect(Test.__linaria.className).toBe('abcdefg');
expect(Test.__linaria.extends).toBe(Custom);
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('applies CSS variables in style prop', () => {
const Test = styled('div')({
name: 'TestComponent',
class: 'abcdefg',
vars: {
foo: ['tomato'],
bar: [20, 'px'],
baz: [(props: { size: number }) => props.size, 'px'],
},
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('merges CSS variables with custom style prop', () => {
const Test = styled('div')({
name: 'TestComponent',
class: 'abcdefg',
vars: {
foo: ['tomato'],
},
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('supports extra className prop', () => {
const Test = styled('div')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('supports extra class prop', () => {
const Test = styled('div')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('replaces simple component with as prop', () => {
const Test = styled('button')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('replaces custom component with as prop for primitive', () => {
const Custom: React.FC = (props) => (
);
const Test = styled(Custom)({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('replaces primitive with as prop for custom component', () => {
const Custom: React.FC = (props) => (
);
const Test = styled('div')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('handles wrapping another styled component', () => {
const First = styled('div')({
name: 'FirstComponent',
class: 'abcdefg',
});
const Second = styled(First)({
name: 'SecondComponent',
class: 'hijklmn',
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('forwards as prop when wrapping another styled component', () => {
const First = styled('div')({
name: 'FirstComponent',
class: 'abcdefg',
});
const Second = styled(First)({
name: 'SecondComponent',
class: 'hijklmn',
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('filters unknown html attributes for HTML tag', () => {
const Test = styled('div')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('does not filter attributes for kebab cased custom elements', () => {
const Test = styled('my-element')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('does not filter attributes for upper camel cased custom elements', () => {
const Test = styled('View')({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('does not filter attributes for unknown tag', () => {
const Test = styled('definitelyunknowntag')({
name: 'TestComponent',
class: 'abcdefg',
propsAsIs: true,
});
const tree = renderer.create(This is a test);
expect(tree.toJSON()).toMatchSnapshot();
});
it('does not filter attributes for components', () => {
const Custom: React.FC<{ unknownAttribute: string }> = (props) => (
{props.unknownAttribute}
);
const Test = styled(Custom)({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('provides linaria component className for composition as last item in props.className', () => {
const Custom: React.FC<{ className: string }> = (props) => {
const classnames = props.className.split(' ');
const linariaClassName = classnames[classnames.length - 1];
const newClassNames = [
props.className,
`${linariaClassName}--primary`,
`${linariaClassName}--accessibility`,
].join(' ');
return (
original classname used for composition
);
};
const Test = styled(Custom)({
name: 'TestComponent',
class: 'abcdefg',
});
const tree = renderer.create(
This is a test
);
expect(tree.toJSON()).toMatchSnapshot();
});
it('throws when using as tag for template literal', () => {
// styled uses process.env.NODE_ENV to determine if it's running in a test environment
const nodeEnv = process.env.NODE_ENV;
delete process.env.NODE_ENV;
expect(
() =>
styled('div')`
color: blue;
`
).toThrow('Using the "styled" tag in runtime is not supported');
expect(
() =>
styled.div`
color: blue;
`
).toThrow('Using the "styled" tag in runtime is not supported');
process.env.NODE_ENV = nodeEnv;
});
it('can get rest keys from object', () => {
const obj = { one: 1, two: 2, three: 3 };
const rest = omit(obj, ['two']);
// eslint-disable-next-line no-unused-vars
const { two, ...expectedRest } = obj;
expect(rest).toEqual(expectedRest);
});
it('can get rest keys from complex object', () => {
const obj = {
string: 'hello',
bool: false,
object: { hello: 'world' },
arr: [1, 2, 3],
num: 47,
};
const rest = omit(obj, ['bool', 'object', 'arr']);
// eslint-disable-next-line no-unused-vars
const { bool, object, arr, ...expectedRest } = obj;
expect(rest).toEqual(expectedRest);
});