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

Fix crash and update unit test

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-02-22 09:53:38 -05:00
parent 7bcce5cb98
commit eb84b6f47e
5 changed files with 54 additions and 76 deletions

View File

@ -350,8 +350,8 @@ describe("showing details for helm release", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("does not reload", () => {
expect(requestDetailedHelmReleaseMock).not.toHaveBeenCalled();
it("does reload", () => {
expect(requestDetailedHelmReleaseMock).toHaveBeenCalled();
});
});
});

View File

@ -11,10 +11,7 @@ import { Link } from "react-router-dom";
import { DrawerItem, DrawerTitle } from "../../drawer";
import { stopPropagation } from "../../../utils";
import { observer } from "mobx-react";
import type { IAsyncComputed } from "@ogre-tools/injectable-react";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { ConfigurationInput, MinimalResourceGroup, OnlyUserSuppliedValuesAreShownToggle, ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
import releaseDetailsModelInjectable from "./release-details-model/release-details-model.injectable";
import { Button } from "../../button";
import { kebabCase } from "lodash/fp";
import { Badge } from "../../badge";
@ -22,37 +19,22 @@ import { SubTitle } from "../../layout/sub-title";
import { Table, TableCell, TableHead, TableRow } from "../../table";
import { Checkbox } from "../../checkbox";
import { MonacoEditor } from "../../monaco-editor";
import { Spinner } from "../../spinner";
import type { TargetHelmRelease } from "./target-helm-release.injectable";
interface ReleaseDetailsContentProps {
targetRelease: TargetHelmRelease;
model: ReleaseDetailsModel;
}
interface Dependencies {
computedModel: IAsyncComputed<ReleaseDetailsModel>;
}
const NonInjectedReleaseDetailsContent = observer(({ computedModel }: Dependencies & ReleaseDetailsContentProps) => {
const model = computedModel.value.get();
if (!model) {
return <Spinner center data-testid="helm-release-detail-content-spinner" />;
}
export const ReleaseDetailsContent = observer(({ model }: ReleaseDetailsContentProps) => {
const loadingError = model.loadingError.get();
if (loadingError) {
return (
<div data-testid="helm-release-detail-error">
Failed to load release:
{" "}
{loadingError}
{`Failed to load release: ${loadingError}`}
</div>
);
}
return (
<div>
<DrawerItem name="Chart" className="chart">
@ -94,9 +76,7 @@ const NonInjectedReleaseDetailsContent = observer(({ computedModel }: Dependenci
<ReleaseValues
releaseId={model.id}
configuration={model.configuration}
onlyUserSuppliedValuesAreShown={
model.onlyUserSuppliedValuesAreShown
}
onlyUserSuppliedValuesAreShown={model.onlyUserSuppliedValuesAreShown}
/>
<DrawerTitle>Notes</DrawerTitle>
@ -116,13 +96,6 @@ const NonInjectedReleaseDetailsContent = observer(({ computedModel }: Dependenci
);
});
export const ReleaseDetailsContent = withInjectables<Dependencies, ReleaseDetailsContentProps>(NonInjectedReleaseDetailsContent, {
getProps: (di, props) => ({
...props,
computedModel: di.inject(releaseDetailsModelInjectable, props.targetRelease),
}),
});
const ResourceGroup = ({
group: { kind, isNamespaced, resources },
}: {

View File

@ -8,33 +8,23 @@ import "./release-details.scss";
import React from "react";
import { observer } from "mobx-react";
import type { IAsyncComputed } from "@ogre-tools/injectable-react";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { TargetHelmRelease } from "./target-helm-release.injectable";
import navigateToHelmReleasesInjectable from "../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
import type { ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
import releaseDetailsModelInjectable from "./release-details-model/release-details-model.injectable";
import { HelmReleaseMenu } from "../release-menu";
interface ReleaseDetailsDrawerProps {
targetRelease: TargetHelmRelease;
model: ReleaseDetailsModel;
}
interface Dependencies {
computedModel: IAsyncComputed<ReleaseDetailsModel>;
navigateToHelmReleases: () => void;
}
const NonInjectedReleaseDetailsDrawerToolbar = observer(({
computedModel,
model,
navigateToHelmReleases,
}: Dependencies & ReleaseDetailsDrawerProps) => {
const model = computedModel.value.get();
if (!model) {
return null;
}
if (model.loadingError.get()) {
return null;
}
@ -51,7 +41,6 @@ const NonInjectedReleaseDetailsDrawerToolbar = observer(({
export const ReleaseDetailsDrawerToolbar = withInjectables<Dependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawerToolbar, {
getProps: (di, props) => ({
...props,
computedModel: di.inject(releaseDetailsModelInjectable, props.targetRelease),
navigateToHelmReleases: di.inject(navigateToHelmReleasesInjectable),
}),
});

View File

@ -17,6 +17,9 @@ import activeThemeTypeInjectable from "../../../themes/active-type.injectable";
import { ReleaseDetailsContent } from "./release-details-content";
import navigateToHelmReleasesInjectable from "../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
import { ReleaseDetailsDrawerToolbar } from "./release-details-drawer-toolbar";
import type { ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
import releaseDetailsModelInjectable from "./release-details-model/release-details-model.injectable";
import { Spinner } from "../../spinner";
interface ReleaseDetailsDrawerProps {
targetRelease: TargetHelmRelease;
@ -25,12 +28,14 @@ interface ReleaseDetailsDrawerProps {
interface Dependencies {
activeThemeType: ActiveThemeType;
closeDrawer: () => void;
model: ReleaseDetailsModel;
}
const NonInjectedReleaseDetailsDrawer = observer(({
activeThemeType,
closeDrawer,
targetRelease,
model,
}: Dependencies & ReleaseDetailsDrawerProps) => (
<Drawer
className={cssNames("ReleaseDetails", activeThemeType.get())}
@ -39,20 +44,50 @@ const NonInjectedReleaseDetailsDrawer = observer(({
title={targetRelease.name}
onClose={closeDrawer}
testIdForClose="close-helm-release-detail"
toolbar={<ReleaseDetailsDrawerToolbar targetRelease={targetRelease} />}
toolbar={<ReleaseDetailsDrawerToolbar model={model} />}
data-testid={`helm-release-details-for-${targetRelease.namespace}/${targetRelease.name}`}
>
<ReleaseDetailsContent targetRelease={targetRelease} />
<ReleaseDetailsContent model={model} />
</Drawer>
));
export const ReleaseDetailsDrawer = withInjectables<
Dependencies,
ReleaseDetailsDrawerProps
>(NonInjectedReleaseDetailsDrawer, {
interface PlaceholderDependencies {
activeThemeType: ActiveThemeType;
closeDrawer: () => void;
}
const NonInjectedReleaseDetailsDrawerPlaceholder = observer(({
targetRelease,
activeThemeType,
closeDrawer,
}: ReleaseDetailsDrawerProps & PlaceholderDependencies) => (
<Drawer
className={cssNames("ReleaseDetails", activeThemeType.get())}
usePortal={true}
open={true}
title={targetRelease.name}
onClose={closeDrawer}
testIdForClose="close-helm-release-detail"
data-testid={`helm-release-details-for-${targetRelease.namespace}/${targetRelease.name}`}
>
<Spinner center data-testid="helm-release-detail-content-spinner" />
</Drawer>
));
const ReleaseDetailsDrawerPlaceholder = withInjectables<PlaceholderDependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawerPlaceholder, {
getProps: (di, props) => ({
...props,
activeThemeType: di.inject(activeThemeTypeInjectable),
closeDrawer: di.inject(navigateToHelmReleasesInjectable),
...props,
}),
});
export const ReleaseDetailsDrawer = withInjectables<Dependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawer, {
getPlaceholder: ReleaseDetailsDrawerPlaceholder,
getProps: async (di, props) => ({
...props,
activeThemeType: di.inject(activeThemeTypeInjectable),
closeDrawer: di.inject(navigateToHelmReleasesInjectable),
model: await di.inject(releaseDetailsModelInjectable, props.targetRelease),
}),
});

View File

@ -31,15 +31,11 @@ import assert from "assert";
import activeThemeInjectable from "../../../../themes/active.injectable";
import type { ToHelmRelease } from "../../to-helm-release.injectable";
import toHelmReleaseInjectable from "../../to-helm-release.injectable";
import { asyncComputed } from "@ogre-tools/injectable-react";
import targetHelmReleaseInjectable from "../target-helm-release.injectable";
const releaseDetailsModelInjectable = getInjectable({
id: "release-details-model",
instantiate: (di, targetRelease: TargetHelmRelease) => {
const detailsHelmRelease = di.inject(targetHelmReleaseInjectable);
instantiate: async (di, targetRelease: TargetHelmRelease) => {
const model = new ReleaseDetailsModel({
requestDetailedHelmRelease: di.inject(requestDetailedHelmReleaseInjectable),
targetRelease,
@ -54,27 +50,12 @@ const releaseDetailsModelInjectable = getInjectable({
toHelmRelease: di.inject(toHelmReleaseInjectable),
});
return asyncComputed<ReleaseDetailsModel>({
getValueFromObservedPromise: async () => {
const currentHelmRelease = detailsHelmRelease.get();
await model.load();
if (
currentHelmRelease
&& currentHelmRelease.name === targetRelease.name
&& currentHelmRelease.namespace === targetRelease.namespace
) {
await model.load();
}
return model;
},
betweenUpdates: "show-latest-value",
});
return model;
},
lifecycle: lifecycleEnum.keyedSingleton({
getInstanceKey: (di, release: TargetHelmRelease) => `${release.namespace}/${release.name}`,
}),
lifecycle: lifecycleEnum.transient,
});
export default releaseDetailsModelInjectable;