// ModelReload.test.tsx
import React from 'react'
import '@testing-library/jest-dom'
import { render, screen, act } from '@testing-library/react'
import ModelReload from './ModelReload'
import { useActiveModel } from '@/hooks/useActiveModel'
jest.mock('@/hooks/useActiveModel')
describe('ModelReload Component', () => {
beforeEach(() => {
jest.useFakeTimers()
})
afterEach(() => {
jest.useRealTimers()
})
it('renders nothing when not loading', () => {
;(useActiveModel as jest.Mock).mockReturnValue({
stateModel: { loading: false },
})
const { container } = render()
expect(container).toBeEmptyDOMElement()
})
it('renders loading message when loading', () => {
;(useActiveModel as jest.Mock).mockReturnValue({
stateModel: { loading: true, model: { id: 'test-model' } },
})
render()
expect(screen.getByText(/Reloading model test-model/)).toBeInTheDocument()
})
it('updates loader percentage over time', () => {
;(useActiveModel as jest.Mock).mockReturnValue({
stateModel: { loading: true, model: { id: 'test-model' } },
})
render()
// Initial render
expect(screen.getByText(/Reloading model test-model/)).toBeInTheDocument()
const loaderElement = screen.getByText(
/Reloading model test-model/
).parentElement
// Check initial width
expect(loaderElement?.firstChild).toHaveStyle('width: 50%')
// Advance timers and check updated width
act(() => {
jest.advanceTimersByTime(250)
})
expect(loaderElement?.firstChild).toHaveStyle('width: 78%')
// Advance to 99%
for (let i = 0; i < 27; i++) {
act(() => {
jest.advanceTimersByTime(250)
})
}
expect(loaderElement?.firstChild).toHaveStyle('width: 99%')
// Advance one more time to hit the 250ms delay
act(() => {
jest.advanceTimersByTime(250)
})
expect(loaderElement?.firstChild).toHaveStyle('width: 99%')
})
it('stops at 99%', () => {
;(useActiveModel as jest.Mock).mockReturnValue({
stateModel: { loading: true, model: { id: 'test-model' } },
})
render()
const loaderElement = screen.getByText(
/Reloading model test-model/
).parentElement
// Advance to 99%
for (let i = 0; i < 50; i++) {
act(() => {
jest.advanceTimersByTime(250)
})
}
expect(loaderElement?.firstChild).toHaveStyle('width: 99%')
// Advance more and check it stays at 99%
act(() => {
jest.advanceTimersByTime(1000)
})
expect(loaderElement?.firstChild).toHaveStyle('width: 99%')
})
it('resets to 0% when loading completes', () => {
const { rerender } = render()
;(useActiveModel as jest.Mock).mockReturnValue({
stateModel: { loading: true, model: { id: 'test-model' } },
})
rerender()
const loaderElement = screen.getByText(
/Reloading model test-model/
).parentElement
expect(loaderElement?.firstChild).toHaveStyle('width: 50%')
// Set loading to false
;(useActiveModel as jest.Mock).mockReturnValue({
stateModel: { loading: false },
})
rerender()
expect(
screen.queryByText(/Reloading model test-model/)
).not.toBeInTheDocument()
})
})