From f6a88b386f49a464f731a723d079767017a49385 Mon Sep 17 00:00:00 2001 From: chh <1474479+chenhunghan@users.noreply.github.com> Date: Wed, 2 Dec 2020 17:49:12 +0800 Subject: [PATCH] Add support rendering if item is a function (#1606) * Support rendering if item is a function Signed-off-by: Hung-Han (Henry) Chen <1474479+chenhunghan@users.noreply.github.com> --- .../cluster-manager/bottom-bar.test.tsx | 52 +++++++++++++++++++ .../components/cluster-manager/bottom-bar.tsx | 13 ++++- 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/renderer/components/cluster-manager/bottom-bar.test.tsx diff --git a/src/renderer/components/cluster-manager/bottom-bar.test.tsx b/src/renderer/components/cluster-manager/bottom-bar.test.tsx new file mode 100644 index 0000000000..6578f4ac20 --- /dev/null +++ b/src/renderer/components/cluster-manager/bottom-bar.test.tsx @@ -0,0 +1,52 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import "@testing-library/jest-dom/extend-expect"; + +import { BottomBar } from "./bottom-bar"; +jest.mock("../../../extensions/registries"); +import { statusBarRegistry } from "../../../extensions/registries"; + +describe("", () => { + + it("renders w/o errors", () => { + const { container } = render(); + + expect(container).toBeInstanceOf(HTMLElement); + }); + + // some defensive testing + it("renders w/o errors when .getItems() returns edge cases", async () => { + statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => undefined); + expect(() => render()).not.toThrow(); + statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => null); + expect(() => render()).not.toThrow(); + statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => []); + expect(() => render()).not.toThrow(); + statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => { return {};}); + expect(() => render()).not.toThrow(); + }); + + it("renders items [{item: React.ReactNode}] (4.0.0-rc.1)", async () => { + const testId = "testId"; + const text = "heee"; + + statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => [ + { item: {text} } + ]); + const { getByTestId } = render(); + + expect(await getByTestId(testId)).toHaveTextContent(text); + }); + + it("renders items [{item: () => React.ReactNode}] (4.0.0-rc.1+)", async () => { + const testId = "testId"; + const text = "heee"; + + statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => [ + { item: () => {text} } + ]); + const { getByTestId } = render(); + + expect(await getByTestId(testId)).toHaveTextContent(text); + }); +}); diff --git a/src/renderer/components/cluster-manager/bottom-bar.tsx b/src/renderer/components/cluster-manager/bottom-bar.tsx index c70c25aeb9..489d90769f 100644 --- a/src/renderer/components/cluster-manager/bottom-bar.tsx +++ b/src/renderer/components/cluster-manager/bottom-bar.tsx @@ -11,6 +11,8 @@ import { statusBarRegistry } from "../../../extensions/registries"; export class BottomBar extends React.Component { render() { const { currentWorkspace } = workspaceStore; + // in case .getItems() returns undefined + const items = statusBarRegistry.getItems() ?? []; return (
@@ -22,10 +24,17 @@ export class BottomBar extends React.Component { htmlFor="current-workspace" />
- {statusBarRegistry.getItems().map(({ item }, index) => { + {Array.isArray(items) && items.map(({ item }, index) => { if (!item) return; - return
{item}
; + return ( +
+ {typeof item === "function" ? item() : item} +
+ ); })}