diff --git a/packages/main/src/plugin/index.spec.ts b/packages/main/src/plugin/index.spec.ts
index 86203442b1b87..85e5ba1a07610 100644
--- a/packages/main/src/plugin/index.spec.ts
+++ b/packages/main/src/plugin/index.spec.ts
@@ -25,6 +25,7 @@ import type { WebContents } from 'electron';
import { shell, clipboard } from 'electron';
import type { MessageBox } from './message-box.js';
import { securityRestrictionCurrentHandler } from '../security-restrictions-handler.js';
+import { CancellationTokenRegistry } from './cancellation-token-registry.js';
let pluginSystem: PluginSystem;
@@ -191,3 +192,23 @@ test('Should apiSender handle local receive events', async () => {
// data should have been received
expect(fooReceived).toBe('hello-world');
});
+
+test('Should return no AbortController if the token is undefined', async () => {
+ const cancellationTokenRegistry = new CancellationTokenRegistry();
+ const abortController = pluginSystem.createAbortControllerOnCancellationToken(cancellationTokenRegistry);
+ expect(abortController).toBeUndefined();
+});
+
+test('Should return AbortController that should be aborted if token is cancelled', async () => {
+ const abortMock = vi.spyOn(AbortController.prototype, 'abort');
+ const cancellationTokenRegistry = new CancellationTokenRegistry();
+ const tokenId = cancellationTokenRegistry.createCancellationTokenSource();
+ const abortController = pluginSystem.createAbortControllerOnCancellationToken(cancellationTokenRegistry, tokenId);
+
+ expect(abortController).toBeDefined();
+
+ const token = cancellationTokenRegistry.getCancellationTokenSource(tokenId);
+ token?.cancel();
+
+ expect(abortMock).toBeCalled();
+});
diff --git a/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts b/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts
index 4aa8888fe7a30..f2176715173dd 100644
--- a/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts
+++ b/packages/renderer/src/lib/image/BuildImageFromContainerfile.spec.ts
@@ -26,6 +26,7 @@ import type { ProviderStatus } from '@podman-desktop/api';
import type { ProviderContainerConnectionInfo, ProviderInfo } from '../../../../main/src/plugin/api/provider-info';
import userEvent from '@testing-library/user-event';
import BuildImageFromContainerfile from '/@/lib/image/BuildImageFromContainerfile.svelte';
+import { buildImagesInfo } from '/@/stores/build-images';
// fake the window.events object
beforeAll(() => {
@@ -121,3 +122,24 @@ test('Expect Done button is enabled once build is done', async () => {
expect(doneButton).toBeInTheDocument();
expect(doneButton).toBeEnabled();
});
+
+test('Expect Abort button to hidden when image build is not in progress', async () => {
+ setup();
+ render(BuildImageFromContainerfile);
+
+ const abortButton = screen.queryByRole('button', { name: 'Cancel' });
+ expect(abortButton).not.toBeInTheDocument();
+});
+
+test('Expect Abort button to being visible when image build is in progress', async () => {
+ setup();
+ buildImagesInfo.set({
+ buildImageKey: Symbol(),
+ buildRunning: true,
+ });
+ render(BuildImageFromContainerfile);
+
+ const abortButton = screen.getByRole('button', { name: 'Cancel' });
+ expect(abortButton).toBeInTheDocument();
+ expect(abortButton).toBeEnabled();
+});
diff --git a/packages/renderer/src/lib/image/BuildImageFromContainerfile.svelte b/packages/renderer/src/lib/image/BuildImageFromContainerfile.svelte
index b4855efc5ea8f..05f50f11ef53e 100644
--- a/packages/renderer/src/lib/image/BuildImageFromContainerfile.svelte
+++ b/packages/renderer/src/lib/image/BuildImageFromContainerfile.svelte
@@ -29,12 +29,12 @@ let containerFilePath: string;
let containerBuildContextDirectory: string;
let buildImageInfo: BuildImageInfo | undefined = undefined;
+let cancellableTokenId: number | undefined = undefined;
let providers: ProviderInfo[] = [];
let providerConnections: ProviderContainerConnectionInfo[] = [];
let selectedProvider: ProviderContainerConnectionInfo | undefined = undefined;
let selectedProviderConnection: ProviderContainerConnectionInfo | undefined = undefined;
let logsTerminal: Terminal;
-let cancellableTokenId: number | undefined;
$: hasInvalidFields = !containerFilePath || !containerBuildContextDirectory;
@@ -233,7 +233,7 @@ async function abortBuild() {