import { renderHook } from '@testing-library/react-hooks'
import { describe, it, expect } from 'vitest'
import { useRollChanged } from './useRollChanged'
describe('useRollChanged', () => {
const setup = (props, shown = { current: null }) => ({
shown,
...renderHook(({ seed, loading }) => useRollChanged(shown, seed, loading), {
initialProps: props,
}),
})
it('reports a change while a load is in flight on a fresh mount', () => {
const { result } = setup({ seed: 's1', loading: true })
expect(result.current).toBe(true)
})
it('reports no change when mounted with data already in hand', () => {
const { result } = setup({ seed: 's1', loading: false })
expect(result.current).toBe(false)
})
it('stays false while loading a filter change on the same roll', () => {
const { result, rerender } = setup({ seed: 's1', loading: false })
rerender({ seed: 's1', loading: true })
expect(result.current).toBe(false)
})
it('goes true while loading after the seed changes', () => {
const { result, rerender } = setup({ seed: 's1', loading: false })
rerender({ seed: 's2', loading: true })
expect(result.current).toBe(true)
})
it('clears once the new roll has loaded', () => {
const { result, rerender } = setup({ seed: 's1', loading: false })
rerender({ seed: 's2', loading: true })
expect(result.current).toBe(true)
rerender({ seed: 's2', loading: false })
expect(result.current).toBe(false)
})
it('still reports a change when the seed arrives before loading starts', () => {
const { result, rerender } = setup({ seed: 's1', loading: false })
rerender({ seed: 's2', loading: false })
expect(result.current).toBe(true)
})
it('reports a change when a refresh remounts the grid before loading starts', () => {
const { shown, unmount } = setup({ seed: 's1', loading: false })
expect(shown.current).toBe('s1')
unmount()
const remounted = setup({ seed: 's2', loading: false }, shown)
expect(remounted.result.current).toBe(true)
remounted.rerender({ seed: 's2', loading: true })
expect(remounted.result.current).toBe(true)
remounted.rerender({ seed: 's2', loading: false })
expect(remounted.result.current).toBe(false)
})
it('reports no change when a remount keeps the same roll', () => {
const { shown, unmount } = setup({ seed: 's1', loading: false })
unmount()
const remounted = setup({ seed: 's1', loading: false }, shown)
expect(remounted.result.current).toBe(false)
})
})