/** @jsxImportSource test */ import { useEffect } from "react"; import { View } from "react-native"; import { fireEvent, registerCSS, render, screen, setupAllComponents, } from "test"; const testID = "react-native-css-interop"; setupAllComponents(); test("dynamic variables should not unmount children", () => { /** * The interop changes the render tree and can accidentally unmount components. * In this instance, having a variable will force the VariableProvider into the tree * Even if this variable is conditional, it shouldn't cause an unmount */ registerCSS(`.my-class:hover { color: var(--color); --color: red; }`); const onUnMount = jest.fn(); const onMount = jest.fn(() => onUnMount); const Child = (props: { assertMount: () => () => void; testID?: string }) => { useEffect(props.assertMount, []); return null; }; const component = render( , ).getByTestId(testID); expect(onUnMount).not.toHaveBeenCalled(); expect(onMount).toHaveBeenCalledTimes(1); fireEvent(component, "hoverIn"); expect(onUnMount).not.toHaveBeenCalled(); expect(onMount).toHaveBeenCalledTimes(1); }); test("empty className", () => { const component = render().getByTestId( testID, ); expect(component.props.className).not.toBeDefined(); expect(component).toHaveStyle(undefined); }); test("rerender empty className", () => { registerCSS(`.bg-red-500 { color: red; }`); render(); const component = screen.getByTestId(testID); expect(component).toHaveStyle({ color: "#ff0000" }); screen.rerender(); }); test("missing className", () => { const component = render().getByTestId(testID); expect(component.props.className).not.toBeDefined(); expect(component.props.style).not.toBeDefined(); }); test("rerender missing className", () => { registerCSS(`.bg-red-500 { color: red; }`); render(); const component = screen.getByTestId(testID); expect(component).toHaveStyle({ color: "#ff0000" }); screen.rerender(); expect(component.props.style).not.toBeDefined(); }); test("null className", () => { const component = render( , ).getByTestId(testID); expect(component.props.className).not.toBeDefined(); expect(component.props.style).not.toBeDefined(); }); test("rerender null className", () => { registerCSS(`.bg-red-500 { color: red; }`); render(); const component = screen.getByTestId(testID); expect(component).toHaveStyle({ color: "#ff0000" }); screen.rerender(); expect(component.props.style).not.toBeDefined(); }); test("styles don't mutate other styles", () => { registerCSS( `.text-red-500 { color: red; } .dynamic { background-color: var(--test); --test: blue }`, ); render(); const component = screen.getByTestId(testID); expect(component).toHaveStyle({ color: "#ff0000", backgroundColor: "blue" }); screen.rerender(); expect(component).toHaveStyle({ color: "#ff0000" }); });