Add lightbox retries and queue removal
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-02-05 17:42:44 +01:00
parent 4e0d156065
commit 5f75c7ca6a
10 changed files with 282 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { describe, expect, it, vi } from 'vitest';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { render, waitFor } from '@testing-library/react';
const setSearchParamsMock = vi.fn();
@@ -100,22 +100,61 @@ vi.mock('lucide-react', () => ({
Share2: () => <span>share</span>,
ChevronLeft: () => <span>left</span>,
ChevronRight: () => <span>right</span>,
Loader2: () => <span>loader</span>,
X: () => <span>x</span>,
}));
import GalleryScreen from '../screens/GalleryScreen';
describe('GalleryScreen', () => {
beforeEach(() => {
setSearchParamsMock.mockClear();
pushGuestToastMock.mockClear();
fetchGalleryMock.mockReset();
fetchPhotoMock.mockReset();
});
afterEach(() => {
vi.useRealTimers();
});
it('clears the photo param and shows a warning when lightbox fails to load', async () => {
vi.useFakeTimers();
fetchGalleryMock.mockResolvedValue({ data: [] });
fetchPhotoMock.mockRejectedValue(Object.assign(new Error('not found'), { status: 404 }));
render(<GalleryScreen />);
await waitFor(() => {
expect(pushGuestToastMock).toHaveBeenCalled();
expect(setSearchParamsMock).toHaveBeenCalled();
});
for (let i = 0; i < 7; i += 1) {
await vi.advanceTimersByTimeAsync(1500);
await Promise.resolve();
}
await vi.advanceTimersByTimeAsync(1000);
await vi.runAllTimersAsync();
await Promise.resolve();
expect(pushGuestToastMock).toHaveBeenCalled();
expect(setSearchParamsMock).toHaveBeenCalled();
const [params] = setSearchParamsMock.mock.calls.at(-1) ?? [];
const search = params instanceof URLSearchParams ? params : new URLSearchParams(params);
expect(search.get('photo')).toBeNull();
});
it('keeps lightbox open when a seeded photo exists but fetch fails', async () => {
vi.useFakeTimers();
fetchGalleryMock.mockResolvedValue({
data: [{ id: 123, thumbnail_url: '/storage/demo.jpg', likes_count: 2 }],
});
fetchPhotoMock.mockRejectedValue(Object.assign(new Error('not found'), { status: 404 }));
render(<GalleryScreen />);
await Promise.resolve();
await vi.runAllTimersAsync();
expect(fetchGalleryMock).toHaveBeenCalled();
expect(fetchPhotoMock).toHaveBeenCalled();
await vi.advanceTimersByTimeAsync(1000);
expect(setSearchParamsMock).not.toHaveBeenCalled();
expect(pushGuestToastMock).not.toHaveBeenCalled();
});
});

View File

@@ -34,6 +34,7 @@ vi.mock('../services/uploadApi', () => ({
retryAll: vi.fn(),
clearFinished: vi.fn(),
refresh: vi.fn(),
remove: vi.fn(),
}),
}));