mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-04-03 16:51:26 +00:00
test(frontend): ajout tests unitaires Jest composants frais [#NEWTS-9]
This commit is contained in:
149
Front-End/src/test/FeeTypeSection.test.js
Normal file
149
Front-End/src/test/FeeTypeSection.test.js
Normal file
@ -0,0 +1,149 @@
|
||||
import React from 'react';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import FeeTypeSection from '@/components/Structure/Tarification/FeeTypeSection';
|
||||
|
||||
// Mock du contexte établissement
|
||||
jest.mock('@/context/EstablishmentContext', () => ({
|
||||
useEstablishment: () => ({ selectedEstablishmentId: 1 }),
|
||||
}));
|
||||
|
||||
// Mock des sous-composants pour isoler FeeTypeSection
|
||||
jest.mock(
|
||||
'@/components/Structure/Tarification/FeesSection',
|
||||
() =>
|
||||
function MockFeesSection({ type }) {
|
||||
return (
|
||||
<div data-testid={`fees-section-type-${type}`}>
|
||||
FeesSection type={type}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock(
|
||||
'@/components/Structure/Tarification/DiscountsSection',
|
||||
() =>
|
||||
function MockDiscountsSection({ type }) {
|
||||
return (
|
||||
<div data-testid={`discounts-section-type-${type}`}>
|
||||
DiscountsSection type={type}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock(
|
||||
'@/components/PaymentPlanSelector',
|
||||
() =>
|
||||
function MockPaymentPlanSelector({ type }) {
|
||||
return (
|
||||
<div data-testid={`payment-plan-type-${type}`}>
|
||||
PaymentPlanSelector type={type}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock(
|
||||
'@/components/PaymentModeSelector',
|
||||
() =>
|
||||
function MockPaymentModeSelector({ type }) {
|
||||
return (
|
||||
<div data-testid={`payment-mode-type-${type}`}>
|
||||
PaymentModeSelector type={type}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock('@/utils/Url', () => ({
|
||||
BE_SCHOOL_FEES_URL: '/api/fees',
|
||||
BE_SCHOOL_DISCOUNTS_URL: '/api/discounts',
|
||||
BE_SCHOOL_PAYMENT_PLANS_URL: '/api/payment-plans',
|
||||
BE_SCHOOL_PAYMENT_MODES_URL: '/api/payment-modes',
|
||||
}));
|
||||
|
||||
const defaultProps = {
|
||||
title: "Frais d'inscription",
|
||||
fees: [],
|
||||
setFees: jest.fn(),
|
||||
discounts: [],
|
||||
setDiscounts: jest.fn(),
|
||||
paymentPlans: [],
|
||||
setPaymentPlans: jest.fn(),
|
||||
paymentModes: [],
|
||||
setPaymentModes: jest.fn(),
|
||||
type: 0,
|
||||
handleCreate: jest.fn(),
|
||||
handleEdit: jest.fn(),
|
||||
handleDelete: jest.fn(),
|
||||
onDiscountDelete: jest.fn(),
|
||||
};
|
||||
|
||||
describe('FeeTypeSection - type inscription (type=0)', () => {
|
||||
it('affiche le titre passé en props', () => {
|
||||
render(<FeeTypeSection {...defaultProps} />);
|
||||
expect(screen.getByText("Frais d'inscription")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('rend le composant FeesSection avec le bon type', () => {
|
||||
render(<FeeTypeSection {...defaultProps} />);
|
||||
expect(screen.getByTestId('fees-section-type-0')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('rend le composant DiscountsSection avec le bon type', () => {
|
||||
render(<FeeTypeSection {...defaultProps} />);
|
||||
expect(screen.getByTestId('discounts-section-type-0')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('rend le composant PaymentPlanSelector avec le bon type', () => {
|
||||
render(<FeeTypeSection {...defaultProps} />);
|
||||
expect(screen.getByTestId('payment-plan-type-0')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('rend le composant PaymentModeSelector avec le bon type', () => {
|
||||
render(<FeeTypeSection {...defaultProps} />);
|
||||
expect(screen.getByTestId('payment-mode-type-0')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
describe('FeeTypeSection - type scolarité (type=1)', () => {
|
||||
const tuitionProps = {
|
||||
...defaultProps,
|
||||
title: 'Frais de scolarité',
|
||||
type: 1,
|
||||
};
|
||||
|
||||
it('affiche le titre "Frais de scolarité"', () => {
|
||||
render(<FeeTypeSection {...tuitionProps} />);
|
||||
expect(screen.getByText('Frais de scolarité')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('rend tous les sous-composants avec type=1', () => {
|
||||
render(<FeeTypeSection {...tuitionProps} />);
|
||||
expect(screen.getByTestId('fees-section-type-1')).toBeInTheDocument();
|
||||
expect(screen.getByTestId('discounts-section-type-1')).toBeInTheDocument();
|
||||
expect(screen.getByTestId('payment-plan-type-1')).toBeInTheDocument();
|
||||
expect(screen.getByTestId('payment-mode-type-1')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
describe('FeeTypeSection - transmission des handlers', () => {
|
||||
it('passe les fonctions handleCreate, handleEdit, handleDelete aux sous-composants', () => {
|
||||
const handleCreate = jest.fn();
|
||||
const handleEdit = jest.fn();
|
||||
const handleDelete = jest.fn();
|
||||
|
||||
// On vérifie que le composant se rend sans erreur avec les handlers
|
||||
expect(() =>
|
||||
render(
|
||||
<FeeTypeSection
|
||||
{...defaultProps}
|
||||
handleCreate={handleCreate}
|
||||
handleEdit={handleEdit}
|
||||
handleDelete={handleDelete}
|
||||
/>
|
||||
)
|
||||
).not.toThrow();
|
||||
});
|
||||
});
|
||||
145
Front-End/src/test/FeesManagement.test.js
Normal file
145
Front-End/src/test/FeesManagement.test.js
Normal file
@ -0,0 +1,145 @@
|
||||
import React from 'react';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import FeesManagement from '@/components/Structure/Tarification/FeesManagement';
|
||||
|
||||
jest.mock('@/context/EstablishmentContext', () => ({
|
||||
useEstablishment: () => ({ selectedEstablishmentId: 1 }),
|
||||
}));
|
||||
|
||||
jest.mock('@/utils/Url', () => ({
|
||||
BE_SCHOOL_FEES_URL: '/api/fees',
|
||||
BE_SCHOOL_DISCOUNTS_URL: '/api/discounts',
|
||||
BE_SCHOOL_PAYMENT_PLANS_URL: '/api/payment-plans',
|
||||
BE_SCHOOL_PAYMENT_MODES_URL: '/api/payment-modes',
|
||||
}));
|
||||
|
||||
jest.mock('@/utils/logger', () => ({ error: jest.fn() }));
|
||||
|
||||
jest.mock(
|
||||
'@/components/Structure/Tarification/FeesSection',
|
||||
() =>
|
||||
function MockFeesSection({ fees, unified }) {
|
||||
return (
|
||||
<div
|
||||
data-testid="fees-section"
|
||||
data-unified={unified ? 'true' : 'false'}
|
||||
>
|
||||
{fees.map((f) => (
|
||||
<span key={f.id}>{f.name}</span>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock(
|
||||
'@/components/Structure/Tarification/DiscountsSection',
|
||||
() =>
|
||||
function MockDiscountsSection({ discounts, unified }) {
|
||||
return (
|
||||
<div
|
||||
data-testid="discounts-section"
|
||||
data-unified={unified ? 'true' : 'false'}
|
||||
>
|
||||
{discounts.map((d) => (
|
||||
<span key={d.id}>{d.name}</span>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock(
|
||||
'@/components/PaymentPlanSelector',
|
||||
() =>
|
||||
function MockPaymentPlanSelector({ allPaymentPlans }) {
|
||||
return (
|
||||
<div data-testid="payment-plan-selector">
|
||||
{(allPaymentPlans ?? []).length} plans
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
jest.mock(
|
||||
'@/components/PaymentModeSelector',
|
||||
() =>
|
||||
function MockPaymentModeSelector({ allPaymentModes }) {
|
||||
return (
|
||||
<div data-testid="payment-mode-selector">
|
||||
{(allPaymentModes ?? []).length} modes
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
const defaultProps = {
|
||||
registrationFees: [],
|
||||
setRegistrationFees: jest.fn(),
|
||||
tuitionFees: [],
|
||||
setTuitionFees: jest.fn(),
|
||||
registrationDiscounts: [],
|
||||
setRegistrationDiscounts: jest.fn(),
|
||||
tuitionDiscounts: [],
|
||||
setTuitionDiscounts: jest.fn(),
|
||||
registrationPaymentPlans: [],
|
||||
setRegistrationPaymentPlans: jest.fn(),
|
||||
tuitionPaymentPlans: [],
|
||||
setTuitionPaymentPlans: jest.fn(),
|
||||
registrationPaymentModes: [],
|
||||
setRegistrationPaymentModes: jest.fn(),
|
||||
tuitionPaymentModes: [],
|
||||
setTuitionPaymentModes: jest.fn(),
|
||||
handleCreate: jest.fn(),
|
||||
handleEdit: jest.fn(),
|
||||
handleDelete: jest.fn(),
|
||||
};
|
||||
|
||||
describe('FeesManagement - vue unifiée', () => {
|
||||
it('affiche la section des frais en mode unifié', () => {
|
||||
render(<FeesManagement {...defaultProps} />);
|
||||
const section = screen.getByTestId('fees-section');
|
||||
expect(section).toBeInTheDocument();
|
||||
expect(section).toHaveAttribute('data-unified', 'true');
|
||||
});
|
||||
|
||||
it('affiche la section des réductions en mode unifié', () => {
|
||||
render(<FeesManagement {...defaultProps} />);
|
||||
const section = screen.getByTestId('discounts-section');
|
||||
expect(section).toBeInTheDocument();
|
||||
expect(section).toHaveAttribute('data-unified', 'true');
|
||||
});
|
||||
|
||||
it('affiche le sélecteur de plans de paiement', () => {
|
||||
render(<FeesManagement {...defaultProps} />);
|
||||
expect(screen.getByTestId('payment-plan-selector')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('affiche le sélecteur de modes de paiement', () => {
|
||||
render(<FeesManagement {...defaultProps} />);
|
||||
expect(screen.getByTestId('payment-mode-selector')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('fusionne les frais inscription et scolarité en une seule liste', () => {
|
||||
render(
|
||||
<FeesManagement
|
||||
{...defaultProps}
|
||||
registrationFees={[{ id: 1, name: 'Inscription A', type: 0 }]}
|
||||
tuitionFees={[{ id: 2, name: 'Scolarité B', type: 1 }]}
|
||||
/>
|
||||
);
|
||||
expect(screen.getByText('Inscription A')).toBeInTheDocument();
|
||||
expect(screen.getByText('Scolarité B')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('fusionne les plans de paiement inscription et scolarité', () => {
|
||||
render(
|
||||
<FeesManagement
|
||||
{...defaultProps}
|
||||
registrationPaymentPlans={[{ id: 10, plan_type: 1, type: 0 }]}
|
||||
tuitionPaymentPlans={[{ id: 11, plan_type: 1, type: 1 }]}
|
||||
/>
|
||||
);
|
||||
expect(screen.getByText('2 plans')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user