import { fireEvent, screen } from '@testing-library/react'
import type { ReactNode } from 'react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import Subscription from './Subscription'
import { render } from '@/tests/helpers'
const { mockSubscription, mockSetPanelKey } = vi.hoisted(() => ({
mockSubscription: vi.fn(),
mockSetPanelKey: vi.fn(),
}))
vi.mock('common', async (importOriginal) => {
const original = (await importOriginal()) as typeof import('common')
return {
...original,
useParams: () => ({ slug: 'stripe-org' }),
useFlag: () => false,
}
})
vi.mock('@/data/subscriptions/org-subscription-query', () => ({
useOrgSubscriptionQuery: () => mockSubscription(),
}))
vi.mock('@/hooks/misc/useCheckPermissions', () => ({
useAsyncCheckPermissions: () => ({ can: true, isSuccess: true }),
}))
vi.mock('@/state/organization-settings', () => ({
useOrgSettingsPageStateSnapshot: () => ({
setPanelKey: mockSetPanelKey,
}),
}))
vi.mock('../Restriction', () => ({
Restriction: () => null,
}))
vi.mock('../ProjectUpdateDisabledTooltip', () => ({
ProjectUpdateDisabledTooltip: ({ children }: { children: ReactNode }) => children,
}))
vi.mock('./PlanUpdateSidePanel', () => ({
PlanUpdateSidePanel: () => null,
}))
describe('Subscription', () => {
beforeEach(() => {
vi.clearAllMocks()
mockSubscription.mockReturnValue({
data: {
plan: { id: 'free', name: 'Free' },
usage_billing_enabled: true,
},
error: null,
isPending: false,
isError: false,
isSuccess: true,
})
})
it('shows the plan-change CTA and opens the side panel when clicked', () => {
render()
const button = screen.getByRole('button', { name: 'Change subscription plan' })
expect(button).toBeInTheDocument()
expect(mockSetPanelKey).not.toHaveBeenCalled()
fireEvent.click(button)
expect(mockSetPanelKey).toHaveBeenCalledWith('subscriptionPlan')
})
it('shows the support fallback when plan changes are not available', () => {
mockSubscription.mockReturnValue({
data: {
plan: { id: 'enterprise', name: 'Enterprise' },
usage_billing_enabled: true,
},
error: null,
isPending: false,
isError: false,
isSuccess: true,
})
render()
expect(
screen.queryByRole('button', { name: 'Change subscription plan' })
).not.toBeInTheDocument()
expect(screen.getByText('Unable to update plan from Enterprise')).toBeInTheDocument()
})
})