From 8279e1078ada970868c49436add169cfa103c48c Mon Sep 17 00:00:00 2001 From: Snowknight26 Date: Wed, 4 Mar 2026 09:22:48 -0600 Subject: [PATCH] fix(web): download toast showing wrong filename for motion assets (#26689) --- web/src/lib/services/asset.service.spec.ts | 50 +++++++++++++++++++++- web/src/lib/services/asset.service.ts | 4 +- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/web/src/lib/services/asset.service.spec.ts b/web/src/lib/services/asset.service.spec.ts index a94d86be47..b67db960be 100644 --- a/web/src/lib/services/asset.service.spec.ts +++ b/web/src/lib/services/asset.service.spec.ts @@ -1,9 +1,34 @@ -import { getAssetActions } from '$lib/services/asset.service'; +import { getAssetActions, handleDownloadAsset } from '$lib/services/asset.service'; import { user as userStore } from '$lib/stores/user.store'; import { setSharedLink } from '$lib/utils'; +import { getFormatter } from '$lib/utils/i18n'; +import { getAssetInfo } from '@immich/sdk'; +import { toastManager } from '@immich/ui'; import { assetFactory } from '@test-data/factories/asset-factory'; import { sharedLinkFactory } from '@test-data/factories/shared-link-factory'; import { userAdminFactory } from '@test-data/factories/user-factory'; +import { vitest } from 'vitest'; + +vitest.mock('@immich/ui', () => ({ + toastManager: { + success: vitest.fn(), + }, +})); + +vitest.mock('$lib/utils/i18n', () => ({ + getFormatter: vitest.fn(), + getPreferredLocale: vitest.fn(), +})); + +vitest.mock('@immich/sdk'); + +vitest.mock('$lib/utils', async () => { + const originalModule = await vitest.importActual('$lib/utils'); + return { + ...originalModule, + sleep: vitest.fn(), + }; +}); describe('AssetService', () => { describe('getAssetActions', () => { @@ -34,4 +59,27 @@ describe('AssetService', () => { expect(assetActions.SharedLinkDownload.$if?.()).toStrictEqual(true); }); }); + + describe('handleDownloadAsset', () => { + it('should use the asset originalFileName when showing toasts', async () => { + const $t = vitest.fn().mockReturnValue('formatter'); + vitest.mocked(getFormatter).mockResolvedValue($t); + const asset = assetFactory.build({ originalFileName: 'asset.heic' }); + await handleDownloadAsset(asset, { edited: false }); + expect($t).toHaveBeenNthCalledWith(1, 'downloading_asset_filename', { values: { filename: 'asset.heic' } }); + expect(toastManager.success).toHaveBeenCalledWith('formatter'); + }); + + it('should use the motion asset originalFileName when showing toasts', async () => { + const $t = vitest.fn().mockReturnValue('formatter'); + vitest.mocked(getFormatter).mockResolvedValue($t); + const motionAsset = assetFactory.build({ originalFileName: 'asset.mov' }); + vitest.mocked(getAssetInfo).mockResolvedValue(motionAsset); + const asset = assetFactory.build({ originalFileName: 'asset.heic', livePhotoVideoId: '1' }); + await handleDownloadAsset(asset, { edited: false }); + expect($t).toHaveBeenNthCalledWith(1, 'downloading_asset_filename', { values: { filename: 'asset.heic' } }); + expect($t).toHaveBeenNthCalledWith(2, 'downloading_asset_filename', { values: { filename: 'asset.mov' } }); + expect(toastManager.success).toHaveBeenCalledWith('formatter'); + }); + }); }); diff --git a/web/src/lib/services/asset.service.ts b/web/src/lib/services/asset.service.ts index 9071f87f98..530bbc70f1 100644 --- a/web/src/lib/services/asset.service.ts +++ b/web/src/lib/services/asset.service.ts @@ -294,7 +294,6 @@ export const handleDownloadAsset = async (asset: AssetResponseDto, { edited }: { { filename: asset.originalFileName, id: asset.id, - size: asset.exifInfo?.fileSizeInByte || 0, }, ]; @@ -308,7 +307,6 @@ export const handleDownloadAsset = async (asset: AssetResponseDto, { edited }: { assets.push({ filename: motionAsset.originalFileName, id: asset.livePhotoVideoId, - size: motionAsset.exifInfo?.fileSizeInByte || 0, }); } } @@ -322,7 +320,7 @@ export const handleDownloadAsset = async (asset: AssetResponseDto, { edited }: { } try { - toastManager.success($t('downloading_asset_filename', { values: { filename: asset.originalFileName } })); + toastManager.success($t('downloading_asset_filename', { values: { filename } })); downloadUrl( getBaseUrl() + `/assets/${id}/original` +