diff --git a/packages/renderer/src/lib/ContainerList.spec.ts b/packages/renderer/src/lib/ContainerList.spec.ts index e00074f8c73c..4547ba2b112f 100644 --- a/packages/renderer/src/lib/ContainerList.spec.ts +++ b/packages/renderer/src/lib/ContainerList.spec.ts @@ -28,8 +28,10 @@ import { providerInfos } from '../stores/providers'; const listContainersMock = vi.fn(); const getProviderInfosMock = vi.fn(); +const listViewsMock = vi.fn(); const deleteContainerMock = vi.fn(); +const removePodMock = vi.fn(); const listPodsMock = vi.fn(); const kubernetesListPodsMock = vi.fn(); @@ -41,11 +43,13 @@ beforeAll(() => { onDidUpdateProviderStatusMock.mockImplementation(() => Promise.resolve()); listPodsMock.mockImplementation(() => Promise.resolve([])); kubernetesListPodsMock.mockImplementation(() => Promise.resolve([])); + listViewsMock.mockImplementation(() => Promise.resolve([])); + (window as any).listViewsContributions = listViewsMock; (window as any).listContainers = listContainersMock; (window as any).listPods = listPodsMock; (window as any).kubernetesListPods = kubernetesListPodsMock; (window as any).getProviderInfos = getProviderInfosMock; - (window as any).removePod = vi.fn(); + (window as any).removePod = removePodMock; (window as any).deleteContainer = deleteContainerMock; (window.events as unknown) = { @@ -156,7 +160,7 @@ test('Try to delete a pod that has containers', async () => { await fireEvent.click(deleteButton); // expect that we call to delete the pod first (as it's a group of containers) - expect((window as any).removePod).toHaveBeenCalledWith('podman', podId); + expect(removePodMock).toHaveBeenCalledWith('podman', podId); // wait deleteContainerMock is called while (deleteContainerMock.mock.calls.length === 0) { @@ -167,3 +171,163 @@ test('Try to delete a pod that has containers', async () => { expect(deleteContainerMock).toBeCalledWith('podman', singleContainer.Id); expect(deleteContainerMock).toBeCalledTimes(1); }); + +test('Try to delete a container without deleting pods', async () => { + removePodMock.mockClear(); + deleteContainerMock.mockClear(); + listContainersMock.mockResolvedValue([]); + + window.dispatchEvent(new CustomEvent('extensions-already-started')); + window.dispatchEvent(new CustomEvent('provider-lifecycle-change')); + window.dispatchEvent(new CustomEvent('tray:update-provider')); + + // wait for the store to be cleared + while (get(containersInfos).length !== 0) { + await new Promise(resolve => setTimeout(resolve, 250)); + } + + const podId = 'pod-id2'; + + const singleContainer = { + Id: 'sha256:21234567890123', + Image: 'sha256:123', + Names: ['foo'], + Status: 'Running', + engineId: 'podman', + engineName: 'podman', + }; + + // one single container and a container as part of a pod + const mockedContainers = [ + singleContainer, + { + Id: 'sha256:7897891234567890123', + Image: 'sha256:345', + Names: ['container-in-pod'], + Status: 'Running', + pod: { + name: 'my-pod2', + id: podId, + status: 'Running', + }, + engineId: 'podman', + engineName: 'podman', + }, + ]; + + listContainersMock.mockResolvedValue(mockedContainers); + + window.dispatchEvent(new CustomEvent('extensions-already-started')); + window.dispatchEvent(new CustomEvent('provider-lifecycle-change')); + window.dispatchEvent(new CustomEvent('tray:update-provider')); + + // wait until the store is populated + while (get(containersInfos).length === 0) { + await new Promise(resolve => setTimeout(resolve, 250)); + } + + await waitRender({}); + + // select the standalone container checkbox + const containerCheckbox = screen.getAllByRole('checkbox', { name: 'Toggle container' }); + expect(containerCheckbox[0]).toBeInTheDocument(); + await fireEvent.click(containerCheckbox[0]); + + // click on the delete button + const deleteButton = screen.getByRole('button', { name: 'Delete selected containers and pods' }); + expect(deleteButton).toBeInTheDocument(); + await fireEvent.click(deleteButton); + + // wait until deleteContainerMock is called + while (deleteContainerMock.mock.calls.length === 0) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + + // expect that the container has been deleted + expect(deleteContainerMock).toBeCalledWith('podman', singleContainer.Id); + + // but not the other container + expect(deleteContainerMock).toHaveBeenCalledOnce(); + + // and not the pod + expect(removePodMock).not.toBeCalled(); +}); + +test('Try to delete a pod without deleting container', async () => { + removePodMock.mockClear(); + deleteContainerMock.mockClear(); + listContainersMock.mockResolvedValue([]); + + window.dispatchEvent(new CustomEvent('extensions-already-started')); + window.dispatchEvent(new CustomEvent('provider-lifecycle-change')); + window.dispatchEvent(new CustomEvent('tray:update-provider')); + + // wait for the store to be cleared + while (get(containersInfos).length !== 0) { + await new Promise(resolve => setTimeout(resolve, 250)); + } + + const podId = 'pod-id3'; + + const singleContainer = { + Id: 'sha256:56789012345', + Image: 'sha256:567', + Names: ['foo'], + Status: 'Running', + engineId: 'podman', + engineName: 'podman', + }; + + // one single container and a container as part of a pod + const mockedContainers = [ + singleContainer, + { + Id: 'sha256:7897891234567890123', + Image: 'sha256:345', + Names: ['container-in-pod'], + Status: 'Running', + pod: { + name: 'my-pod3', + id: podId, + status: 'Running', + }, + engineId: 'podman', + engineName: 'podman', + }, + ]; + + listContainersMock.mockResolvedValue(mockedContainers); + + window.dispatchEvent(new CustomEvent('extensions-already-started')); + window.dispatchEvent(new CustomEvent('provider-lifecycle-change')); + window.dispatchEvent(new CustomEvent('tray:update-provider')); + + // wait until the store is populated + while (get(containersInfos).length === 0) { + await new Promise(resolve => setTimeout(resolve, 250)); + } + + await waitRender({}); + + // select the pod checkbox + const podCheckbox = screen.getByRole('checkbox', { name: 'Toggle pod' }); + expect(podCheckbox).toBeInTheDocument(); + await fireEvent.click(podCheckbox); + + // click on the delete button + const deleteButton = screen.getByRole('button', { name: 'Delete selected containers and pods' }); + expect(deleteButton).toBeInTheDocument(); + await fireEvent.click(deleteButton); + + // wait until removePodMock is called + while (removePodMock.mock.calls.length === 0) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + + // expect that the pod has been removed + expect(removePodMock).toHaveBeenCalledWith('podman', podId); + expect(removePodMock).toHaveBeenCalledOnce(); + + // and the standalone container has not been deleted + expect(deleteContainerMock).not.toHaveBeenCalled(); +});