Initial commit: unionflow-mobile-apps
Application Flutter complète (sans build artifacts). Signed-off-by: lions dev Team
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
/// Tests unitaires pour PayContribution use case
|
||||
library pay_contribution_test;
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/repositories/contribution_repository.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/pay_contribution.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/data/models/contribution_model.dart';
|
||||
|
||||
@GenerateMocks([IContributionRepository])
|
||||
import 'pay_contribution_test.mocks.dart';
|
||||
|
||||
void main() {
|
||||
late PayContribution useCase;
|
||||
late MockIContributionRepository mockRepository;
|
||||
|
||||
setUp(() {
|
||||
mockRepository = MockIContributionRepository();
|
||||
useCase = PayContribution(mockRepository);
|
||||
});
|
||||
|
||||
group('PayContribution Use Case', () {
|
||||
const tContributionId = 'cont123';
|
||||
const tMontant = 5000.0;
|
||||
final tDatePaiement = DateTime(2024, 11, 15);
|
||||
const tMethode = 'WAVE_MONEY';
|
||||
const tNumero = 'WAVE123456';
|
||||
|
||||
final tPaidContribution = ContributionModel(
|
||||
id: tContributionId,
|
||||
membreId: 'membre1',
|
||||
montant: 5000.0,
|
||||
montantPaye: 5000.0,
|
||||
dateEcheance: DateTime(2024, 12, 31),
|
||||
datePaiement: tDatePaiement,
|
||||
annee: 2024,
|
||||
type: ContributionType.annuelle,
|
||||
statut: ContributionStatus.payee,
|
||||
methodePaiement: PaymentMethod.waveMoney,
|
||||
numeroPaiement: tNumero,
|
||||
);
|
||||
|
||||
test('should record payment successfully', () async {
|
||||
// Arrange
|
||||
when(mockRepository.enregistrerPaiement(
|
||||
tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
numeroPaiement: tNumero,
|
||||
referencePaiement: anyNamed('referencePaiement'),
|
||||
)).thenAnswer((_) async => tPaidContribution);
|
||||
|
||||
// Act
|
||||
final result = await useCase(
|
||||
cotisationId: tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
numeroPaiement: tNumero,
|
||||
);
|
||||
|
||||
// Assert
|
||||
expect(result, equals(tPaidContribution));
|
||||
expect(result.statut, equals(ContributionStatus.payee));
|
||||
expect(result.montantPaye, equals(5000.0));
|
||||
expect(result.datePaiement, equals(tDatePaiement));
|
||||
verify(mockRepository.enregistrerPaiement(
|
||||
tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
numeroPaiement: tNumero,
|
||||
referencePaiement: null,
|
||||
));
|
||||
verifyNoMoreInteractions(mockRepository);
|
||||
});
|
||||
|
||||
test('should record partial payment', () async {
|
||||
// Arrange
|
||||
const partialMontant = 2500.0;
|
||||
final partialPaid = ContributionModel(
|
||||
id: tContributionId,
|
||||
membreId: 'membre1',
|
||||
montant: 5000.0,
|
||||
montantPaye: 2500.0,
|
||||
dateEcheance: DateTime(2024, 12, 31),
|
||||
datePaiement: tDatePaiement,
|
||||
annee: 2024,
|
||||
type: ContributionType.annuelle,
|
||||
statut: ContributionStatus.partielle,
|
||||
methodePaiement: PaymentMethod.especes,
|
||||
);
|
||||
when(mockRepository.enregistrerPaiement(
|
||||
tContributionId,
|
||||
montant: partialMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: 'ESPECES',
|
||||
numeroPaiement: null,
|
||||
referencePaiement: null,
|
||||
)).thenAnswer((_) async => partialPaid);
|
||||
|
||||
// Act
|
||||
final result = await useCase(
|
||||
cotisationId: tContributionId,
|
||||
montant: partialMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: 'ESPECES',
|
||||
);
|
||||
|
||||
// Assert
|
||||
expect(result.statut, equals(ContributionStatus.partielle));
|
||||
expect(result.montantPaye, equals(2500.0));
|
||||
});
|
||||
|
||||
test('should record payment with reference', () async {
|
||||
// Arrange
|
||||
const reference = 'REF-2024-001';
|
||||
when(mockRepository.enregistrerPaiement(
|
||||
tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
numeroPaiement: null,
|
||||
referencePaiement: reference,
|
||||
)).thenAnswer((_) async => tPaidContribution.copyWith(referencePaiement: reference));
|
||||
|
||||
// Act
|
||||
final result = await useCase(
|
||||
cotisationId: tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
referencePaiement: reference,
|
||||
);
|
||||
|
||||
// Assert
|
||||
expect(result.referencePaiement, equals(reference));
|
||||
});
|
||||
|
||||
test('should throw exception when payment fails', () async {
|
||||
// Arrange
|
||||
when(mockRepository.enregistrerPaiement(
|
||||
tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
numeroPaiement: null,
|
||||
referencePaiement: null,
|
||||
)).thenThrow(Exception('Erreur lors de l\'enregistrement du paiement'));
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => useCase(
|
||||
cotisationId: tContributionId,
|
||||
montant: tMontant,
|
||||
datePaiement: tDatePaiement,
|
||||
methodePaiement: tMethode,
|
||||
),
|
||||
throwsException,
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user