166 lines
5.1 KiB
Dart
166 lines
5.1 KiB
Dart
/// 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,
|
|
);
|
|
});
|
|
});
|
|
}
|