feat(simulations): config par tâche + hook useTimer + 7 tests
This commit is contained in:
parent
869668a1ba
commit
24968f542d
3 changed files with 199 additions and 0 deletions
100
src/features/simulations/hooks/__tests__/useTimer.test.ts
Normal file
100
src/features/simulations/hooks/__tests__/useTimer.test.ts
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
/**
|
||||
* Tests du hook useTimer — logique de décompte critique (auto-submit à l'expiration).
|
||||
*/
|
||||
|
||||
import { act, renderHook } from '@testing-library/react'
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { useTimer } from '../useTimer'
|
||||
|
||||
describe('useTimer', () => {
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers()
|
||||
})
|
||||
|
||||
it('initialise secondesRestantes à dureeMinutes × 60', () => {
|
||||
const { result } = renderHook(() => useTimer(10, true))
|
||||
expect(result.current.secondesRestantes).toBe(600)
|
||||
expect(result.current.isExpired).toBe(false)
|
||||
})
|
||||
|
||||
it('décrémente de 1 par seconde quand active=true', () => {
|
||||
const { result } = renderHook(() => useTimer(1, true))
|
||||
expect(result.current.secondesRestantes).toBe(60)
|
||||
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(1000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(59)
|
||||
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(3000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(56)
|
||||
})
|
||||
|
||||
it('ne décrémente pas quand active=false', () => {
|
||||
const { result } = renderHook(() => useTimer(1, false))
|
||||
expect(result.current.secondesRestantes).toBe(60)
|
||||
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(5000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(60)
|
||||
expect(result.current.isExpired).toBe(false)
|
||||
})
|
||||
|
||||
it('passe isExpired=true quand secondesRestantes atteint 0', () => {
|
||||
const { result } = renderHook(() => useTimer(1 / 60, true)) // 1 seconde
|
||||
expect(result.current.secondesRestantes).toBe(1)
|
||||
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(1000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(0)
|
||||
expect(result.current.isExpired).toBe(true)
|
||||
})
|
||||
|
||||
it("n'évolue pas sous zéro", () => {
|
||||
const { result } = renderHook(() => useTimer(1 / 60, true)) // 1 seconde
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(5000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(0)
|
||||
expect(result.current.isExpired).toBe(true)
|
||||
})
|
||||
|
||||
it('reset() restaure la valeur initiale', () => {
|
||||
const { result } = renderHook(() => useTimer(1, true))
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(10000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(50)
|
||||
|
||||
act(() => {
|
||||
result.current.reset()
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(60)
|
||||
expect(result.current.isExpired).toBe(false)
|
||||
})
|
||||
|
||||
it('reprend le décompte quand active passe de false à true sans reset', () => {
|
||||
const { result, rerender } = renderHook(({ active }) => useTimer(1, active), {
|
||||
initialProps: { active: false },
|
||||
})
|
||||
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(3000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(60)
|
||||
|
||||
rerender({ active: true })
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(2000)
|
||||
})
|
||||
expect(result.current.secondesRestantes).toBe(58)
|
||||
})
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue