mattermost-mobile-upstream/app/components/files/image_file.test.tsx
JG Heithcock a4a750284c
[MM-67919]: Load original file URL for GIF attachments to preserve animation (#9604)
* Fix GIF animations not playing for non-uploading users

GIF file attachments were rendered as static images for everyone except
the original uploader because the app fetched the server-generated JPEG
preview instead of the original animated file. Use buildFileUrl for GIFs
in both the channel thumbnail and gallery views, and pass the autoplay
prop through to ExpoImage in the gallery renderer.

* Fix lint: place JSX props on separate lines in test file

* Reintegrated the comment re no thumbnailUri
2026-03-22 15:18:27 -07:00

132 lines
4.2 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react';
import {buildFilePreviewUrl, buildFileUrl} from '@actions/remote/file';
import {renderWithIntlAndTheme} from '@test/intl-test-helper';
import TestHelper from '@test/test_helper';
import ImageFile from './image_file';
jest.mock('@actions/remote/file', () => ({
buildFilePreviewUrl: jest.fn().mockReturnValue('https://server/preview/file1'),
buildFileUrl: jest.fn().mockReturnValue('https://server/files/file1'),
}));
jest.mock('@context/server', () => ({
useServerUrl: jest.fn().mockReturnValue('https://server'),
}));
jest.mock('@store/ephemeral_store', () => ({
__esModule: true,
default: {
isFileRejected: jest.fn().mockReturnValue(false),
},
}));
jest.mock('@components/progressive_image', () => {
const {View, Text} = require('react-native');
return {
__esModule: true,
default: (props: Record<string, unknown>) => (
<View testID='progressive-image'>
{props.imageUri && <Text testID='image-uri'>{String(props.imageUri)}</Text>}
{props.defaultSource && <Text testID='default-source'>{JSON.stringify(props.defaultSource)}</Text>}
</View>
),
};
});
jest.mock('./file_icon', () => 'FileIcon');
describe('ImageFile', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('should use buildFileUrl for GIF files without localPath', () => {
const gifFile = TestHelper.fakeFileInfo({
id: 'gif1',
mime_type: 'image/gif',
name: 'animation.gif',
extension: 'gif',
has_preview_image: true,
localPath: undefined,
});
const {getByTestId} = renderWithIntlAndTheme(
<ImageFile
file={gifFile}
inViewPort={true}
/>,
);
expect(buildFileUrl).toHaveBeenCalledWith('https://server', 'gif1', undefined);
expect(buildFilePreviewUrl).not.toHaveBeenCalled();
expect(getByTestId('image-uri')).toHaveTextContent('https://server/files/file1');
});
it('should use buildFilePreviewUrl for non-GIF files with has_preview_image', () => {
const pngFile = TestHelper.fakeFileInfo({
id: 'png1',
mime_type: 'image/png',
name: 'photo.png',
extension: 'png',
has_preview_image: true,
localPath: undefined,
});
const {getByTestId} = renderWithIntlAndTheme(
<ImageFile
file={pngFile}
inViewPort={true}
/>,
);
expect(buildFilePreviewUrl).toHaveBeenCalledWith('https://server', 'png1');
expect(buildFileUrl).not.toHaveBeenCalled();
expect(getByTestId('image-uri')).toHaveTextContent('https://server/preview/file1');
});
it('should use buildFileUrl for non-GIF files without has_preview_image', () => {
const file = TestHelper.fakeFileInfo({
id: 'file1',
mime_type: 'image/png',
name: 'image.png',
extension: 'png',
has_preview_image: false,
localPath: undefined,
});
renderWithIntlAndTheme(
<ImageFile
file={file}
inViewPort={true}
/>,
);
expect(buildFileUrl).toHaveBeenCalledWith('https://server', 'file1', undefined);
expect(buildFilePreviewUrl).not.toHaveBeenCalled();
});
it('should use localPath when available regardless of file type', () => {
const gifFile = TestHelper.fakeFileInfo({
id: 'gif1',
mime_type: 'image/gif',
name: 'animation.gif',
extension: 'gif',
has_preview_image: true,
localPath: '/data/files/animation.gif',
});
const {getByTestId} = renderWithIntlAndTheme(
<ImageFile file={gifFile}/>,
);
expect(buildFileUrl).not.toHaveBeenCalled();
expect(buildFilePreviewUrl).not.toHaveBeenCalled();
expect(getByTestId('default-source')).toHaveTextContent(JSON.stringify({uri: 'file:///data/files/animation.gif'}));
});
});