Refactoring

This commit is contained in:
DahoudG
2025-09-17 17:54:06 +00:00
parent 12d514d866
commit 63fe107f98
165 changed files with 54220 additions and 276 deletions

View File

@@ -0,0 +1,401 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/solidarite/domain/entities/demande_aide.dart';
import 'package:unionflow_mobile_apps/features/solidarite/presentation/widgets/demande_aide_card.dart';
void main() {
group('DemandeAideCard', () {
late DemandeAide testDemande;
setUp(() {
testDemande = DemandeAide(
id: 'demande-123',
numeroReference: 'REF-2024-001',
titre: 'Aide médicale urgente',
description: 'Besoin d\'aide pour frais médicaux d\'urgence suite à un accident',
typeAide: TypeAide.aideFinanciereMedicale,
statut: StatutAide.enAttente,
priorite: PrioriteAide.haute,
estUrgente: true,
montantDemande: 500000.0,
dateCreation: DateTime(2024, 1, 15, 10, 30),
dateModification: DateTime(2024, 1, 15, 14, 45),
organisationId: 'org-1',
demandeurId: 'user-1',
nomDemandeur: 'Marie Kouassi',
emailDemandeur: 'marie@example.com',
telephoneDemandeur: '+225123456789',
beneficiaires: const [
BeneficiaireAide(
prenom: 'Jean',
nom: 'Kouassi',
age: 25,
),
],
evaluations: const [],
commentairesInternes: const [],
historiqueStatuts: const [],
piecesJustificatives: const [],
tags: const ['urgent', 'médical'],
metadonnees: const {},
);
});
Widget createWidgetUnderTest({
DemandeAide? demande,
VoidCallback? onTap,
VoidCallback? onLongPress,
bool isSelected = false,
bool showSelection = false,
}) {
return MaterialApp(
home: Scaffold(
body: DemandeAideCard(
demande: demande ?? testDemande,
onTap: onTap,
onLongPress: onLongPress,
isSelected: isSelected,
showSelection: showSelection,
),
),
);
}
group('affichage des informations de base', () {
testWidgets('affiche le titre de la demande', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('Aide médicale urgente'), findsOneWidget);
});
testWidgets('affiche la description tronquée', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.textContaining('Besoin d\'aide pour frais médicaux'), findsOneWidget);
});
testWidgets('affiche le numéro de référence', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('REF-2024-001'), findsOneWidget);
});
testWidgets('affiche le nom du demandeur', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('Marie Kouassi'), findsOneWidget);
});
testWidgets('affiche le montant demandé formaté', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('500 000 FCFA'), findsOneWidget);
});
testWidgets('affiche la date de création formatée', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('15 jan. 2024'), findsOneWidget);
});
});
group('affichage des badges et indicateurs', () {
testWidgets('affiche le badge urgent pour une demande urgente', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('URGENT'), findsOneWidget);
expect(find.byIcon(Icons.priority_high), findsOneWidget);
});
testWidgets('n\'affiche pas le badge urgent pour une demande normale', (WidgetTester tester) async {
// arrange
final demandeNormale = testDemande.copyWith(estUrgente: false);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeNormale));
// assert
expect(find.text('URGENT'), findsNothing);
expect(find.byIcon(Icons.priority_high), findsNothing);
});
testWidgets('affiche le badge de statut avec la bonne couleur', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('En attente'), findsOneWidget);
// Vérifier la couleur du badge (orange pour "en attente")
final badgeContainer = tester.widget<Container>(
find.ancestor(
of: find.text('En attente'),
matching: find.byType(Container),
).first,
);
expect(badgeContainer.decoration, isA<BoxDecoration>());
});
testWidgets('affiche le badge de priorité', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('Haute'), findsOneWidget);
});
testWidgets('affiche le badge de type d\'aide', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('Aide médicale'), findsOneWidget);
});
});
group('affichage des informations supplémentaires', () {
testWidgets('affiche le nombre de bénéficiaires', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('1 bénéficiaire'), findsOneWidget);
expect(find.byIcon(Icons.people), findsOneWidget);
});
testWidgets('affiche le pluriel pour plusieurs bénéficiaires', (WidgetTester tester) async {
// arrange
final demandeAvecPlusieurs = testDemande.copyWith(
beneficiaires: const [
BeneficiaireAide(prenom: 'Jean', nom: 'Kouassi', age: 25),
BeneficiaireAide(prenom: 'Marie', nom: 'Kouassi', age: 23),
],
);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeAvecPlusieurs));
// assert
expect(find.text('2 bénéficiaires'), findsOneWidget);
});
testWidgets('affiche les tags', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.text('urgent'), findsOneWidget);
expect(find.text('médical'), findsOneWidget);
});
testWidgets('affiche l\'indicateur de progression', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.byType(LinearProgressIndicator), findsOneWidget);
});
});
group('interactions utilisateur', () {
testWidgets('appelle onTap quand la carte est tapée', (WidgetTester tester) async {
// arrange
bool tapCalled = false;
void onTap() => tapCalled = true;
await tester.pumpWidget(createWidgetUnderTest(onTap: onTap));
// act
await tester.tap(find.byType(DemandeAideCard));
await tester.pumpAndSettle();
// assert
expect(tapCalled, true);
});
testWidgets('appelle onLongPress quand la carte est pressée longuement', (WidgetTester tester) async {
// arrange
bool longPressCalled = false;
void onLongPress() => longPressCalled = true;
await tester.pumpWidget(createWidgetUnderTest(onLongPress: onLongPress));
// act
await tester.longPress(find.byType(DemandeAideCard));
await tester.pumpAndSettle();
// assert
expect(longPressCalled, true);
});
testWidgets('affiche l\'état sélectionné quand isSelected=true', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest(
isSelected: true,
showSelection: true,
));
// assert
expect(find.byIcon(Icons.check_circle), findsOneWidget);
// Vérifier que la carte a une bordure différente quand sélectionnée
final card = tester.widget<Card>(find.byType(Card));
expect(card.elevation, greaterThan(1.0));
});
testWidgets('affiche l\'état non sélectionné quand isSelected=false', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest(
isSelected: false,
showSelection: true,
));
// assert
expect(find.byIcon(Icons.radio_button_unchecked), findsOneWidget);
});
testWidgets('n\'affiche pas les indicateurs de sélection quand showSelection=false', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest(
isSelected: true,
showSelection: false,
));
// assert
expect(find.byIcon(Icons.check_circle), findsNothing);
expect(find.byIcon(Icons.radio_button_unchecked), findsNothing);
});
});
group('gestion des cas limites', () {
testWidgets('gère une demande sans montant', (WidgetTester tester) async {
// arrange
final demandeSansMontant = testDemande.copyWith(montantDemande: null);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeSansMontant));
// assert
expect(find.text('Montant non spécifié'), findsOneWidget);
});
testWidgets('gère une demande sans bénéficiaires', (WidgetTester tester) async {
// arrange
final demandeSansBeneficiaires = testDemande.copyWith(beneficiaires: const []);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeSansBeneficiaires));
// assert
expect(find.text('Aucun bénéficiaire'), findsOneWidget);
});
testWidgets('gère une demande sans tags', (WidgetTester tester) async {
// arrange
final demandeSansTags = testDemande.copyWith(tags: const []);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeSansTags));
// assert
// Les tags ne devraient pas être affichés
expect(find.text('urgent'), findsNothing);
expect(find.text('médical'), findsNothing);
});
testWidgets('gère une description très longue', (WidgetTester tester) async {
// arrange
final descriptionLongue = 'Ceci est une description très longue qui devrait être tronquée ' * 10;
final demandeDescriptionLongue = testDemande.copyWith(description: descriptionLongue);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeDescriptionLongue));
// assert
// Vérifier que la description est tronquée (contient "...")
final descriptionWidget = find.byType(Text).evaluate()
.where((element) => (element.widget as Text).data?.contains('...') == true)
.isNotEmpty;
expect(descriptionWidget, true);
});
testWidgets('gère un titre très long', (WidgetTester tester) async {
// arrange
final titreLong = 'Ceci est un titre très long qui devrait être géré correctement ' * 5;
final demandeTitreLong = testDemande.copyWith(titre: titreLong);
// act
await tester.pumpWidget(createWidgetUnderTest(demande: demandeTitreLong));
// assert
// Le widget ne devrait pas déborder
expect(tester.takeException(), isNull);
});
});
group('accessibilité', () {
testWidgets('a des labels d\'accessibilité appropriés', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
expect(find.bySemanticsLabel('Demande d\'aide: Aide médicale urgente'), findsOneWidget);
});
testWidgets('supporte la navigation au clavier', (WidgetTester tester) async {
// arrange & act
await tester.pumpWidget(createWidgetUnderTest());
// assert
final inkWell = find.byType(InkWell);
expect(inkWell, findsOneWidget);
final inkWellWidget = tester.widget<InkWell>(inkWell);
expect(inkWellWidget.focusNode, isNotNull);
});
});
group('performance', () {
testWidgets('se construit rapidement avec de nombreuses demandes', (WidgetTester tester) async {
// arrange
final stopwatch = Stopwatch()..start();
// act
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: ListView.builder(
itemCount: 100,
itemBuilder: (context, index) => DemandeAideCard(
demande: testDemande.copyWith(
id: 'demande-$index',
titre: 'Demande $index',
),
),
),
),
));
stopwatch.stop();
// assert
expect(stopwatch.elapsedMilliseconds, lessThan(1000)); // Moins d'1 seconde
});
});
});
}