diff --git a/resources/js/pages/scheduled-commits/index.tsx b/resources/js/pages/scheduled-commits/index.tsx index 750e28931..349072b97 100644 --- a/resources/js/pages/scheduled-commits/index.tsx +++ b/resources/js/pages/scheduled-commits/index.tsx @@ -101,7 +101,7 @@ export default function Index({ const { start, stop } = usePoll( 30_000, backgroundPollOptions({ only: ['scheduledCommits'] }), - { autoStart: false }, + { autoStart: false, background: 'pause' }, ); useEffect(() => { diff --git a/tests/Unit/ScheduledCommitPolling.test.tsx b/tests/Unit/ScheduledCommitPolling.test.tsx new file mode 100644 index 000000000..8fc67ae39 --- /dev/null +++ b/tests/Unit/ScheduledCommitPolling.test.tsx @@ -0,0 +1,47 @@ +import assert from 'node:assert/strict'; +import type { ReloadOptions } from '@inertiajs/core'; +import type { PropsWithChildren } from 'react'; +import { renderToString } from 'react-dom/server'; +import { test, vi } from 'vite-plus/test'; + +const usePoll = vi.fn(() => ({ start: vi.fn(), stop: vi.fn() })); + +vi.doMock('@inertiajs/react', async () => ({ + ...(await vi.importActual('@inertiajs/react')), + Head: () => null, + Link: ({ children }: PropsWithChildren) => children, + usePage: () => ({ props: { auth: { user: null } } }), + usePoll, +})); +vi.doMock('@/hooks/use-realtime', () => ({ useIsListening: () => false })); +vi.doMock('@/layouts/app-layout', () => ({ + default: ({ children }: PropsWithChildren) => children, +})); + +const { default: ScheduledCommits } = + await import('../../resources/js/pages/scheduled-commits/index'); + +test('scheduled commits pause polling in hidden tabs without changing the partial reload', () => { + usePoll.mockClear(); + + renderToString( + , + ); + + assert.equal(usePoll.mock.calls.length, 1); + const [interval, reload, options] = usePoll.mock.calls[0] as unknown as [ + number, + () => ReloadOptions, + { autoStart: boolean; background: string }, + ]; + + assert.equal(interval, 30_000); + assert.deepEqual(reload().only, ['scheduledCommits']); + assert.deepEqual(options, { autoStart: false, background: 'pause' }); +});