Files
smoothschedule/frontend/src/components/ui/__tests__/UnfinishedBadge.test.tsx
poduck b384d9912a Add TenantCustomTier system and fix BusinessEditModal feature loading
Backend:
- Add TenantCustomTier model for per-tenant feature overrides
- Update EntitlementService to check custom tier before plan features
- Add custom_tier action on TenantViewSet (GET/PUT/DELETE)
- Add Celery task for grace period management (30-day expiry)

Frontend:
- Add DynamicFeaturesEditor component for dynamic feature management
- Fix BusinessEditModal to load features from plan defaults when no custom tier
- Update limits (max_users, max_resources, etc.) to use featureValues
- Remove outdated canonical feature check from FeaturePicker (removes warning icons)
- Add useBillingPlans hook for accessing billing system data
- Add custom tier API functions to platform.ts

Features now follow consistent rules:
- Load from plan defaults when no custom tier exists
- Load from custom tier when one exists
- Reset to plan defaults when plan changes
- Save to custom tier on edit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:00:54 -05:00

35 lines
1.0 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { render, screen } from '@testing-library/react';
import { UnfinishedBadge } from '../UnfinishedBadge';
describe('UnfinishedBadge', () => {
it('renders WIP text', () => {
render(<UnfinishedBadge />);
expect(screen.getByText('WIP')).toBeInTheDocument();
});
it('renders as a badge', () => {
render(<UnfinishedBadge />);
const badge = screen.getByText('WIP').closest('span');
expect(badge).toBeInTheDocument();
});
it('uses warning variant', () => {
render(<UnfinishedBadge />);
const badge = screen.getByText('WIP').closest('span');
expect(badge).toHaveClass('bg-amber-100');
});
it('uses pill style', () => {
render(<UnfinishedBadge />);
const badge = screen.getByText('WIP').closest('span');
expect(badge).toHaveClass('rounded-full');
});
it('uses small size', () => {
render(<UnfinishedBadge />);
const badge = screen.getByText('WIP').closest('span');
expect(badge).toHaveClass('text-xs');
});
});