From 041a999a01d52f04fabfc490d058e85332068b92 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 19 Feb 2020 09:47:52 +0100 Subject: [PATCH] added context hook to allow the override of the default binder --- scm-ui/ui-extensions/src/binder.ts | 6 +++-- scm-ui/ui-extensions/src/index.ts | 3 ++- scm-ui/ui-extensions/src/useBinder.test.tsx | 29 +++++++++++++++++++++ scm-ui/ui-extensions/src/useBinder.ts | 16 ++++++++++++ 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 scm-ui/ui-extensions/src/useBinder.test.tsx create mode 100644 scm-ui/ui-extensions/src/useBinder.ts diff --git a/scm-ui/ui-extensions/src/binder.ts b/scm-ui/ui-extensions/src/binder.ts index a359973a50..e3f2b9f120 100644 --- a/scm-ui/ui-extensions/src/binder.ts +++ b/scm-ui/ui-extensions/src/binder.ts @@ -10,11 +10,13 @@ type ExtensionRegistration = { * The Binder class is mainly exported for testing, plugins should only use the default export. */ export class Binder { + name: string; extensionPoints: { [key: string]: Array; }; - constructor() { + constructor(name: string) { + this.name = name; this.extensionPoints = {}; } @@ -73,6 +75,6 @@ export class Binder { } // singleton binder -const binder = new Binder(); +const binder = new Binder("default"); export default binder; diff --git a/scm-ui/ui-extensions/src/index.ts b/scm-ui/ui-extensions/src/index.ts index 73267e29a3..1c632b8a38 100644 --- a/scm-ui/ui-extensions/src/index.ts +++ b/scm-ui/ui-extensions/src/index.ts @@ -1,2 +1,3 @@ -export { default as binder } from "./binder"; +export { default as binder, Binder } from "./binder"; +export * from "./useBinder"; export { default as ExtensionPoint } from "./ExtensionPoint"; diff --git a/scm-ui/ui-extensions/src/useBinder.test.tsx b/scm-ui/ui-extensions/src/useBinder.test.tsx new file mode 100644 index 0000000000..4fc73974d6 --- /dev/null +++ b/scm-ui/ui-extensions/src/useBinder.test.tsx @@ -0,0 +1,29 @@ +import useBinder, { BinderContext } from "./useBinder"; +import { Binder } from "./binder"; +import { mount } from "enzyme"; +import "@scm-manager/ui-tests/enzyme"; +import React from "react"; + +describe("useBinder tests", () => { + const BinderName = () => { + const binder = useBinder(); + return <>{binder.name}; + }; + + it("should return default binder", () => { + const rendered = mount(); + expect(rendered.text()).toBe("default"); + }); + + it("should return binder from context", () => { + const binder = new Binder("from-context"); + const app = ( + + + + ); + + const rendered = mount(app); + expect(rendered.text()).toBe("from-context"); + }); +}); diff --git a/scm-ui/ui-extensions/src/useBinder.ts b/scm-ui/ui-extensions/src/useBinder.ts new file mode 100644 index 0000000000..1d63dd7e8d --- /dev/null +++ b/scm-ui/ui-extensions/src/useBinder.ts @@ -0,0 +1,16 @@ +import { createContext, useContext } from "react"; +import defaultBinder from "./binder"; + +/** + * The BinderContext should only be used to override the default binder for testing purposes. + */ +export const BinderContext = createContext(defaultBinder); + +/** + * Hook to get the binder from context. + */ +export const useBinder = () => { + return useContext(BinderContext); +}; + +export default useBinder;