Sync latest TrueGrowth updates
Some checks failed
CI / main (push) Has been cancelled
CI / release-e2e (push) Has been cancelled

This commit is contained in:
jiam
2026-07-08 02:03:18 +08:00
parent 52636c91ae
commit 5119ac0ef8
102 changed files with 20985 additions and 1760 deletions

View File

@@ -16,17 +16,23 @@ vi.mock('tdesign-react', () => ({
}));
vi.mock('../lazy-image', () => ({
LazyImage: ({ src, alt, className }: any) => (
<img src={src} alt={alt} className={className} />
LazyImage: ({ src, alt, className, objectFit }: any) => (
<img
src={src}
alt={alt}
className={className}
data-object-fit={objectFit}
/>
),
}));
vi.mock('../shared/VideoPosterPreview', () => ({
VideoPosterPreview: ({ src, poster, alt, className }: any) => (
VideoPosterPreview: ({ src, poster, alt, className, fit }: any) => (
<img
src={poster || src}
alt={alt}
className={`video-poster-preview__media ${className || ''}`}
data-fit={fit}
/>
),
}));
@@ -66,6 +72,15 @@ const videoAsset: Asset = {
mimeType: 'video/mp4',
};
const imageAsset: Asset = {
...baseAsset,
id: 'image-asset',
type: AssetType.IMAGE,
url: '/media/demo.jpg',
name: '图片素材',
mimeType: 'image/jpeg',
};
const audioAsset: Asset = {
...baseAsset,
id: 'audio-asset',
@@ -76,13 +91,17 @@ const audioAsset: Asset = {
mimeType: 'audio/mpeg',
};
function renderAssetItem(asset: Asset) {
function renderAssetItem(
asset: Asset,
props: Partial<React.ComponentProps<typeof AssetItem>> = {}
) {
return render(
<AssetItem
asset={asset}
viewMode="grid"
isSelected={false}
onSelect={vi.fn()}
{...props}
/>
);
}
@@ -155,4 +174,44 @@ describe('AssetItem hover preview', () => {
});
expect(screen.getByAltText(audioAsset.name)).not.toBeNull();
});
it('does not start video or audio hover playback when disabled', async () => {
const { container, rerender } = renderAssetItem(videoAsset, {
disableHoverPlayback: true,
});
const videoItem = container.querySelector('.asset-item') as HTMLElement;
fireEvent.mouseEnter(videoItem);
expect(container.querySelector('.asset-item__hover-video')).toBeNull();
expect(window.HTMLMediaElement.prototype.play).not.toHaveBeenCalled();
rerender(
<AssetItem
asset={audioAsset}
viewMode="grid"
isSelected={false}
onSelect={vi.fn()}
disableHoverPlayback
/>
);
const audioItem = container.querySelector('.asset-item') as HTMLElement;
fireEvent.mouseEnter(audioItem);
expect(container.querySelector('.asset-item__hover-audio')).toBeNull();
expect(window.HTMLMediaElement.prototype.play).not.toHaveBeenCalled();
});
it('passes cover fit to image and video thumbnails when requested', () => {
renderAssetItem(imageAsset, { thumbnailFit: 'cover' });
expect(
screen.getByAltText(imageAsset.name).getAttribute('data-object-fit')
).toBe('cover');
renderAssetItem(videoAsset, { thumbnailFit: 'cover' });
expect(screen.getByAltText(videoAsset.name).getAttribute('data-fit')).toBe(
'cover'
);
});
});