Files
dify-mirror/web/app/components/billing/pricing/plans/index.spec.tsx
2025-12-30 15:37:16 +08:00

92 lines
2.6 KiB
TypeScript

import type { Mock } from 'vitest'
import type { UsagePlanInfo } from '../../type'
import { render, screen } from '@testing-library/react'
import * as React from 'react'
import { Plan } from '../../type'
import { PlanRange } from '../plan-switcher/plan-range-switcher'
import cloudPlanItem from './cloud-plan-item'
import Plans from './index'
import selfHostedPlanItem from './self-hosted-plan-item'
vi.mock('./cloud-plan-item', () => ({
default: vi.fn(props => (
<div data-testid={`cloud-plan-${props.plan}`} data-current-plan={props.currentPlan}>
Cloud
{' '}
{props.plan}
</div>
)),
}))
vi.mock('./self-hosted-plan-item', () => ({
default: vi.fn(props => (
<div data-testid={`self-plan-${props.plan}`}>
Self
{' '}
{props.plan}
</div>
)),
}))
const buildPlan = (type: Plan) => {
const usage: UsagePlanInfo = {
buildApps: 0,
teamMembers: 0,
annotatedResponse: 0,
documentsUploadQuota: 0,
apiRateLimit: 0,
triggerEvents: 0,
vectorSpace: 0,
}
return {
type,
usage,
total: usage,
}
}
describe('Plans', () => {
// Cloud plans visible only when currentPlan is cloud
describe('Cloud plan rendering', () => {
it('should render sandbox, professional, and team cloud plans when workspace is cloud', () => {
render(
<Plans
plan={buildPlan(Plan.enterprise)}
currentPlan="cloud"
planRange={PlanRange.monthly}
canPay
/>,
)
expect(screen.getByTestId('cloud-plan-sandbox')).toBeInTheDocument()
expect(screen.getByTestId('cloud-plan-professional')).toBeInTheDocument()
expect(screen.getByTestId('cloud-plan-team')).toBeInTheDocument()
const firstCallProps = (cloudPlanItem as unknown as Mock).mock.calls[0][0]
expect(firstCallProps.plan).toBe(Plan.sandbox)
// Enterprise should be normalized to team when passed down
expect(firstCallProps.currentPlan).toBe(Plan.team)
})
})
// Self-hosted plans visible for self-managed workspaces
describe('Self-hosted plan rendering', () => {
it('should render all self-hosted plans when workspace type is self-hosted', () => {
render(
<Plans
plan={buildPlan(Plan.sandbox)}
currentPlan="self"
planRange={PlanRange.yearly}
canPay={false}
/>,
)
expect(screen.getByTestId('self-plan-community')).toBeInTheDocument()
expect(screen.getByTestId('self-plan-premium')).toBeInTheDocument()
expect(screen.getByTestId('self-plan-enterprise')).toBeInTheDocument()
expect(selfHostedPlanItem).toHaveBeenCalledTimes(3)
})
})
})