import { render, screen } from '@testing-library/react'
import { beforeEach, describe, expect, test } from 'vitest'
import { SkeletonLoader } from './skeleton-loader'
import { useWidgetStore } from '../stores/widget-store'
// Mock Skeleton component
function MockSkeleton() {
return
Loading...
}
describe('SkeletonLoader', () => {
const widgetId = 'test-skeleton-widget'
beforeEach(() => {
useWidgetStore.getState().clearWidgets()
})
describe('when isLoading is true', () => {
test('renders skeleton component', () => {
useWidgetStore.getState().setWidget(widgetId, { isLoading: true })
render(
Content
,
)
expect(screen.getByLabelText('Loading skeleton')).toBeTruthy()
expect(screen.queryByText('Content')).toBeNull()
})
test('returns null when Skeleton prop is null', () => {
useWidgetStore.getState().setWidget(widgetId, { isLoading: true })
const { container } = render(
Content
,
)
expect(container.firstChild).toBeNull()
})
})
describe('when isLoading is false', () => {
test('renders children', () => {
useWidgetStore.getState().setWidget(widgetId, { isLoading: false })
render(
Content
,
)
expect(screen.getByText('Content')).toBeTruthy()
expect(screen.queryByLabelText('Loading skeleton')).toBeNull()
})
})
describe('when isLoading is undefined', () => {
test('renders children', () => {
useWidgetStore.getState().setWidget(widgetId, { isLoading: undefined })
render(
Content
,
)
expect(screen.getByText('Content')).toBeTruthy()
expect(screen.queryByLabelText('Loading skeleton')).toBeNull()
})
})
describe('when widget does not exist in store', () => {
test('renders children (isLoading is undefined)', () => {
render(
Content
,
)
expect(screen.getByText('Content')).toBeTruthy()
expect(screen.queryByLabelText('Loading skeleton')).toBeNull()
})
})
describe('reactivity to store changes', () => {
test('updates from skeleton to content when isLoading becomes false', () => {
useWidgetStore.getState().setWidget(widgetId, { isLoading: true })
const { rerender } = render(
Content
,
)
expect(screen.getByLabelText('Loading skeleton')).toBeTruthy()
// Update store with isLoading false
useWidgetStore.getState().setWidget(widgetId, { isLoading: false })
// Force rerender to pick up store changes
rerender(
Content
,
)
expect(screen.queryByLabelText('Loading skeleton')).toBeNull()
expect(screen.getByText('Content')).toBeTruthy()
})
test('updates from content to skeleton when isLoading becomes true', () => {
useWidgetStore.getState().setWidget(widgetId, { isLoading: false })
const { rerender } = render(
Content
,
)
expect(screen.getByText('Content')).toBeTruthy()
// Update store to isLoading true
useWidgetStore.getState().setWidget(widgetId, { isLoading: true })
// Force rerender to pick up store changes
rerender(
Content
,
)
expect(screen.getByLabelText('Loading skeleton')).toBeTruthy()
expect(screen.queryByText('Content')).toBeNull()
})
})
})