Skip to content

Commit

Permalink
Added mockComponent util
Browse files Browse the repository at this point in the history
  • Loading branch information
viktor-podzigun committed Jun 15, 2023
1 parent 7afb787 commit 3052bb6
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 15 deletions.
40 changes: 32 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,32 +24,36 @@ import React from "react";
import TestRenderer from "react-test-renderer";

// 1. import
import { assertComponents } from "react-assert";
import { assertComponents, mockComponent } from "react-assert";

function SubComponent() {
return <p className="sub">Sub</p>;
}
SubComponent.displayName = "SubComponent";

function MyComponent(props) {
const { SubComp } = MyComponent;

return (
<div>
<SubComponent />
<SubComp />
<p className="my">{props.text}</p>
</div>
);
}
MyComponent.displayName = "MyComponent";

function SubComponent() {
return <p className="sub">Sub</p>;
}
MyComponent.SubComp = SubComponent;

describe("MyComponent", () => {
it("should render component", () => {
it("should render nested components", () => {
//given
const text = "Hello";

//when
const result = TestRenderer.create(<MyComponent text={text} />).root;

//then
// 2. call it with result.children and expected components tree
// 2. call assertComponents to check expected components tree
assertComponents(
result.children,
<div>
Expand All @@ -58,5 +62,25 @@ describe("MyComponent", () => {
</div>
);
});

it("should render mock components", () => {
//given
// 3. use mockComponent to mock nested components
MyComponent.SubComp = mockComponent(SubComponent);
const { SubComp } = MyComponent;
const text = "Hello";

//when
const result = TestRenderer.create(<MyComponent text={text} />).root;

//then
assertComponents(
result.children,
<div>
<SubComp />
<p className="my">{text}</p>
</div>
);
});
});
```
4 changes: 4 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@ export function assertComponents(
results: (TestRenderer.ReactTestInstance | string)[],
...expectedElements: (React.ReactElement | string)[]
): void;

export function mockComponent<
T = React.FunctionComponent<any> | React.ComponentClass<any>
>(comp: T, name?: string): T;
1 change: 1 addition & 0 deletions index.mjs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { default as assertComponent } from "./src/assertComponent.mjs";
export { default as assertComponents } from "./src/assertComponents.mjs";
export { default as mockComponent } from "./src/mockComponent.mjs";
15 changes: 15 additions & 0 deletions src/mockComponent.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from "react";

/**
* @template {React.FunctionComponent<any> | React.ComponentClass<any>} T
* @param {T} comp
* @param {string} [name]
* @returns {T}
*/
function mockComponent(comp, name) {
const mock = name || `${comp.displayName || ""}Mock`;
// @ts-ignore
return mock;
}

export default mockComponent;
1 change: 1 addition & 0 deletions test/all.mjs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
await import("./testRenderer.test.mjs");
await import("./assertComponent.test.mjs");
await import("./assertComponents.test.mjs");
await import("./mockComponent.test.mjs");
37 changes: 30 additions & 7 deletions test/example.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from "react";
import TestRenderer from "react-test-renderer";
import { assertComponents } from "../index.mjs";
import { assertComponents, mockComponent } from "../index.mjs";

const { describe, it } = await (async () => {
// @ts-ignore
Expand All @@ -9,23 +9,27 @@ const { describe, it } = await (async () => {
: import("node:test");
})();

function SubComponent() {
return <p className="sub">Sub</p>;
}
SubComponent.displayName = "SubComponent";

// @ts-ignore
function MyComponent(props) {
const { SubComp } = MyComponent;

return (
<div>
<SubComponent />
<SubComp />
<p className="my">{props.text}</p>
</div>
);
}
MyComponent.displayName = "MyComponent";

function SubComponent() {
return <p className="sub">Sub</p>;
}
MyComponent.SubComp = SubComponent;

describe("MyComponent", () => {
it("should render component", () => {
it("should render nested components", () => {
//given
const text = "Hello";

Expand All @@ -41,4 +45,23 @@ describe("MyComponent", () => {
</div>
);
});

it("should render mock components", () => {
//given
MyComponent.SubComp = mockComponent(SubComponent);
const { SubComp } = MyComponent;
const text = "Hello";

//when
const result = TestRenderer.create(<MyComponent text={text} />).root;

//then
assertComponents(
result.children,
<div>
<SubComp />
<p className="my">{text}</p>
</div>
);
});
});
34 changes: 34 additions & 0 deletions test/mockComponent.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import React from "react";
import assert from "node:assert/strict";
import { mockComponent } from "../index.mjs";
import { TestComp } from "./testComponents.mjs";

const { describe, it } = await (async () => {
// @ts-ignore
return process.isBun // @ts-ignore
? Promise.resolve({ describe: (_, fn) => fn(), it: test })
: import("node:test");
})();

const h = React.createElement;

const Comp = () => {
return h(React.Fragment, null, "test_text", h("div"), h(TestComp));
};

describe("mockComponent.test.mjs", () => {
it("should return generic Mock string", () => {
//when & then
assert.deepEqual(mockComponent(Comp), "Mock");
});

it("should return provided name", () => {
//when & then
assert.deepEqual(mockComponent(Comp, "MyMock"), "MyMock");
});

it("should return component's displayName + Mock", () => {
//when & then
assert.deepEqual(mockComponent(TestComp), "TestCompMock");
});
});

0 comments on commit 3052bb6

Please sign in to comment.