Skip to content

Commit 53cd53d

Browse files
authored
fix(ui): race condition in ImageDetailsCheck tests (podman-desktop#12077)
* fix(ui): race condition in test Signed-off-by: axel7083 <42176370+axel7083@users.noreply.github.com> * fix: better handling of workflow Signed-off-by: axel7083 <42176370+axel7083@users.noreply.github.com> --------- Signed-off-by: axel7083 <42176370+axel7083@users.noreply.github.com>
1 parent 823e680 commit 53cd53d

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

packages/renderer/src/lib/image/ImageDetailsCheck.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ beforeAll(() => {
3535
Object.defineProperty(window, 'getCancellableTokenSource', { value: getCancellableTokenSourceMock });
3636
getCancellableTokenSourceMock.mockImplementation(() => tokenID);
3737
Object.defineProperty(window, 'imageCheck', { value: imageCheckMock });
38-
Object.defineProperty(window, 'cancelToken', { value: cancelTokenSpy });
38+
Object.defineProperty(window, 'cancelToken', { value: cancelTokenSpy.mockResolvedValue(undefined) });
3939
Object.defineProperty(window, 'telemetryTrack', { value: vi.fn().mockResolvedValue(undefined) });
4040
});
4141

packages/renderer/src/lib/image/ImageDetailsCheck.svelte

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ let cancellableTokenId: number = $state(0);
2727
2828
let remainingProviders: number = $state(0);
2929
let aborted = $state(false);
30+
let aborting = $state(false);
3031
3132
let providersUnsubscribe: Unsubscriber;
3233
@@ -115,17 +116,28 @@ async function callProviders(_providers: readonly ImageCheckerInfo[]): Promise<v
115116
}
116117
117118
async function handleAbort(): Promise<void> {
119+
// avoid race condition
120+
if (aborting) return;
121+
118122
if (cancellableTokenId !== 0 && remainingProviders > 0) {
119-
await window.cancelToken(cancellableTokenId);
123+
aborting = true;
124+
await window.cancelToken(cancellableTokenId).finally(() => {
125+
aborting = false;
126+
});
127+
// reset token
128+
cancellableTokenId = 0;
129+
aborted = true;
130+
131+
// update providers
120132
providers = providers.map(p => {
121133
if (p.state === 'running') {
122134
p.state = 'canceled';
123135
}
124136
return p;
125137
});
126-
aborted = true;
138+
139+
// telemetry
127140
await window.telemetryTrack('imageCheck.aborted');
128-
cancellableTokenId = 0;
129141
}
130142
}
131143
</script>

0 commit comments

Comments
 (0)