import { fireEvent, screen } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { PauseProjectButton } from './PauseProjectButton'
import { customRender } from '@/tests/lib/custom-render'
const {
mockUseAsyncCheckPermissions,
mockUseCheckEntitlements,
mockUseIsHighAvailability,
mockUseSelectedOrganizationQuery,
mockUseSelectedProjectQuery,
} = vi.hoisted(() => ({
mockUseAsyncCheckPermissions: vi.fn(),
mockUseCheckEntitlements: vi.fn(),
mockUseIsHighAvailability: vi.fn(),
mockUseSelectedOrganizationQuery: vi.fn(),
mockUseSelectedProjectQuery: vi.fn(),
}))
vi.mock('@/hooks/misc/useCheckEntitlements', () => ({
useCheckEntitlements: mockUseCheckEntitlements,
}))
vi.mock('@/hooks/misc/useCheckPermissions', () => ({
useAsyncCheckPermissions: mockUseAsyncCheckPermissions,
}))
vi.mock('@/hooks/misc/useSelectedOrganization', () => ({
useSelectedOrganizationQuery: mockUseSelectedOrganizationQuery,
}))
vi.mock('@/hooks/misc/useSelectedProject', () => ({
useIsHighAvailability: mockUseIsHighAvailability,
useIsProjectActive: () => true,
useSelectedProjectQuery: mockUseSelectedProjectQuery,
}))
describe('PauseProjectButton', () => {
beforeEach(() => {
vi.clearAllMocks()
mockUseAsyncCheckPermissions.mockReturnValue({ can: true })
mockUseCheckEntitlements.mockReturnValue({ hasAccess: true })
mockUseSelectedOrganizationQuery.mockReturnValue({ data: { plan: { id: 'free' } } })
mockUseSelectedProjectQuery.mockReturnValue({
data: { ref: 'default', status: 'ACTIVE_HEALTHY' },
})
mockUseIsHighAvailability.mockReturnValue(false)
})
it('enables pausing for an active project that is not High Availability', () => {
customRender()
expect(screen.getByRole('button', { name: 'Pause project' })).toBeEnabled()
})
it('disables pausing with a tooltip on High Availability projects', async () => {
mockUseIsHighAvailability.mockReturnValue(true)
customRender()
const button = screen.getByRole('button', { name: 'Pause project' })
expect(button).toBeDisabled()
// Radix opens the tooltip on pointermove; userEvent does not synthesize
// pointer events on disabled buttons
fireEvent.pointerMove(button)
expect(
await screen.findAllByText(
'Pausing is unavailable on High Availability projects',
{},
{ timeout: 2000 }
)
).not.toHaveLength(0)
})
})