66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
||
import type { ImmichAsset } from '@/lib/immich';
|
||
|
||
/**
|
||
* #831: a photo edited in Immich (crop, rotate) reaches the grid, the
|
||
* lightbox and the zoom as edited — an image URL with the edit marker, the
|
||
* edited proportions, and the edited full-size rendition behind the zoom.
|
||
*/
|
||
|
||
vi.mock('@/lib/config', () => ({
|
||
getConfig: () => ({ authSecret: 'test-auth-secret-32-chars-long-min' }),
|
||
getConfigOrNull: () => null,
|
||
}));
|
||
|
||
const { toPhotoItems } = await import('../photoItems');
|
||
|
||
const exif = (w: number, h: number, orientation: string | null = null) =>
|
||
({ exifImageWidth: w, exifImageHeight: h, orientation }) as ImmichAsset['exifInfo'];
|
||
|
||
const asset = (over: Partial<ImmichAsset>): ImmichAsset => ({
|
||
id: '11111111-1111-1111-1111-111111111111',
|
||
type: 'IMAGE',
|
||
originalFileName: 'scan.jpg',
|
||
originalMimeType: 'image/jpeg',
|
||
thumbhash: null,
|
||
fileCreatedAt: '2020-07-24T11:13:27.000Z',
|
||
isTrashed: false,
|
||
...over,
|
||
});
|
||
|
||
const ALBUM = '22222222-2222-2222-2222-222222222222';
|
||
|
||
describe('toPhotoItems for photos edited in Immich (#831)', () => {
|
||
// Measured on Immich 3.2: a scan stored 1076×723, rotated 270° in Immich.
|
||
const rotated = asset({
|
||
isEdited: true,
|
||
updatedAt: '2026-09-04T19:22:09.220Z',
|
||
width: 723,
|
||
height: 1076,
|
||
exifInfo: exif(1076, 723),
|
||
});
|
||
|
||
it('marks the edited photo’s URLs and gives it the edited proportions', () => {
|
||
const [item] = toPhotoItems([rotated], false, false);
|
||
expect(item.thumbUrl).toMatch(/[?&]e=[0-9a-z]+(&|$)/);
|
||
expect(item.previewUrl).toBe(item.thumbUrl);
|
||
expect(item.aspectRatio).toBeCloseTo(723 / 1076);
|
||
});
|
||
|
||
it('leaves a photo that is not edited exactly as it was', () => {
|
||
const [item] = toPhotoItems(
|
||
[asset({ width: 1076, height: 723, exifInfo: exif(1076, 723) })],
|
||
false,
|
||
false,
|
||
);
|
||
expect(item.thumbUrl).toMatch(/\?size=preview$/);
|
||
expect(item.aspectRatio).toBeCloseTo(1076 / 723);
|
||
});
|
||
|
||
it('offers zoom at the edited size', () => {
|
||
const [item] = toPhotoItems([rotated], false, false, undefined, ALBUM);
|
||
expect(item.zoomUrl).toMatch(/^\/api\/zoom\//);
|
||
expect([item.zoomWidth, item.zoomHeight]).toEqual([723, 1076]);
|
||
});
|
||
});
|