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

Separate 'download visible' and 'download all' tests

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
Alex Andreev 2022-08-31 09:51:20 +03:00
parent 7ad7c89061
commit 1e69ea9b27
3 changed files with 131 additions and 138 deletions

View File

@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`download logs options in pod logs dock tab when opening pod logs renders 1`] = `
exports[`download logs options in logs dock tab opening pod logs when logs presented renders 1`] = `
<body>
<div>
<div

View File

@ -25,13 +25,24 @@ import reloadLogsInjectable from "../../renderer/components/dock/logs/reload-log
import setLogTabDataInjectable from "../../renderer/components/dock/logs/set-log-tab-data.injectable";
import stopLoadingLogsInjectable from "../../renderer/components/dock/logs/stop-loading-logs.injectable";
import { dockerPod } from "../../renderer/components/dock/logs/__test__/pod.mock";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
import type { DiContainer } from "@ogre-tools/injectable";
describe("download logs options in pod logs dock tab", () => {
describe("download logs options in logs dock tab", () => {
let windowDi: DiContainer;
let rendered: RenderResult;
let builder: ApplicationBuilder;
let openSaveFileDialogMock: jest.MockedFunction<() => void>;
let callForLogsMock: jest.MockedFunction<CallForLogs>;
let getLogsMock: jest.Mock;
let showErrorNotificationMock: jest.Mock;
const logs = new Map([["timestamp", "some-logs"]]);
const pod = dockerPod;;loadLogsInjectable.lifecycle;
const container = {
name: "docker-exporter",
image: "docker.io/prom/node-exporter:v1.0.0-rc.0",
imagePullPolicy: "pull",
};
beforeEach(() => {
const selectedPod = dockerPod;
@ -41,13 +52,14 @@ describe("download logs options in pod logs dock tab", () => {
builder.setEnvironmentToClusterFrame();
callForLogsMock = jest.fn();
getLogsMock = jest.fn();
builder.beforeWindowStart((windowDi) => {
windowDi.override(callForLogsInjectable, () => callForLogsMock);
// Overriding internals of logsViewModelInjectable
windowDi.override(getLogsInjectable, () => () => ["some-logs"]);
windowDi.override(getLogsWithoutTimestampsInjectable, () => () => ["some-logs"]);
windowDi.override(getLogsInjectable, () => getLogsMock);
windowDi.override(getLogsWithoutTimestampsInjectable, () => getLogsMock);
windowDi.override(getTimestampSplitLogsInjectable, () => () => [...logs]);
windowDi.override(reloadLogsInjectable, () => jest.fn());
windowDi.override(getLogTabDataInjectable, () => () => ({
@ -74,58 +86,51 @@ describe("download logs options in pod logs dock tab", () => {
openSaveFileDialogMock = jest.fn();
windowDi.override(openSaveFileDialogInjectable, () => openSaveFileDialogMock);
showErrorNotificationMock = jest.fn();
windowDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
});
});
describe("when opening pod logs", () => {
describe.only("opening pod logs", () => {
beforeEach(async () => {
rendered = await builder.render();
const windowDi = builder.applicationWindow.only.di;
const pod = dockerPod;
const createLogsTab = windowDi.inject(createPodLogsTabInjectable);
const container = {
name: "docker-exporter",
image: "docker.io/prom/node-exporter:v1.0.0-rc.0",
imagePullPolicy: "pull",
};
windowDi = builder.applicationWindow.only.di;
const dockStore = windowDi.inject(dockStoreInjectable);
dockStore.closeTab("terminal");
createLogsTab({
selectedPod: pod,
selectedContainer: container,
});
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("contains download dropdown button", () => {
expect(rendered.getByTestId("download-logs-dropdown")).toBeInTheDocument();
});
describe("when clicking on button", () => {
beforeEach(() => {
const button = rendered.getByTestId("download-logs-dropdown");
act(() => button.click());
describe("when logs presented", () => {
beforeEach(async () => {
const createLogsTab = windowDi.inject(createPodLogsTabInjectable);
getLogsMock.mockReturnValue(["some-logs"]);
createLogsTab({
selectedPod: pod,
selectedContainer: container,
});
});
it("shows download visible logs menu item", () => {
expect(rendered.getByTestId("download-visible-logs")).toBeInTheDocument();
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows download all logs menu item", () => {
expect(rendered.getByTestId("download-all-logs")).toBeInTheDocument();
it("contains download dropdown button", () => {
expect(rendered.getByTestId("download-logs-dropdown")).toBeInTheDocument();
});
describe("when call for logs resolves with logs", () => {
it("dropdown is enabled", () => {
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled")
});
describe("when clicking on dropdown", () => {
beforeEach(() => {
callForLogsMock.mockResolvedValue("all-logs");
const button = rendered.getByTestId("download-logs-dropdown");
act(() => button.click());
});
describe("when selected 'download visible logs'", () => {
@ -135,127 +140,111 @@ describe("download logs options in pod logs dock tab", () => {
button.click();
});
it("shows save dialog with proper attributes", () => {
it.only("shows save dialog with proper attributes", () => {
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
});
});
describe("when selected 'download all logs'", () => {
describe("when call for all logs resolves with logs", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-all-logs");
callForLogsMock.mockResolvedValue("all-logs");
});
button.click();
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-all-logs");
button.click();
});
});
it("logs have been called with query", () => {
expect(callForLogsMock).toHaveBeenCalledWith(
{ name: "dockerExporter", namespace: "default" },
{ "previous": true, "timestamps": false },
);
});
it("shows save dialog with proper attributes", async () => {
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "all-logs", "text/plain");
});
it("doesn't block download dropdown for interaction after click", async () => {
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
});
});
it("logs have been called with query", () => {
expect(callForLogsMock).toHaveBeenCalledWith(
{ name: "dockerExporter", namespace: "default" },
{ "previous": true, "timestamps": false },
);
});
it("shows save dialog with proper attributes", async () => {
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "all-logs", "text/plain");
});
it("doesn't block download dropdown for interaction after click", async () => {
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
});
});
describe("blocking user interaction after menu item click", () => {
it("block download dropdown for interaction when selected 'download all logs'", async () => {
const downloadMenuItem = rendered.getByTestId("download-all-logs");
act(() => downloadMenuItem.click());
await waitFor(() => {
expect(rendered.getByTestId("download-logs-dropdown")).toHaveAttribute("disabled");
describe("blocking user interaction after menu item click", () => {
it("block download dropdown for interaction when selected 'download all logs'", async () => {
const downloadMenuItem = rendered.getByTestId("download-all-logs");
act(() => downloadMenuItem.click());
await waitFor(() => {
expect(rendered.getByTestId("download-logs-dropdown")).toHaveAttribute("disabled");
});
});
it("doesn't block dropdown for interaction when selected 'download visible logs'", () => {
const downloadMenuItem = rendered.getByTestId("download-visible-logs");
act(() => downloadMenuItem.click());
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
});
});
});
it("doesn't block dropdown for interaction when selected 'download visible logs'", () => {
const downloadMenuItem = rendered.getByTestId("download-visible-logs");
describe("when call for logs resolves with no logs", () => {
beforeEach(async () => {
callForLogsMock.mockResolvedValue("");
});
act(() => downloadMenuItem.click());
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-all-logs");
button.click();
});
});
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
it("doesn't show save dialog", () => {
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalled();
});
});
});
});
describe("when call for logs resolves with no logs", () => {
beforeEach(() => {
callForLogsMock.mockResolvedValue("");
});
describe("when selected 'download visible logs'", () => {
describe("when call for logs rejects", () => {
beforeEach(() => {
const button = rendered.getByTestId("download-visible-logs");
button.click();
callForLogsMock.mockRejectedValue("error");
});
it("shows save dialog with proper attributes", () => {
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
});
});
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-all-logs");
button.click();
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-all-logs");
button.click();
});
});
});
it("doesn't show save dialog", async () => {
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
});
});
});
describe("when call for logs rejects", () => {
beforeEach(() => {
callForLogsMock.mockRejectedValue("error");
});
describe("when selected 'download visible logs'", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-visible-logs");
button.click();
it("logs have been called", () => {
expect(callForLogsMock).toHaveBeenCalledWith(
{ name: "dockerExporter", namespace: "default" },
{ "previous": true, "timestamps": false },
);
});
});
it("shows save dialog with proper attributes", () => {
expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
});
});
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
const button = rendered.getByTestId("download-all-logs");
button.click();
it("doesn't show save dialog", async () => {
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
});
});
it("logs have been called", () => {
expect(callForLogsMock).toHaveBeenCalledWith(
{ name: "dockerExporter", namespace: "default" },
{ "previous": true, "timestamps": false },
);
});
it("doesn't show save dialog", async () => {
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
});
});
});
});

View File

@ -7,6 +7,7 @@ import type { PodLogsQuery } from "../../../../common/k8s-api/endpoints";
import type { ResourceDescriptor } from "../../../../common/k8s-api/kube-api";
import loggerInjectable from "../../../../common/logger.injectable";
import openSaveFileDialogInjectable from "../../../utils/save-file.injectable";
import showErrorNotificationInjectable from "../../notifications/show-error-notification.injectable";
import callForLogsInjectable from "./call-for-logs.injectable";
const downloadAllLogsInjectable = getInjectable({
@ -16,7 +17,8 @@ const downloadAllLogsInjectable = getInjectable({
const callForLogs = di.inject(callForLogsInjectable);
const openSaveFileDialog = di.inject(openSaveFileDialogInjectable);
const logger = di.inject(loggerInjectable);
const showErrorNotification = di.inject(showErrorNotificationInjectable);
return async (params: ResourceDescriptor, query: PodLogsQuery) => {
const logs = await callForLogs(params, query).catch(error => {
logger.error("Can't download logs: ", error);
@ -24,6 +26,8 @@ const downloadAllLogsInjectable = getInjectable({
if (logs) {
openSaveFileDialog(`${params.name}.log`, logs, "text/plain");
} else {
showErrorNotification("No logs to download");
}
};
},