mirror of
https://github.com/langgenius/dify.git
synced 2026-04-27 19:27:23 +08:00
313 lines
9.4 KiB
TypeScript
313 lines
9.4 KiB
TypeScript
import { render } from '@testing-library/react'
|
|
import EnterpriseDirect from './enterprise'
|
|
|
|
import { Enterprise, Professional, Sandbox, Team } from './index'
|
|
import ProfessionalDirect from './professional'
|
|
// Import real components for comparison
|
|
import SandboxDirect from './sandbox'
|
|
import TeamDirect from './team'
|
|
|
|
describe('Billing Plan Assets - Integration Tests', () => {
|
|
describe('Exports', () => {
|
|
it('should export Sandbox component', () => {
|
|
expect(Sandbox).toBeDefined()
|
|
// Sandbox is wrapped with React.memo, so it's an object
|
|
expect(typeof Sandbox).toMatch(/function|object/)
|
|
})
|
|
|
|
it('should export Professional component', () => {
|
|
expect(Professional).toBeDefined()
|
|
expect(typeof Professional).toBe('function')
|
|
})
|
|
|
|
it('should export Team component', () => {
|
|
expect(Team).toBeDefined()
|
|
expect(typeof Team).toBe('function')
|
|
})
|
|
|
|
it('should export Enterprise component', () => {
|
|
expect(Enterprise).toBeDefined()
|
|
expect(typeof Enterprise).toBe('function')
|
|
})
|
|
|
|
it('should export all four components', () => {
|
|
const exports = { Sandbox, Professional, Team, Enterprise }
|
|
expect(Object.keys(exports)).toHaveLength(4)
|
|
})
|
|
})
|
|
|
|
describe('Export Integrity', () => {
|
|
it('should export the correct Sandbox component', () => {
|
|
expect(Sandbox).toBe(SandboxDirect)
|
|
})
|
|
|
|
it('should export the correct Professional component', () => {
|
|
expect(Professional).toBe(ProfessionalDirect)
|
|
})
|
|
|
|
it('should export the correct Team component', () => {
|
|
expect(Team).toBe(TeamDirect)
|
|
})
|
|
|
|
it('should export the correct Enterprise component', () => {
|
|
expect(Enterprise).toBe(EnterpriseDirect)
|
|
})
|
|
})
|
|
|
|
describe('Rendering Integration', () => {
|
|
it('should render all components without conflicts', () => {
|
|
const { container } = render(
|
|
<div>
|
|
<Sandbox />
|
|
<Professional />
|
|
<Team />
|
|
<Enterprise />
|
|
</div>,
|
|
)
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
expect(svgs).toHaveLength(4)
|
|
})
|
|
|
|
it('should render Sandbox component correctly', () => {
|
|
const { container } = render(<Sandbox />)
|
|
const svg = container.querySelector('svg')
|
|
|
|
expect(svg).toBeInTheDocument()
|
|
expect(svg).toHaveAttribute('width', '32')
|
|
expect(svg).toHaveAttribute('height', '32')
|
|
})
|
|
|
|
it('should render Professional component correctly', () => {
|
|
const { container } = render(<Professional />)
|
|
const svg = container.querySelector('svg')
|
|
|
|
expect(svg).toBeInTheDocument()
|
|
expect(svg).toHaveAttribute('width', '32')
|
|
expect(svg).toHaveAttribute('height', '32')
|
|
})
|
|
|
|
it('should render Team component correctly', () => {
|
|
const { container } = render(<Team />)
|
|
const svg = container.querySelector('svg')
|
|
|
|
expect(svg).toBeInTheDocument()
|
|
expect(svg).toHaveAttribute('width', '32')
|
|
expect(svg).toHaveAttribute('height', '32')
|
|
})
|
|
|
|
it('should render Enterprise component correctly', () => {
|
|
const { container } = render(<Enterprise />)
|
|
const svg = container.querySelector('svg')
|
|
|
|
expect(svg).toBeInTheDocument()
|
|
expect(svg).toHaveAttribute('width', '32')
|
|
expect(svg).toHaveAttribute('height', '32')
|
|
})
|
|
})
|
|
|
|
describe('Visual Consistency', () => {
|
|
it('should maintain consistent SVG dimensions across all components', () => {
|
|
const components = [
|
|
<Sandbox key="sandbox" />,
|
|
<Professional key="professional" />,
|
|
<Team key="team" />,
|
|
<Enterprise key="enterprise" />,
|
|
]
|
|
|
|
components.forEach((component) => {
|
|
const { container } = render(component)
|
|
const svg = container.querySelector('svg')
|
|
|
|
expect(svg).toHaveAttribute('width', '32')
|
|
expect(svg).toHaveAttribute('height', '32')
|
|
expect(svg).toHaveAttribute('viewBox', '0 0 32 32')
|
|
})
|
|
})
|
|
|
|
it('should use consistent color variables across all components', () => {
|
|
const components = [Sandbox, Professional, Team, Enterprise]
|
|
|
|
components.forEach((Component) => {
|
|
const { container } = render(<Component />)
|
|
const elementsWithBlue = container.querySelectorAll('[fill="var(--color-saas-dify-blue-inverted)"]')
|
|
const elementsWithQuaternary = container.querySelectorAll('[fill="var(--color-text-quaternary)"]')
|
|
|
|
expect(elementsWithBlue.length).toBeGreaterThan(0)
|
|
expect(elementsWithQuaternary.length).toBeGreaterThan(0)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('Component Independence', () => {
|
|
it('should render components independently without side effects', () => {
|
|
const { container: container1 } = render(<Sandbox />)
|
|
const svg1 = container1.querySelector('svg')
|
|
|
|
const { container: container2 } = render(<Professional />)
|
|
const svg2 = container2.querySelector('svg')
|
|
|
|
// Components should not affect each other
|
|
expect(svg1).toBeInTheDocument()
|
|
expect(svg2).toBeInTheDocument()
|
|
expect(svg1).not.toBe(svg2)
|
|
})
|
|
|
|
it('should allow selective imports', () => {
|
|
// Verify that importing only one component works
|
|
const { container } = render(<Team />)
|
|
const svg = container.querySelector('svg')
|
|
|
|
expect(svg).toBeInTheDocument()
|
|
})
|
|
})
|
|
|
|
describe('Bundle Export Pattern', () => {
|
|
it('should follow barrel export pattern correctly', () => {
|
|
// All exports should be available from the index
|
|
expect(Sandbox).toBeDefined()
|
|
expect(Professional).toBeDefined()
|
|
expect(Team).toBeDefined()
|
|
expect(Enterprise).toBeDefined()
|
|
})
|
|
|
|
it('should maintain tree-shaking compatibility', () => {
|
|
// Each export should be independently usable
|
|
const components = [Sandbox, Professional, Team, Enterprise]
|
|
|
|
components.forEach((Component) => {
|
|
// Component can be function or object (React.memo wraps it)
|
|
expect(['function', 'object']).toContain(typeof Component)
|
|
const { container } = render(<Component />)
|
|
expect(container.querySelector('svg')).toBeInTheDocument()
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('Real-world Usage Patterns', () => {
|
|
it('should support rendering in a plan selector', () => {
|
|
const { container } = render(
|
|
<div className="plan-selector">
|
|
<button className="plan-option">
|
|
<Sandbox />
|
|
<span>Sandbox</span>
|
|
</button>
|
|
<button className="plan-option">
|
|
<Professional />
|
|
<span>Professional</span>
|
|
</button>
|
|
<button className="plan-option">
|
|
<Team />
|
|
<span>Team</span>
|
|
</button>
|
|
<button className="plan-option">
|
|
<Enterprise />
|
|
<span>Enterprise</span>
|
|
</button>
|
|
</div>,
|
|
)
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
const buttons = container.querySelectorAll('button')
|
|
|
|
expect(svgs).toHaveLength(4)
|
|
expect(buttons).toHaveLength(4)
|
|
})
|
|
|
|
it('should support rendering in a comparison table', () => {
|
|
const { container } = render(
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th><Sandbox /></th>
|
|
<th><Professional /></th>
|
|
<th><Team /></th>
|
|
<th><Enterprise /></th>
|
|
</tr>
|
|
</thead>
|
|
</table>,
|
|
)
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
expect(svgs).toHaveLength(4)
|
|
})
|
|
|
|
it('should support conditional rendering', () => {
|
|
const renderPlan = (planType: 'sandbox' | 'professional' | 'team' | 'enterprise') => (
|
|
<div>
|
|
{planType === 'sandbox' && <Sandbox />}
|
|
{planType === 'professional' && <Professional />}
|
|
{planType === 'team' && <Team />}
|
|
{planType === 'enterprise' && <Enterprise />}
|
|
</div>
|
|
)
|
|
|
|
const { container } = render(renderPlan('team'))
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
expect(svgs).toHaveLength(1)
|
|
})
|
|
|
|
it('should support dynamic rendering from array', () => {
|
|
const plans = [
|
|
{ id: 'sandbox', Icon: Sandbox },
|
|
{ id: 'professional', Icon: Professional },
|
|
{ id: 'team', Icon: Team },
|
|
{ id: 'enterprise', Icon: Enterprise },
|
|
]
|
|
|
|
const { container } = render(
|
|
<div>
|
|
{plans.map(({ id, Icon }) => (
|
|
<div key={id}>
|
|
<Icon />
|
|
</div>
|
|
))}
|
|
</div>,
|
|
)
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
expect(svgs).toHaveLength(4)
|
|
})
|
|
})
|
|
|
|
describe('Performance', () => {
|
|
it('should handle rapid re-renders efficiently', () => {
|
|
const { container, rerender } = render(
|
|
<div>
|
|
<Sandbox />
|
|
<Professional />
|
|
</div>,
|
|
)
|
|
|
|
// Simulate multiple re-renders
|
|
for (let i = 0; i < 5; i++) {
|
|
rerender(
|
|
<div>
|
|
<Team />
|
|
<Enterprise />
|
|
</div>,
|
|
)
|
|
}
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
expect(svgs).toHaveLength(2)
|
|
})
|
|
|
|
it('should handle large lists efficiently', () => {
|
|
const { container } = render(
|
|
<div>
|
|
{Array.from({ length: 20 }).map((_, i) => {
|
|
const components = [Sandbox, Professional, Team, Enterprise]
|
|
const Component = components[i % 4]
|
|
return <Component key={i} />
|
|
})}
|
|
</div>,
|
|
)
|
|
|
|
const svgs = container.querySelectorAll('svg')
|
|
expect(svgs).toHaveLength(20)
|
|
})
|
|
})
|
|
})
|