UNPKG

react-render-iff

Version:

A helper component to render react components conditionally.

316 lines (285 loc) 9.31 kB
import React from "react"; import pjson from "../package.json"; import path from "path"; import renderer from "react-test-renderer"; // Test the root of the lib const RenderIf = require(path.join(__dirname, "../", pjson.main)).default; const isTrue = true; const isFalse = false; test("Example 1", () => { const component = renderer.create( <RenderIf if={isTrue} render={"Hello, world. The expression evaluated to true 😎"} elseIf={() => 1 === 1} elseIfRender={() => "This will do!"} else={"Bye, world. Both expressions evaluated to false 😥"} /> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test("Example 2", () => { const component = renderer.create( <RenderIf if={() => isTrue} elseIf={() => 1 === 1} elseIfRender={() => "This will do!"} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > Hello, world. The expression evaluated to true 😎 </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test("Example 3", () => { const component = renderer.create( <RenderIf if={() => isFalse} elseIf={() => 1 === 1} elseIfRender={() => "This will do!"} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > Hello, world. The expression evaluated to true 😎 </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test("Example 4", () => { const component = renderer.create( <RenderIf if={() => isTrue} elseIf={() => 1 === 1} elseIfRender={() => "This will do!"} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test("Example 5", () => { const component = renderer.create( <RenderIf as="section" className="u-textColorRed u-marginBottom10" style={{ background: "blue" }} title="Some cool stuff!" if={() => isFalse} elseIf={isTrue} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test("Example 6: Should catch thrown error in if condition when safeEval provided as true", () => { const consoleWarnSpy = jest.spyOn(global.console, "warn"); const component = renderer.create( <RenderIf as="header" if={() => { throw new Error( "Oh no! An error occurred while evaluating the if condition!" ); }} elseIf={() => isTrue} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} safeEval={"my-safe-eval-debug-key"} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); expect(consoleWarnSpy.mock.calls[0][0]).toInclude( `[safeEval: my-safe-eval-debug-key] Error while evaluating "if" condition:` ); expect(consoleWarnSpy.mock.calls[0][1]).toInclude( `Error: Oh no! An error occurred while evaluating the if condition!` ); consoleWarnSpy.mockRestore(); }); test("Example 6: Should catch thrown error in elseIf condition when safeEval provided as true", () => { const consoleWarnSpy = jest.spyOn(global.console, "warn"); const component = renderer.create( <RenderIf as="header" if={() => false} elseIf={() => { throw new Error( `Oh no! An error occurred while evaluating the "elseIf" condition!` ); }} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} safeEval={"my-safe-eval-debug-key"} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); expect(consoleWarnSpy.mock.calls[0][0]).toInclude( `[safeEval: my-safe-eval-debug-key] Error while evaluating "elseIf" condition:` ); expect(consoleWarnSpy.mock.calls[0][1]).toInclude( `Error: Oh no! An error occurred while evaluating the "elseIf" condition!` ); consoleWarnSpy.mockRestore(); }); test("Example 6: Should catch thrown error in render render-prop when safeEval provided as true", () => { const consoleWarnSpy = jest.spyOn(global.console, "warn"); const component = renderer.create( <RenderIf as="header" if={() => true} elseIf={() => false} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} safeEval={"my-safe-eval-debug-key"} render={() => { <div>{undefinedField123.hello}</div>; }} /> ); expect(consoleWarnSpy.mock.calls[0][0]).toInclude( `[safeEval: my-safe-eval-debug-key] Error while evaluating "render" prop:` ); expect(consoleWarnSpy.mock.calls[0][1]).toInclude( `ReferenceError: undefinedField123 is not defined` ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); consoleWarnSpy.mockRestore(); }); test("Example 6: Should catch thrown error in elseIfRender render-prop when safeEval provided as true", () => { const consoleWarnSpy = jest.spyOn(global.console, "warn"); const component = renderer.create( <RenderIf as="header" if={() => false} elseIf={() => true} elseIfRender={() => { <div>{undefinedField123.hello}</div>; }} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} safeEval={"my-safe-eval-debug-key"} render={() => "Hello, world!"} /> ); expect(consoleWarnSpy.mock.calls[0][0]).toInclude( `[safeEval: my-safe-eval-debug-key] Error while evaluating "elseIfRender" prop:` ); expect(consoleWarnSpy.mock.calls[0][1]).toInclude( `ReferenceError: undefinedField123 is not defined` ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); consoleWarnSpy.mockRestore(); }); test("Example 6: Should catch thrown error in else render-prop when safeEval provided as true", () => { const consoleWarnSpy = jest.spyOn(global.console, "warn"); const component = renderer.create( <RenderIf as="header" if={() => false} elseIf={() => false} elseIfRender={() => "Cool world ..."} else={() => { <div>{undefinedField123.hello}</div>; }} safeEval={"my-safe-eval-debug-key"} render={() => "Hello, world!"} /> ); expect(consoleWarnSpy.mock.calls[0][0]).toInclude( `[safeEval: my-safe-eval-debug-key] Error while evaluating "else" prop:` ); expect(consoleWarnSpy.mock.calls[0][1]).toInclude( `ReferenceError: undefinedField123 is not defined` ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); consoleWarnSpy.mockRestore(); }); test("Should fail when error thrown without safeEval", () => { let thrownError; let component; try { component = renderer.create( <RenderIf as="header" if={() => { throw new Error( "Oh no! An error occurred while evaluating the if condition!" ); }} elseIf={() => isTrue} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); } catch (err) { thrownError = err; } expect(thrownError.message).toBe( "Oh no! An error occurred while evaluating the if condition!" ); expect(component).toBeNil(); }); test("Render 'as' prop when provided as string", () => { const component = renderer.create( <RenderIf as="h7" className="u-textColorRed u-marginBottom10" style={{ background: "blue" }} title="Some cool stuff!" if={() => isFalse} elseIf={isTrue} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test("Render 'as' prop when provided a React functional component", () => { const CompA = props => { return <div {...props}>CompA stuff {props.children}</div>; }; const component = renderer.create( <RenderIf as={CompA} className="u-textColorRed u-marginBottom10" style={{ background: "blue" }} title="Some cool stuff!" if={() => isFalse} elseIf={isFalse} elseIfRender={<p>This will do!</p>} else={() => <p>Bye, world. Both expressions evaluated to false 😥</p>} > <p>Hello, world.</p> <p>The expression evaluated to true 😎</p> </RenderIf> ); const tree = component.toJSON(); expect(tree).toMatchSnapshot(); });