Files
fotospiel-app/resources/js/guest/hooks/__tests__/useLiveShowPlayback.test.tsx
Codex Agent 53eb560aa5
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Add live show player playback and effects
2026-01-05 18:31:01 +01:00

85 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
buildFramePhotos,
resolveIntervalMs,
resolveItemsPerFrame,
resolvePlaybackQueue,
} from '../useLiveShowPlayback';
import type { LiveShowPhoto, LiveShowSettings } from '../../services/liveShowApi';
const baseSettings: LiveShowSettings = {
retention_window_hours: 12,
moderation_mode: 'manual',
playback_mode: 'newest_first',
pace_mode: 'auto',
fixed_interval_seconds: 8,
layout_mode: 'single',
effect_preset: 'film_cut',
effect_intensity: 70,
background_mode: 'blur_last',
};
const photos: LiveShowPhoto[] = [
{
id: 1,
full_url: '/one.jpg',
thumb_url: '/one-thumb.jpg',
approved_at: '2025-01-01T10:00:00Z',
is_featured: false,
live_priority: 0,
},
{
id: 2,
full_url: '/two.jpg',
thumb_url: '/two-thumb.jpg',
approved_at: '2025-01-01T12:00:00Z',
is_featured: true,
live_priority: 2,
},
{
id: 3,
full_url: '/three.jpg',
thumb_url: '/three-thumb.jpg',
approved_at: '2025-01-01T11:00:00Z',
is_featured: false,
live_priority: 0,
},
];
describe('useLiveShowPlayback helpers', () => {
it('resolves items per frame per layout', () => {
expect(resolveItemsPerFrame('single')).toBe(1);
expect(resolveItemsPerFrame('split')).toBe(2);
expect(resolveItemsPerFrame('grid_burst')).toBe(4);
});
it('builds a curated queue when configured', () => {
const queue = resolvePlaybackQueue(photos, {
...baseSettings,
playback_mode: 'curated',
});
expect(queue[0].id).toBe(2);
expect(queue.every((photo) => photo.id === 2 || photo.live_priority > 0 || photo.is_featured)).toBe(true);
});
it('builds frame photos without duplicates when list is smaller', () => {
const frame = buildFramePhotos([photos[0]], 0, 4);
expect(frame).toHaveLength(1);
expect(frame[0].id).toBe(1);
});
it('uses fixed interval when configured', () => {
const interval = resolveIntervalMs(
{
...baseSettings,
pace_mode: 'fixed',
fixed_interval_seconds: 12,
},
photos.length
);
expect(interval).toBe(12_000);
});
});