Skip to content

Commit

Permalink
test: delete only container or pod
Browse files Browse the repository at this point in the history
Adds two tests:
- deleting a standalone container without deleting pods
- deleting a pod without deleting a standalone container

Signed-off-by: Tim deBoer <git@tdeboer.ca>
  • Loading branch information
deboer-tim committed Aug 10, 2023
1 parent beb7273 commit fce76ca
Showing 1 changed file with 166 additions and 2 deletions.
168 changes: 166 additions & 2 deletions packages/renderer/src/lib/ContainerList.spec.ts
Expand Up @@ -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();
Expand All @@ -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) = {
Expand Down Expand Up @@ -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) {
Expand All @@ -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();
});

0 comments on commit fce76ca

Please sign in to comment.