feat(subscription): implement resource quota management based on subscription plans
This commit is contained in:
@@ -14,6 +14,7 @@ vi.mock('../hooks/usePermissions', () => ({
|
||||
}));
|
||||
|
||||
import { api } from '../lib/api';
|
||||
import { useAuthStore } from '../stores/authStore';
|
||||
import ResourcesPage from './ResourcesPage';
|
||||
|
||||
const get = api.get as ReturnType<typeof vi.fn>;
|
||||
@@ -126,4 +127,61 @@ describe('ResourcesPage', () => {
|
||||
expect(screen.queryByRole('button', { name: gone })).not.toBeInTheDocument();
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* سقف منابع از پلن اشتراک میآید. رسیدن به سقف باید همانجا گفته شود، نه با ۴۲۲
|
||||
* بعد از پر کردن فرم.
|
||||
*/
|
||||
describe('سقف منابع پلن', () => {
|
||||
function mockWithPlan(maxResources: number, resources: unknown[]) {
|
||||
// اشتراک فقط برای نقشهای صاحب محیط خوانده میشود.
|
||||
useAuthStore.setState({ primaryRole: 'clinic' });
|
||||
|
||||
get.mockImplementation((path: string) => {
|
||||
if (path.startsWith('/api/v1/subscription/my')) {
|
||||
return Promise.resolve({
|
||||
success: true,
|
||||
data: {
|
||||
subscription: null,
|
||||
used_trial: false,
|
||||
effective_plan: { name: 'free', level: 0, max_secretaries: 1, max_resources: maxResources, features: {} },
|
||||
},
|
||||
});
|
||||
}
|
||||
if (path.startsWith('/api/v1/resource-types')) return Promise.resolve({ success: true, data: [laserType] });
|
||||
if (path.startsWith('/api/v1/skills')) return Promise.resolve({ success: true, data: [skill] });
|
||||
if (path.startsWith('/api/v1/resources')) return Promise.resolve({ success: true, data: resources });
|
||||
return Promise.resolve({ success: true, data: [] });
|
||||
});
|
||||
}
|
||||
|
||||
it('در سقف، دکمهٔ افزودن جای خود را به ارتقای پنل میدهد', async () => {
|
||||
mockWithPlan(1, [resource]);
|
||||
renderWithProviders(<ResourcesPage />, { route: '/admin/resources' });
|
||||
|
||||
await waitFor(() =>
|
||||
expect(screen.getByRole('link', { name: 'ارتقای پنل' })).toHaveAttribute('href', '/admin/subscription'),
|
||||
);
|
||||
expect(screen.queryByText('افزودن منبع')).not.toBeInTheDocument();
|
||||
expect(screen.getByText('۱ از ۱ منبع پلن فعلی')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('زیر سقف، دکمهٔ افزودن و شمارندهٔ مصرف را نشان میدهد', async () => {
|
||||
mockWithPlan(3, [resource]);
|
||||
renderWithProviders(<ResourcesPage />, { route: '/admin/resources' });
|
||||
|
||||
await waitFor(() => expect(screen.getByText('۱ از ۳ منبع پلن فعلی')).toBeInTheDocument());
|
||||
expect(screen.getByText('افزودن منبع')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('پلن نامحدود نه شمارنده دارد نه سقف', async () => {
|
||||
mockWithPlan(-1, [resource, { ...resource, uuid: 'r2', name: 'لیزر ۲' }]);
|
||||
renderWithProviders(<ResourcesPage />, { route: '/admin/resources' });
|
||||
|
||||
// تا فهرست و پلن هر دو ننشستهاند، «نبودِ» شمارنده چیزی ثابت نمیکند.
|
||||
await waitFor(() => expect(screen.getByText('لیزر ۲')).toBeInTheDocument());
|
||||
expect(screen.getByText('افزودن منبع')).toBeInTheDocument();
|
||||
expect(screen.queryByText(/منبع پلن فعلی/)).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user