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

Fix unit tests

Signed-off-by: Juho Heikka <juho.heikka@gmail.com>
This commit is contained in:
Juho Heikka 2022-07-05 14:09:14 +03:00
parent 6fd5c727e8
commit dee2b5c66c
17 changed files with 95 additions and 6 deletions

View File

@ -11,6 +11,7 @@ import { computed } from "mobx";
import { noop } from "lodash/fp"; import { noop } from "lodash/fp";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
describe("cluster - order of sidebar items", () => { describe("cluster - order of sidebar items", () => {
let rendered: RenderResult; let rendered: RenderResult;
@ -21,6 +22,7 @@ describe("cluster - order of sidebar items", () => {
applicationBuilder.beforeApplicationStart(({ rendererDi }) => { applicationBuilder.beforeApplicationStart(({ rendererDi }) => {
rendererDi.register(testSidebarItemsInjectable); rendererDi.register(testSidebarItemsInjectable);
rendererDi.permitSideEffects(appEventBusInjectable);
}); });
}); });

View File

@ -25,6 +25,7 @@ import sidebarStorageInjectable from "../../renderer/components/layout/sidebar-s
import hostedClusterIdInjectable from "../../renderer/cluster-frame-context/hosted-cluster-id.injectable"; import hostedClusterIdInjectable from "../../renderer/cluster-frame-context/hosted-cluster-id.injectable";
import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-time"; import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-time";
import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable"; import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
describe("cluster - sidebar and tab navigation for core", () => { describe("cluster - sidebar and tab navigation for core", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -48,6 +49,8 @@ describe("cluster - sidebar and tab navigation for core", () => {
directoryForLensLocalStorageInjectable, directoryForLensLocalStorageInjectable,
() => "/some-directory-for-lens-local-storage", () => "/some-directory-for-lens-local-storage",
); );
rendererDi.permitSideEffects(appEventBusInjectable);
}); });
}); });

View File

@ -22,6 +22,7 @@ import { getExtensionFakeFor } from "../../renderer/components/test-utils/get-ex
import type { IObservableValue } from "mobx"; import type { IObservableValue } from "mobx";
import { runInAction, computed, observable } from "mobx"; import { runInAction, computed, observable } from "mobx";
import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable"; import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
// TODO: Make tooltips free of side effects by making it deterministic // TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({ jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@ -46,6 +47,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => {
rendererDi.override(storageSaveDelayInjectable, () => 250); rendererDi.override(storageSaveDelayInjectable, () => 250);
rendererDi.permitSideEffects(appEventBusInjectable);
rendererDi.override( rendererDi.override(
directoryForLensLocalStorageInjectable, directoryForLensLocalStorageInjectable,
() => "/some-directory-for-lens-local-storage", () => "/some-directory-for-lens-local-storage",

View File

@ -17,6 +17,7 @@ import isPathInjectable from "../../renderer/components/input/validators/is-path
import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable"; import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable"; import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
import type { AsyncResult } from "../../common/utils/async-result"; import type { AsyncResult } from "../../common/utils/async-result";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
// TODO: Make tooltips free of side effects by making it deterministic // TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({ jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@ -55,6 +56,8 @@ describe("add custom helm repository in preferences", () => {
// TODO: Figure out how to make async validators unit testable // TODO: Figure out how to make async validators unit testable
rendererDi.override(isPathInjectable, () => ({ debounce: 0, validate: async () => {} })); rendererDi.override(isPathInjectable, () => ({ debounce: 0, validate: async () => {} }));
rendererDi.permitSideEffects(appEventBusInjectable);
mainDi.override( mainDi.override(
getActiveHelmRepositoriesInjectable, getActiveHelmRepositoriesInjectable,
() => getActiveHelmRepositoriesMock, () => getActiveHelmRepositoriesMock,

View File

@ -15,6 +15,7 @@ import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+
import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable"; import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable"; import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
import type { AsyncResult } from "../../common/utils/async-result"; import type { AsyncResult } from "../../common/utils/async-result";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
// TODO: Make tooltips free of side effects by making it deterministic // TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({ jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
@ -53,6 +54,8 @@ describe("add helm repository from list in preferences", () => {
() => callForPublicHelmRepositoriesMock, () => callForPublicHelmRepositoriesMock,
); );
rendererDi.permitSideEffects(appEventBusInjectable);
mainDi.override( mainDi.override(
getActiveHelmRepositoriesInjectable, getActiveHelmRepositoriesInjectable,
() => getActiveHelmRepositoriesMock, () => getActiveHelmRepositoriesMock,

View File

@ -22,6 +22,7 @@ import { createObservableHistory } from "mobx-observable-history";
import navigateToPreferenceTabInjectable from "../../renderer/components/+preferences/preferences-navigation/navigate-to-preference-tab.injectable"; import navigateToPreferenceTabInjectable from "../../renderer/components/+preferences/preferences-navigation/navigate-to-preference-tab.injectable";
import navigateToFrontPageInjectable from "../../common/front-end-routing/navigate-to-front-page.injectable"; import navigateToFrontPageInjectable from "../../common/front-end-routing/navigate-to-front-page.injectable";
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token"; import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
describe("preferences - closing-preferences", () => { describe("preferences - closing-preferences", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -35,6 +36,7 @@ describe("preferences - closing-preferences", () => {
rendererDi.register(testFrontPageRouteInjectable); rendererDi.register(testFrontPageRouteInjectable);
rendererDi.register(testFrontPageRouteComponentInjectable); rendererDi.register(testFrontPageRouteComponentInjectable);
rendererDi.register(testNavigationItemInjectable); rendererDi.register(testNavigationItemInjectable);
rendererDi.permitSideEffects(appEventBusInjectable);
rendererDi.override(navigateToFrontPageInjectable, (di) => { rendererDi.override(navigateToFrontPageInjectable, (di) => {
const navigateToRoute = di.inject(navigateToRouteInjectionToken); const navigateToRoute = di.inject(navigateToRouteInjectionToken);

View File

@ -4,9 +4,12 @@
*/ */
import React from "react"; import React from "react";
import { render } from "@testing-library/react"; import type { DiRender } from "../../test-utils/renderFor";
import { renderFor } from "../../test-utils/renderFor";
import { SecretDetails } from "../secret-details"; import { SecretDetails } from "../secret-details";
import { Secret, SecretType } from "../../../../common/k8s-api/endpoints"; import { Secret, SecretType } from "../../../../common/k8s-api/endpoints";
import type { DiContainer } from "@ogre-tools/injectable";
import { getDiForUnitTesting } from "../../../../renderer/getDiForUnitTesting";
jest.mock("../../kube-object-meta/kube-object-meta", () => ({ jest.mock("../../kube-object-meta/kube-object-meta", () => ({
KubeObjectMeta: () => null, KubeObjectMeta: () => null,
@ -14,6 +17,14 @@ jest.mock("../../kube-object-meta/kube-object-meta", () => ({
describe("SecretDetails tests", () => { describe("SecretDetails tests", () => {
let di: DiContainer;
let render: DiRender;
beforeEach(() => {
di = getDiForUnitTesting({ doGeneralOverrides: true });
render = renderFor(di);
});
it("should show the visibility toggle when the secret value is ''", () => { it("should show the visibility toggle when the secret value is ''", () => {
const secret = new Secret({ const secret = new Secret({
apiVersion: "v1", apiVersion: "v1",

View File

@ -27,6 +27,7 @@ import installFromInputInjectable from "../install-from-input/install-from-input
import type { ExtensionInstallationStateStore } from "../../../../extensions/extension-installation-state-store/extension-installation-state-store"; import type { ExtensionInstallationStateStore } from "../../../../extensions/extension-installation-state-store/extension-installation-state-store";
import extensionInstallationStateStoreInjectable from "../../../../extensions/extension-installation-state-store/extension-installation-state-store.injectable"; import extensionInstallationStateStoreInjectable from "../../../../extensions/extension-installation-state-store/extension-installation-state-store.injectable";
import { observable, when } from "mobx"; import { observable, when } from "mobx";
import appEventBusInjectable from "../../../../common/app-event-bus/app-event-bus.injectable";
mockWindow(); mockWindow();
@ -63,6 +64,8 @@ describe("Extensions", () => {
di.override(directoryForDownloadsInjectable, () => "some-directory-for-downloads"); di.override(directoryForDownloadsInjectable, () => "some-directory-for-downloads");
di.permitSideEffects(getConfigurationFileModelInjectable); di.permitSideEffects(getConfigurationFileModelInjectable);
di.permitSideEffects(appVersionInjectable);
di.permitSideEffects(appEventBusInjectable);
mockFs({ mockFs({
"some-directory-for-user-data": {}, "some-directory-for-user-data": {},

View File

@ -20,6 +20,9 @@ import { getApplicationBuilder } from "../../test-utils/get-application-builder"
import normalizedPlatformInjectable from "../../../../common/vars/normalized-platform.injectable"; import normalizedPlatformInjectable from "../../../../common/vars/normalized-platform.injectable";
import kubectlBinaryNameInjectable from "../../../../main/kubectl/binary-name.injectable"; import kubectlBinaryNameInjectable from "../../../../main/kubectl/binary-name.injectable";
import kubectlDownloadingNormalizedArchInjectable from "../../../../main/kubectl/normalized-arch.injectable"; import kubectlDownloadingNormalizedArchInjectable from "../../../../main/kubectl/normalized-arch.injectable";
import appEventBusInjectable from "../../../../common/app-event-bus/app-event-bus.injectable";
import { EventEmitter } from "../../../../common/event-emitter";
import type { AppEvent } from "../../../../common/app-event-bus/event-bus";
jest.mock("electron", () => ({ jest.mock("electron", () => ({
app: { app: {
@ -103,6 +106,8 @@ describe("<DeleteClusterDialog />", () => {
mainDi.override(kubectlBinaryNameInjectable, () => "kubectl"); mainDi.override(kubectlBinaryNameInjectable, () => "kubectl");
mainDi.override(kubectlDownloadingNormalizedArchInjectable, () => "amd64"); mainDi.override(kubectlDownloadingNormalizedArchInjectable, () => "amd64");
mainDi.override(normalizedPlatformInjectable, () => "darwin"); mainDi.override(normalizedPlatformInjectable, () => "darwin");
rendererDi.override(appEventBusInjectable, () => new EventEmitter<[AppEvent]>());
rendererDi.override(storesAndApisCanBeCreatedInjectable, () => true); rendererDi.override(storesAndApisCanBeCreatedInjectable, () => true);
}); });

View File

@ -18,6 +18,7 @@ import directoryForUserDataInjectable from "../../../../common/app-paths/directo
import getConfigurationFileModelInjectable from "../../../../common/get-configuration-file-model/get-configuration-file-model.injectable"; import getConfigurationFileModelInjectable from "../../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
import type { HotbarStore } from "../../../../common/hotbars/store"; import type { HotbarStore } from "../../../../common/hotbars/store";
import storesAndApisCanBeCreatedInjectable from "../../../stores-apis-can-be-created.injectable"; import storesAndApisCanBeCreatedInjectable from "../../../stores-apis-can-be-created.injectable";
import appEventBusInjectable from "../../../../common/app-event-bus/app-event-bus.injectable";
const mockHotbars: Partial<Record<string, any>> = { const mockHotbars: Partial<Record<string, any>> = {
"1": { "1": {
@ -48,6 +49,7 @@ describe("<HotbarRemoveCommand />", () => {
di.permitSideEffects(hotbarStoreInjectable); di.permitSideEffects(hotbarStoreInjectable);
di.permitSideEffects(getConfigurationFileModelInjectable); di.permitSideEffects(getConfigurationFileModelInjectable);
di.permitSideEffects(appEventBusInjectable);
render = renderFor(di); render = renderFor(di);
}); });

View File

@ -25,6 +25,7 @@ import { KubeObjectMenu } from "./index";
import createEditResourceTabInjectable from "../dock/edit-resource/edit-resource-tab.injectable"; import createEditResourceTabInjectable from "../dock/edit-resource/edit-resource-tab.injectable";
import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable"; import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable";
import { kubeObjectMenuItemInjectionToken } from "./kube-object-menu-item-injection-token"; import { kubeObjectMenuItemInjectionToken } from "./kube-object-menu-item-injection-token";
import appEventBusInjectable from "../../../common/app-event-bus/app-event-bus.injectable";
// TODO: Make tooltips free of side effects by making it deterministic // TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../tooltip/tooltip"); jest.mock("../tooltip/tooltip");
@ -67,6 +68,8 @@ describe("kube-object-menu", () => {
di.override(hideDetailsInjectable, () => () => {}); di.override(hideDetailsInjectable, () => () => {});
di.override(createEditResourceTabInjectable, () => () => "irrelevant"); di.override(createEditResourceTabInjectable, () => () => "irrelevant");
di.permitSideEffects(appEventBusInjectable);
}); });
it("given no cluster, does not crash", () => { it("given no cluster, does not crash", () => {

View File

@ -44,7 +44,7 @@ const NonInjectedTabLayout = observer(
return ( return (
<Tab <Tab
onClick={() => { onClick={() => {
if (registration.title) { if (registration.title) {
captureClick(registration.title.toString(), "Tab Click"); captureClick(registration.title.toString(), "Tab Click");
} }
registration.onClick(); registration.onClick();

View File

@ -195,6 +195,7 @@ class NonInjectedSelect<
isMulti, isMulti,
id: inputId, id: inputId,
onChange, onChange,
capture,
...props ...props
} = this.props; } = this.props;
@ -232,7 +233,7 @@ class NonInjectedSelect<
classNamePrefix="Select" classNamePrefix="Select"
onChange={action((newValue: OnChangeValue<Option, IsMulti>, actionMeta: ActionMeta<Option>) => { onChange={action((newValue: OnChangeValue<Option, IsMulti>, actionMeta: ActionMeta<Option>) => {
if (inputId) { if (inputId) {
props.capture(inputId, "Select Change"); capture(inputId, "Select Change");
} }
return onChange?.(newValue, actionMeta); return onChange?.(newValue, actionMeta);

View File

@ -4,11 +4,24 @@
*/ */
import React from "react"; import React from "react";
import { fireEvent, render } from "@testing-library/react"; import { fireEvent } from "@testing-library/react";
import "@testing-library/jest-dom/extend-expect"; import "@testing-library/jest-dom/extend-expect";
import { Switch } from "../switch"; import { Switch } from "../switch";
import type { DiRender } from "../../test-utils/renderFor";
import { renderFor } from "../../test-utils/renderFor";
import { getDiForUnitTesting } from "../../../getDiForUnitTesting";
import type { DiContainer } from "@ogre-tools/injectable";
describe("<Switch/>", () => { describe("<Switch/>", () => {
let di: DiContainer;
let render: DiRender;
beforeEach(() => {
di = getDiForUnitTesting({ doGeneralOverrides: true });
render = renderFor(di);
});
it("renders w/o errors", () => { it("renders w/o errors", () => {
const { container } = render(<Switch />); const { container } = render(<Switch />);

View File

@ -120,7 +120,7 @@ class NonInjectedTab extends React.PureComponent<TabProps & Dependencies> {
} }
render() { render() {
const { active, disabled, icon, label, value, ...elemProps } = this.props; const { active, disabled, icon, label, value, capture, ...elemProps } = this.props;
let { className } = this.props; let { className } = this.props;
className = cssNames("Tab flex gaps align-center", className, { className = cssNames("Tab flex gaps align-center", className, {

View File

@ -9,7 +9,7 @@ import type { EventEmitter } from "../../common/event-emitter";
// foo_bar-baz => Foo Bar Baz // foo_bar-baz => Foo Bar Baz
function getNameFromId(id: string) { function getNameFromId(id: string) {
return id.split(/[/,-,--]/).filter(Boolean).map((part) => `${part[0].toUpperCase()+part.substring(1)}`).join(""); return id.split(/[/,-,_,--]/).filter(Boolean).map((part) => `${part[0].toUpperCase()+part.substring(1)}`).join(" ");
} }
function captureWithId(eventBus: EventEmitter<[AppEvent]>, id: string, action: string) { function captureWithId(eventBus: EventEmitter<[AppEvent]>, id: string, action: string) {

View File

@ -0,0 +1,36 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import captureWithIdInjectable from "./capture-with-id.injectable";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
import { getDiForUnitTesting } from "../getDiForUnitTesting";
import type { AppEvent } from "../../common/app-event-bus/event-bus";
describe("auto capture with id", () => {
let emitEvent: (event: AppEvent) => void;
let capture: (id: string, action: string) => void;
beforeEach(() => {
const di = getDiForUnitTesting();
emitEvent = jest.fn();
di.override(appEventBusInjectable, () => ({
emit: emitEvent,
}));
capture = di.inject(captureWithIdInjectable);
});
it("calls event bus", () => {
console.log(capture);
capture("foo_bar-baz", "click");
expect(emitEvent).toHaveBeenCalledWith({
name: "Foo Bar Baz",
action: "click",
destination: "AutoCapture",
});
});
});