1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Fix a faulty "legacy-global-helper", and add unit tests to make sure it works

Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
Iku-turso 2022-03-16 21:14:00 +02:00
parent ca086350ad
commit 00712214ef
3 changed files with 86 additions and 3 deletions

View File

@ -0,0 +1,80 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import {
createContainer,
DiContainer,
getInjectable,
Injectable,
} from "@ogre-tools/injectable";
import { setLegacyGlobalDiForExtensionApi } from "./legacy-global-di-for-extension-api";
import { asLegacyGlobalObjectForExtensionApiWithModifications } from "./as-legacy-global-object-for-extension-api-with-modifications";
describe("asLegacyGlobalObjectForExtensionApiWithModifications", () => {
describe("given legacy global object", () => {
let di: DiContainer;
let someInjectable: Injectable<{ someProperty: string }, unknown, void>;
let actual: { someProperty: string } & {
someModificationProperty: string;
};
beforeEach(() => {
di = createContainer();
jest.spyOn(di, "inject");
setLegacyGlobalDiForExtensionApi(di);
someInjectable = getInjectable({
id: "some-injectable",
instantiate: () => ({
someProperty: "some-property-value",
}),
});
di.register(someInjectable);
actual = asLegacyGlobalObjectForExtensionApiWithModifications(
someInjectable,
{ someModificationProperty: "some-modification-value" },
);
});
it("when not accessed, does not inject yet", () => {
expect(di.inject).not.toHaveBeenCalled();
});
describe("when a property of global is accessed, ", () => {
let actualPropertyValue: string;
beforeEach(() => {
actualPropertyValue = actual.someProperty;
});
it("injects the injectable for global", () => {
expect(di.inject).toHaveBeenCalledWith(someInjectable, undefined);
});
it("global has property of injectable", () => {
expect(actualPropertyValue).toBe("some-property-value");
});
});
describe("when a property of modification is accessed, ", () => {
let actualModificationValue: string;
beforeEach(() => {
actualModificationValue = actual.someModificationProperty;
});
it("injects the injectable for global", () => {
expect(di.inject).toHaveBeenCalledWith(someInjectable, undefined);
});
it("global has property of modification", () => {
expect(actualModificationValue).toBe("some-modification-value");
});
});
});
});

View File

@ -13,4 +13,7 @@ export const asLegacyGlobalObjectForExtensionApiWithModifications = <
injectable: Injectable<InjectableInstance, InjectionTokenInstance, void>,
modificationObject: ModificationObject,
) =>
Object.assign(modificationObject, asLegacyGlobalForExtensionApi(injectable));
Object.assign(
asLegacyGlobalForExtensionApi(injectable),
modificationObject,
);

View File

@ -13,7 +13,7 @@ export const asLegacyGlobalForExtensionApi = ((
{},
{
apply(target, thisArg, argArray) {
apply(target: any, thisArg, argArray) {
const fn = getLegacyGlobalDiForExtensionApi().inject(
injectable,
instantiationParameter,
@ -32,7 +32,7 @@ export const asLegacyGlobalForExtensionApi = ((
instantiationParameter,
);
const propertyValue = instance[propertyName];
const propertyValue = instance[propertyName] ?? target[propertyName];
if (typeof propertyValue === "function") {
return function (...args: any[]) {