From 1e69ea9b2760e06ec5d83d7d2f9a72d589c73123 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 31 Aug 2022 09:51:20 +0300 Subject: [PATCH] Separate 'download visible' and 'download all' tests Signed-off-by: Alex Andreev --- .../__snapshots__/download-logs.test.tsx.snap | 2 +- .../pod-logs/download-logs.test.tsx | 261 +++++++++--------- .../dock/logs/download-all-logs.injectable.ts | 6 +- 3 files changed, 131 insertions(+), 138 deletions(-) diff --git a/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap b/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap index 0dadfade96..3762c414b7 100644 --- a/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap +++ b/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap @@ -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`] = `
{ +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; + 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(); - }); }); }); }); diff --git a/src/renderer/components/dock/logs/download-all-logs.injectable.ts b/src/renderer/components/dock/logs/download-all-logs.injectable.ts index abe87cc352..089652af0e 100644 --- a/src/renderer/components/dock/logs/download-all-logs.injectable.ts +++ b/src/renderer/components/dock/logs/download-all-logs.injectable.ts @@ -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"); } }; },