/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React from "react";
import { waitFor } from "@testing-library/react";
import { ClusterLocalTerminalSetting } from "../local-terminal-settings";
import userEvent from "@testing-library/user-event";
import type { Stats } from "fs";
import type { Cluster } from "../../../../common/cluster/cluster";
import { getDiForUnitTesting } from "../../../getDiForUnitTesting";
import type { DiRender } from "../../test-utils/renderFor";
import { renderFor } from "../../test-utils/renderFor";
import showErrorNotificationInjectable from "../../notifications/show-error-notification.injectable";
import statInjectable from "../../../../common/fs/stat.injectable";
describe("ClusterLocalTerminalSettings", () => {
let render: DiRender;
let showErrorNotificationMock: jest.Mock;
let statMock: jest.Mock;
beforeEach(() => {
const di = getDiForUnitTesting({ doGeneralOverrides: true });
showErrorNotificationMock = jest.fn();
statMock = jest.fn();
di.override(statInjectable, () => statMock);
di.override(
showErrorNotificationInjectable,
() => showErrorNotificationMock,
);
render = renderFor(di);
jest.resetAllMocks();
});
it("should render without errors", () => {
const dom = render();
expect(dom.container).toBeInstanceOf(HTMLElement);
});
it("should render the current settings", async () => {
const cluster = {
preferences: {
terminalCWD: "/foobar",
defaultNamespace: "kube-system",
},
getKubeconfig: jest.fn(() => ({
getContextObject: jest.fn(() => ({})),
})),
} as unknown as Cluster;
const dom = render();
expect(await dom.findByDisplayValue("/foobar")).toBeDefined();
expect(await dom.findByDisplayValue("kube-system")).toBeDefined();
});
it("should change placeholder for 'Default Namespace' to be the namespace from the kubeconfig", async () => {
const cluster = {
preferences: {
terminalCWD: "/foobar",
},
getKubeconfig: jest.fn(() => ({
getContextObject: jest.fn(() => ({
namespace: "blat",
})),
})),
} as unknown as Cluster;
const dom = render();
expect(await dom.findByDisplayValue("/foobar")).toBeDefined();
expect(await dom.findByPlaceholderText("blat")).toBeDefined();
});
it("should save the new default namespace after clicking away", async () => {
const cluster = {
preferences: {
terminalCWD: "/foobar",
},
getKubeconfig: jest.fn(() => ({
getContextObject: jest.fn(() => ({})),
})),
} as unknown as Cluster;
const dom = render();
const dn = await dom.findByTestId("default-namespace");
userEvent.click(dn);
userEvent.type(dn, "kube-system");
userEvent.click(dom.baseElement);
await waitFor(() => expect(cluster.preferences.defaultNamespace).toBe("kube-system"));
});
it("should save the new CWD if path is a directory", async () => {
statMock.mockImplementation(async (path) => {
expect(path).toBe("/foobar");
return {
isDirectory: () => true,
} as Stats;
});
const cluster = {
getKubeconfig: jest.fn(() => ({
getContextObject: jest.fn(() => ({})),
})),
} as unknown as Cluster;
const dom = render();
const dn = await dom.findByTestId("working-directory");
userEvent.click(dn);
userEvent.type(dn, "/foobar");
userEvent.click(dom.baseElement);
await waitFor(() => expect(cluster.preferences?.terminalCWD).toBe("/foobar"));
});
it("should not save the new CWD if path is a file", async () => {
statMock.mockImplementation(async (path) => {
expect(path).toBe("/foobar");
return {
isDirectory: () => false,
isFile: () => true,
} as Stats;
});
const cluster = {
getKubeconfig: jest.fn(() => ({
getContextObject: jest.fn(() => ({})),
})),
} as unknown as Cluster;
const dom = render();
const dn = await dom.findByTestId("working-directory");
userEvent.click(dn);
userEvent.type(dn, "/foobar");
userEvent.click(dom.baseElement);
await waitFor(() => expect(showErrorNotificationMock).toHaveBeenCalled());
});
});