import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { afterEach, describe, expect, it, vi } from 'vitest'
import App from './App'
describe('App', () => {
afterEach(() => {
vi.unstubAllGlobals()
vi.restoreAllMocks()
})
it('renders the dashboard shell with brand and nav', async () => {
vi.stubGlobal(
'fetch',
vi.fn().mockResolvedValue({
ok: true,
json: async () => ({
service: 'clustercanvas',
version: '0.1.0',
}),
}),
)
render()
expect(
screen.getByRole('heading', { name: 'Cluster Canvas' }),
).toBeInTheDocument()
expect(screen.getByText(`Frontend Version ${__FRONTEND_VERSION__}`)).toBeInTheDocument()
expect(await screen.findByText('Backend Version 0.1.0')).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'Overview' })).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'VMs' })).toBeInTheDocument()
expect(
screen.getByRole('button', { name: 'Containers' }),
).toBeInTheDocument()
expect(
screen.getByRole('button', { name: 'Configuration' }),
).toBeInTheDocument()
expect(
screen.getByRole('heading', { name: 'Overview', level: 2 }),
).toBeInTheDocument()
expect(screen.getByText('Coming soon')).toBeInTheDocument()
})
it('switches the content panel when a nav item is selected', async () => {
const user = userEvent.setup()
vi.stubGlobal(
'fetch',
vi.fn().mockResolvedValue({
ok: true,
json: async () => ({
service: 'clustercanvas',
version: '0.1.0',
}),
}),
)
render()
await user.click(screen.getByRole('button', { name: 'VMs' }))
expect(
screen.getByRole('heading', { name: 'VMs', level: 2 }),
).toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'Configuration' }))
expect(
screen.getByRole('heading', { name: 'Configuration', level: 2 }),
).toBeInTheDocument()
})
it('shows unavailable when backend status fetch fails', async () => {
vi.stubGlobal(
'fetch',
vi.fn().mockResolvedValue({
ok: false,
status: 503,
}),
)
render()
expect(
await screen.findByText('Backend Version unavailable'),
).toBeInTheDocument()
})
})