From d249c4c679768e48e62ffca31572725f2a94397a Mon Sep 17 00:00:00 2001
From: Sebastian Malton
Date: Thu, 11 Aug 2022 08:35:58 -0400
Subject: [PATCH] Fix show details and updating helm releases tests
Signed-off-by: Sebastian Malton
---
...wing-details-for-helm-release.test.ts.snap | 231 ++++----------
.../showing-details-for-helm-release.test.ts | 289 ++++++++++--------
.../helm-charts/versions.injectable.ts | 2 +
.../release-details-model.injectable.tsx | 10 +-
...quest-detailed-helm-release.injectable.ts} | 10 +-
.../to-helm-release.injectable.ts | 9 +-
.../upgrade-chart-model.injectable.ts | 12 +-
.../components/dock/upgrade-chart/view.tsx | 2 +-
8 files changed, 231 insertions(+), 334 deletions(-)
rename src/renderer/components/+helm-releases/release-details/release-details-model/{request-helm-release.injectable.ts => request-detailed-helm-release.injectable.ts} (87%)
diff --git a/src/features/helm-releases/__snapshots__/showing-details-for-helm-release.test.ts.snap b/src/features/helm-releases/__snapshots__/showing-details-for-helm-release.test.ts.snap
index b2e2c0a550..44a9781448 100644
--- a/src/features/helm-releases/__snapshots__/showing-details-for-helm-release.test.ts.snap
+++ b/src/features/helm-releases/__snapshots__/showing-details-for-helm-release.test.ts.snap
@@ -2131,7 +2131,7 @@ exports[`showing details for helm release given application is started when navi
-
+ 1.0.0
-
+ 2.0.0
-
+ 1.0.0
-
+ 2.0.0
-
+ 1.0.0
-
+ 2.0.0
-
+ 1.0.0
-
+ 2.0.0
- some-chart
+ some-chart-1.0.0
@@ -6210,7 +6212,7 @@ exports[`showing details for helm release given application is started when navi
-
+ 1.0.0
-
+ 2.0.0
- some-chart
+ some-chart-1.0.0
@@ -7434,7 +7438,7 @@ exports[`showing details for helm release given application is started when navi
-
+ 1.0.0
-
+ 2.0.0
- some-chart
+ some-chart-1.0.0
@@ -8008,7 +8014,7 @@ exports[`showing details for helm release given application is started when navi
- some-chart
+ some-chart-1.0.0
@@ -9059,7 +9067,7 @@ exports[`showing details for helm release given application is started when navi
- some-chart
+ some-chart-1.0.0
@@ -10762,7 +10772,7 @@ exports[`showing details for helm release given application is started when navi
-
+ 1.0.0
-
+ 2.0.0
- some-chart
+ some-chart-1.0.0
@@ -11986,7 +11998,7 @@ exports[`showing details for helm release given application is started when navi
-
+ 1.0.0
-
+ 2.0.0
-
-
-
-
- Release
-
-
-
- some-name
-
-
- Namespace
-
-
-
- some-namespace
-
-
- Version
-
-
-
-
- Upgrade version
-
-
-
-
-
-
-
-
-
-
-
+ class="Spinner singleColor center"
+ />
@@ -13094,7 +12967,7 @@ exports[`showing details for helm release given application is started when navi
-
+ 1.0.0
-
+ 2.0.0
-
+ 1.0.0
-
+ 2.0.0
-
+ 1.0.0
-
+ 2.0.0
-
+ 1.0.0
-
+ 2.0.0
{
let builder: ApplicationBuilder;
let requestHelmReleasesMock: AsyncFnMock
;
- let requestHelmReleaseMock: AsyncFnMock;
+ let requestDetailedHelmReleaseMock: AsyncFnMock;
let requestHelmReleaseConfigurationMock: AsyncFnMock;
let requestHelmReleaseUpdateMock: AsyncFnMock;
let requestHelmChartsMock: AsyncFnMock;
@@ -53,7 +54,7 @@ describe("showing details for helm release", () => {
builder.setEnvironmentToClusterFrame();
requestHelmReleasesMock = asyncFn();
- requestHelmReleaseMock = asyncFn();
+ requestDetailedHelmReleaseMock = asyncFn();
requestHelmReleaseConfigurationMock = asyncFn();
requestHelmReleaseUpdateMock = asyncFn();
requestHelmChartsMock = asyncFn();
@@ -69,7 +70,7 @@ describe("showing details for helm release", () => {
windowDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock);
windowDi.override(showCheckedErrorInjectable, () => showCheckedErrorNotificationMock);
windowDi.override(requestHelmReleasesInjectable, () => requestHelmReleasesMock);
- windowDi.override(requestHelmReleaseInjectable, () => requestHelmReleaseMock);
+ windowDi.override(requestDetailedHelmReleaseInjectable, () => requestDetailedHelmReleaseMock);
windowDi.override(requestHelmReleaseConfigurationInjectable, () => requestHelmReleaseConfigurationMock);
windowDi.override(requestHelmReleaseUpdateInjectable, () => requestHelmReleaseUpdateMock);
windowDi.override(requestHelmChartsInjectable, () => requestHelmChartsMock);
@@ -139,7 +140,7 @@ describe("showing details for helm release", () => {
appVersion: "some-app-version",
name: "some-name",
namespace: "some-namespace",
- chart: "some-chart",
+ chart: "some-chart-1.0.0",
status: "some-status",
updated: "some-updated",
revision: "some-revision",
@@ -154,7 +155,7 @@ describe("showing details for helm release", () => {
appVersion: "some-other-app-version",
name: "some-other-name",
namespace: "some-other-namespace",
- chart: "some-other-chart",
+ chart: "some-other-chart-2.0.0",
status: "some-other-status",
updated: "some-other-updated",
revision: "some-other-revision",
@@ -193,7 +194,7 @@ describe("showing details for helm release", () => {
});
it("calls for release", () => {
- expect(requestHelmReleaseMock).toHaveBeenCalledWith(
+ expect(requestDetailedHelmReleaseMock).toHaveBeenCalledWith(
"some-name",
"some-namespace",
);
@@ -207,7 +208,7 @@ describe("showing details for helm release", () => {
describe("when opening details for second release", () => {
beforeEach(() => {
- requestHelmReleaseMock.mockClear();
+ requestDetailedHelmReleaseMock.mockClear();
const row = rendered.getByTestId(
"helm-release-row-for-some-other-namespace/some-other-name",
@@ -221,7 +222,7 @@ describe("showing details for helm release", () => {
});
it("calls for another release", () => {
- expect(requestHelmReleaseMock).toHaveBeenCalledWith(
+ expect(requestDetailedHelmReleaseMock).toHaveBeenCalledWith(
"some-other-name",
"some-other-namespace",
);
@@ -261,7 +262,7 @@ describe("showing details for helm release", () => {
describe("when opening details for same release", () => {
beforeEach(() => {
- requestHelmReleaseMock.mockClear();
+ requestDetailedHelmReleaseMock.mockClear();
const row = rendered.getByTestId(
"helm-release-row-for-some-namespace/some-name",
@@ -275,15 +276,14 @@ describe("showing details for helm release", () => {
});
it("does not reload", () => {
- expect(requestHelmReleaseMock).not.toHaveBeenCalled();
+ expect(requestDetailedHelmReleaseMock).not.toHaveBeenCalled();
});
});
});
-
describe("when call for release resolves with error", () => {
beforeEach(async () => {
- await requestHelmReleaseMock.resolve({
+ await requestDetailedHelmReleaseMock.resolve({
callWasSuccessful: false,
error: "some-error",
});
@@ -312,9 +312,49 @@ describe("showing details for helm release", () => {
describe("when call for release resolve with release", () => {
beforeEach(async () => {
- await requestHelmReleaseMock.resolve({
+ await requestDetailedHelmReleaseMock.resolve({
callWasSuccessful: true,
- response: detailedReleaseFake,
+ response: {
+ release: {
+ appVersion: "some-app-version",
+ chart: "some-chart-1.0.0",
+ status: "some-status",
+ updated: "some-updated",
+ revision: "some-revision",
+ name: "some-name",
+ namespace: "some-namespace",
+ },
+
+ details: {
+ name: "some-name",
+ namespace: "some-namespace",
+ version: "some-version",
+ config: "some-config",
+ manifest: "some-manifest",
+
+ info: {
+ deleted: "some-deleted",
+ description: "some-description",
+ first_deployed: "some-first-deployed",
+ last_deployed: "some-last-deployed",
+ notes: "some-notes",
+ status: "some-status",
+ },
+
+ resources: [
+ {
+ kind: "some-kind",
+ apiVersion: "some-api-version",
+ metadata: {
+ uid: "some-uid",
+ name: "some-resource",
+ namespace: "some-namespace",
+ creationTimestamp: "2015-10-22T07:28:00Z",
+ },
+ },
+ ],
+ },
+ },
});
});
@@ -477,94 +517,115 @@ describe("showing details for helm release", () => {
expect(saveButton).toHaveClass("waiting");
});
-
-
- it("calls for update", () => {
- expect(requestHelmReleaseUpdateMock).toHaveBeenCalledWith(
- "some-name",
- "some-namespace",
-
- {
- chart: "some-chart",
- repo: "",
- values: "some-new-configuration",
- version: "",
- },
- );
- });
-
- describe("when update resolves with success", () => {
+ describe("when requestHelmCharts resolves", () => {
beforeEach(async () => {
- requestHelmReleasesMock.mockClear();
- requestHelmReleaseConfigurationMock.mockClear();
-
- await requestHelmReleaseUpdateMock.resolve({
- updateWasSuccessful: true,
+ await requestHelmChartsMock.resolve([HelmChart.create({
+ apiVersion: "1.2.3",
+ version: "1.0.0",
+ created: "at-some-time",
+ name: "some-chart",
+ repo: "some-repo",
+ })]);
+ });
+ describe("when requestHelmChartVersions resolves", () => {
+ beforeEach(async () => {
+ await requestHelmChartVersionsMock.resolve([HelmChart.create({
+ apiVersion: "1.2.3",
+ version: "1.0.0",
+ created: "at-some-time",
+ name: "some-chart",
+ repo: "some-repo",
+ })]);
});
- });
- it("renders", () => {
- expect(rendered.baseElement).toMatchSnapshot();
- });
+ it("calls for update", () => {
+ expect(requestHelmReleaseUpdateMock).toHaveBeenCalledWith(
+ "some-name",
+ "some-namespace",
- it("does not show spinner anymore", () => {
- const saveButton = rendered.getByTestId(
- "helm-release-configuration-save-button",
- );
-
- expect(saveButton).not.toHaveClass("waiting");
- });
-
- it("reloads the configuration", () => {
- expect(requestHelmReleaseConfigurationMock).toHaveBeenCalledWith(
- "some-name",
- "some-namespace",
- true,
- );
- });
-
- it("shows success notification", () => {
- expect(showSuccessNotificationMock).toHaveBeenCalled();
- });
-
- it("does not show error notification", () => {
- expect(showCheckedErrorNotificationMock).not.toHaveBeenCalled();
- });
- });
-
- describe("when update resolves with failure", () => {
- beforeEach(async () => {
- requestHelmReleasesMock.mockClear();
- requestHelmReleaseConfigurationMock.mockClear();
-
- await requestHelmReleaseUpdateMock.resolve({
- updateWasSuccessful: false,
- error: "some-error",
+ {
+ chart: "some-chart",
+ repo: "some-repo",
+ values: "some-new-configuration",
+ version: "1.0.0",
+ },
+ );
});
- });
- it("renders", () => {
- expect(rendered.baseElement).toMatchSnapshot();
- });
+ describe("when update resolves with success", () => {
+ beforeEach(async () => {
+ requestHelmReleasesMock.mockClear();
+ requestHelmReleaseConfigurationMock.mockClear();
- it("does not show spinner anymore", () => {
- const saveButton = rendered.getByTestId(
- "helm-release-configuration-save-button",
- );
+ await requestHelmReleaseUpdateMock.resolve({
+ updateWasSuccessful: true,
+ });
+ });
- expect(saveButton).not.toHaveClass("waiting");
- });
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
+ });
- it("does not reload the configuration", () => {
- expect(requestHelmReleaseConfigurationMock).not.toHaveBeenCalled();
- });
+ it("does not show spinner anymore", () => {
+ const saveButton = rendered.getByTestId(
+ "helm-release-configuration-save-button",
+ );
- it("does not show success notification", () => {
- expect(showSuccessNotificationMock).not.toHaveBeenCalled();
- });
+ expect(saveButton).not.toHaveClass("waiting");
+ });
- it("shows error notification", () => {
- expect(showCheckedErrorNotificationMock).toHaveBeenCalled();
+ it("reloads the configuration", () => {
+ expect(requestHelmReleaseConfigurationMock).toHaveBeenCalledWith(
+ "some-name",
+ "some-namespace",
+ true,
+ );
+ });
+
+ it("shows success notification", () => {
+ expect(showSuccessNotificationMock).toHaveBeenCalled();
+ });
+
+ it("does not show error notification", () => {
+ expect(showCheckedErrorNotificationMock).not.toHaveBeenCalled();
+ });
+ });
+
+ describe("when update resolves with failure", () => {
+ beforeEach(async () => {
+ requestHelmReleasesMock.mockClear();
+ requestHelmReleaseConfigurationMock.mockClear();
+
+ await requestHelmReleaseUpdateMock.resolve({
+ updateWasSuccessful: false,
+ error: "some-error",
+ });
+ });
+
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
+ });
+
+ it("does not show spinner anymore", () => {
+ const saveButton = rendered.getByTestId(
+ "helm-release-configuration-save-button",
+ );
+
+ expect(saveButton).not.toHaveClass("waiting");
+ });
+
+ it("does not reload the configuration", () => {
+ expect(requestHelmReleaseConfigurationMock).not.toHaveBeenCalled();
+ });
+
+ it("does not show success notification", () => {
+ expect(showSuccessNotificationMock).not.toHaveBeenCalled();
+ });
+
+ it("shows error notification", () => {
+ expect(showCheckedErrorNotificationMock).toHaveBeenCalled();
+ });
+ });
});
});
});
@@ -576,45 +637,3 @@ describe("showing details for helm release", () => {
});
});
});
-
-const detailedReleaseFake: DetailedHelmRelease = {
- release: {
- appVersion: "some-app-version",
- chart: "some-chart",
- status: "some-status",
- updated: "some-updated",
- revision: "some-revision",
- name: "some-name",
- namespace: "some-namespace",
- },
-
- details: {
- name: "some-name",
- namespace: "some-namespace",
- version: "some-version",
- config: "some-config",
- manifest: "some-manifest",
-
- info: {
- deleted: "some-deleted",
- description: "some-description",
- first_deployed: "some-first-deployed",
- last_deployed: "some-last-deployed",
- notes: "some-notes",
- status: "some-status",
- },
-
- resources: [
- {
- kind: "some-kind",
- apiVersion: "some-api-version",
- metadata: {
- uid: "some-uid",
- name: "some-resource",
- namespace: "some-namespace",
- creationTimestamp: "2015-10-22T07:28:00Z",
- },
- },
- ],
- },
-};
diff --git a/src/renderer/components/+helm-charts/helm-charts/versions.injectable.ts b/src/renderer/components/+helm-charts/helm-charts/versions.injectable.ts
index 18ae1ac05e..3cf987176f 100644
--- a/src/renderer/components/+helm-charts/helm-charts/versions.injectable.ts
+++ b/src/renderer/components/+helm-charts/helm-charts/versions.injectable.ts
@@ -4,6 +4,7 @@
*/
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import { asyncComputed } from "@ogre-tools/injectable-react";
+import { when } from "mobx";
import { coerce } from "semver";
import requestHelmChartVersionsInjectable from "../../../../common/k8s-api/endpoints/helm-charts.api/get-versions.injectable";
import type { HelmRelease } from "../../../../common/k8s-api/endpoints/helm-releases.api";
@@ -29,6 +30,7 @@ const helmChartVersionsInjectable = getInjectable({
const helmCharts = di.inject(helmChartsInjectable);
return asyncComputed(async () => {
+ await when(() => !helmCharts.pending.get());
const rawVersions = await Promise.all((
helmCharts.value.get()
.filter(chart => chart.getName() === release.getChart())
diff --git a/src/renderer/components/+helm-releases/release-details/release-details-model/release-details-model.injectable.tsx b/src/renderer/components/+helm-releases/release-details/release-details-model/release-details-model.injectable.tsx
index 9056e31a1d..13a8ad5e9b 100644
--- a/src/renderer/components/+helm-releases/release-details/release-details-model/release-details-model.injectable.tsx
+++ b/src/renderer/components/+helm-releases/release-details/release-details-model/release-details-model.injectable.tsx
@@ -6,8 +6,8 @@ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import type { IComputedValue, IObservableValue } from "mobx";
import { runInAction, action, observable, computed } from "mobx";
import type { TargetHelmRelease } from "../target-helm-release.injectable";
-import type { RequestHelmRelease, DetailedHelmRelease } from "./request-helm-release.injectable";
-import requestHelmReleaseInjectable from "./request-helm-release.injectable";
+import type { RequestDetailedHelmRelease, DetailedHelmRelease } from "./request-detailed-helm-release.injectable";
+import requestDetailedHelmReleaseInjectable from "./request-detailed-helm-release.injectable";
import type { LensTheme } from "../../../../themes/store";
import type { RequestHelmReleaseConfiguration } from "../../../../../common/k8s-api/endpoints/helm-releases.api/get-configuration.injectable";
import requestHelmReleaseConfigurationInjectable from "../../../../../common/k8s-api/endpoints/helm-releases.api/get-configuration.injectable";
@@ -37,7 +37,7 @@ const releaseDetailsModelInjectable = getInjectable({
instantiate: async (di, targetRelease: TargetHelmRelease) => {
const model = new ReleaseDetailsModel({
- requestHelmRelease: di.inject(requestHelmReleaseInjectable),
+ requestDetailedHelmRelease: di.inject(requestDetailedHelmReleaseInjectable),
targetRelease,
activeTheme: di.inject(activeThemeInjectable),
requestHelmReleaseConfiguration: di.inject(requestHelmReleaseConfigurationInjectable),
@@ -78,7 +78,7 @@ export interface ConfigurationInput {
interface Dependencies {
readonly targetRelease: TargetHelmRelease;
readonly activeTheme: IComputedValue;
- requestHelmRelease: RequestHelmRelease;
+ requestDetailedHelmRelease: RequestDetailedHelmRelease;
requestHelmReleaseConfiguration: RequestHelmReleaseConfiguration;
getResourceDetailsUrl: GetResourceDetailsUrl;
updateRelease: RequestHelmReleaseUpdate;
@@ -165,7 +165,7 @@ export class ReleaseDetailsModel {
load = async () => {
const { name, namespace } = this.dependencies.targetRelease;
- const result = await this.dependencies.requestHelmRelease(
+ const result = await this.dependencies.requestDetailedHelmRelease(
name,
namespace,
);
diff --git a/src/renderer/components/+helm-releases/release-details/release-details-model/request-helm-release.injectable.ts b/src/renderer/components/+helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts
similarity index 87%
rename from src/renderer/components/+helm-releases/release-details/release-details-model/request-helm-release.injectable.ts
rename to src/renderer/components/+helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts
index a87768f1d8..1e946d08ab 100644
--- a/src/renderer/components/+helm-releases/release-details/release-details-model/request-helm-release.injectable.ts
+++ b/src/renderer/components/+helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts
@@ -14,15 +14,15 @@ export interface DetailedHelmRelease {
details: HelmReleaseDetails;
}
-export type RequestHelmRelease = (
+export type RequestDetailedHelmRelease = (
name: string,
namespace: string
) => Promise>;
-const requestHelmReleaseInjectable = getInjectable({
- id: "call-for-helm-release",
+const requestDetailedHelmReleaseInjectable = getInjectable({
+ id: "request-detailed-helm-release",
- instantiate: (di): RequestHelmRelease => {
+ instantiate: (di): RequestDetailedHelmRelease => {
const requestHelmReleases = di.inject(requestHelmReleasesInjectable);
const requestHelmReleaseDetails = di.inject(requestHelmReleaseDetailsInjectable);
@@ -48,4 +48,4 @@ const requestHelmReleaseInjectable = getInjectable({
},
});
-export default requestHelmReleaseInjectable;
+export default requestDetailedHelmReleaseInjectable;
diff --git a/src/renderer/components/+helm-releases/to-helm-release.injectable.ts b/src/renderer/components/+helm-releases/to-helm-release.injectable.ts
index 2e79f9d102..ea10b2be7d 100644
--- a/src/renderer/components/+helm-releases/to-helm-release.injectable.ts
+++ b/src/renderer/components/+helm-releases/to-helm-release.injectable.ts
@@ -73,13 +73,14 @@ const toHelmReleaseInjectable = getInjectable({
// so we have to try to guess it by searching charts
async getRepo() {
const versionsComputed = helmChartVersions(this);
+ const version = this.getVersion();
await when(() => !versionsComputed.pending.get());
- const version = this.getVersion();
- const versions = versionsComputed.value.get();
-
- return versions.find((chartVersion) => chartVersion.version === version)?.repo ?? "";
+ return versionsComputed.value
+ .get()
+ .find((chartVersion) => chartVersion.version === version)?.repo
+ ?? "";
},
});
},
diff --git a/src/renderer/components/dock/upgrade-chart/upgrade-chart-model.injectable.ts b/src/renderer/components/dock/upgrade-chart/upgrade-chart-model.injectable.ts
index deb8a4aedb..ef971891f1 100644
--- a/src/renderer/components/dock/upgrade-chart/upgrade-chart-model.injectable.ts
+++ b/src/renderer/components/dock/upgrade-chart/upgrade-chart-model.injectable.ts
@@ -68,9 +68,11 @@ const upgradeChartModelInjectable = getInjectable({
error: computed(() => configrationEditError.get()),
setError: action((error) => configrationEditError.set(String(error))),
};
- const versionValue = observable.box(versions.value.get()[0]);
+ const versionValue = observable.box(undefined, {
+ deep: false,
+ });
const version: UpgradeChartModel["version"] = {
- value: computed(() => versionValue.get()),
+ value: computed(() => versionValue.get() ?? versions.value.get()[0]),
set: action((option) => versionValue.set(option?.value)),
};
const versionOptions = computed(() => (
@@ -88,9 +90,9 @@ const upgradeChartModelInjectable = getInjectable({
configration,
version,
submit: async () => {
- const version = versionValue.get();
+ const selectedVersion = version.value.get();
- if (!version || configrationEditError.get()) {
+ if (!selectedVersion || configrationEditError.get()) {
return {
completedSuccessfully: false,
};
@@ -102,7 +104,7 @@ const upgradeChartModelInjectable = getInjectable({
{
chart: release.getChart(),
values: configration.value.get(),
- ...version,
+ ...selectedVersion,
},
);
storedConfigration.invalidate();
diff --git a/src/renderer/components/dock/upgrade-chart/view.tsx b/src/renderer/components/dock/upgrade-chart/view.tsx
index a333b4c9c1..61d7747b7b 100644
--- a/src/renderer/components/dock/upgrade-chart/view.tsx
+++ b/src/renderer/components/dock/upgrade-chart/view.tsx
@@ -80,7 +80,7 @@ export class NonInjectedUpgradeChart extends React.Component
Version
{" "}
-
+
Upgrade version