diff --git a/src/emulator.ts b/src/emulator.ts index 94e00fb..f08feed 100644 --- a/src/emulator.ts +++ b/src/emulator.ts @@ -70,8 +70,8 @@ export default class EmuContainer { static async checkAndPullImage(imageName: string): Promise { const docker = new Docker() - await new Promise((resolve) => { - docker.pull(imageName, {}, (err: any, stream: any) => { + await new Promise((resolve, reject) => { + docker.pull(imageName, {}, (err: unknown, stream) => { function onProgress(event: any): void { const progress = event?.progress ?? '' const status = event?.status ?? '' @@ -81,18 +81,19 @@ export default class EmuContainer { function onFinished(err: any, _output: any): void { if (err != null) { process.stdout.write(`[DOCKER] ${err}\n`) - throw err + reject(err) } resolve() } if (err != null) { process.stdout.write(`[DOCKER] ${err}\n`) - throw err + reject(err) } - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - docker.modem.followProgress(stream, onFinished, onProgress) + if (stream) { + docker.modem.followProgress(stream, onFinished, onProgress) + } }) }) } diff --git a/tests/check-and-pull-image.test.ts b/tests/check-and-pull-image.test.ts new file mode 100644 index 0000000..eecfc6f --- /dev/null +++ b/tests/check-and-pull-image.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, test, vi } from 'vitest' +import EmuContainer from '../src/emulator' +import Zemu from '../src/Zemu' +import { DEFAULT_EMU_IMG } from '../src/constants' + +describe('checkAndPullImage fails', () => { + const BAD_IMAGE_NAME = 'this is not a valid image name' + + test('EmuContainer should throw if checking for image fails', async () => { + await expect(() => EmuContainer.checkAndPullImage(BAD_IMAGE_NAME)).rejects.toThrow() + }) + + test('Zemu should throw if checking for image fails', async () => { + vi.spyOn(EmuContainer, 'checkAndPullImage').mockImplementationOnce(async (discarded) => { + // expect a typical call + expect(discarded).toBe(DEFAULT_EMU_IMG) + // forward to the original implementation + return EmuContainer.checkAndPullImage(BAD_IMAGE_NAME) + }) + + await expect(() => Zemu.checkAndPullImage()).rejects.toThrow() + }) +})