Initial commit: unionflow-mobile-apps

Application Flutter complète (sans build artifacts).

Signed-off-by: lions dev Team
This commit is contained in:
dahoud
2026-03-15 16:30:08 +00:00
commit d094d6db9c
1790 changed files with 507435 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
/// Tests unitaires pour CancelRegistration use case
library cancel_registration_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/cancel_registration.dart';
@GenerateMocks([IEvenementRepository])
import 'cancel_registration_test.mocks.dart';
void main() {
late CancelRegistration useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = CancelRegistration(mockRepository);
});
group('CancelRegistration Use Case', () {
const tEventId = 'event123';
test('should cancel registration successfully', () async {
// Arrange
when(mockRepository.desinscrireEvenement(tEventId))
.thenAnswer((_) async => Future.value());
// Act
await useCase(tEventId);
// Assert
verify(mockRepository.desinscrireEvenement(tEventId));
verifyNoMoreInteractions(mockRepository);
});
test('should throw exception when event not found', () async {
// Arrange
when(mockRepository.desinscrireEvenement(any))
.thenThrow(Exception('Événement non trouvé'));
// Act & Assert
expect(() => useCase('nonexistent'), throwsA(isA<Exception>()));
});
test('should throw exception when not registered', () async {
// Arrange
when(mockRepository.desinscrireEvenement(any))
.thenThrow(Exception('Vous n\'êtes pas inscrit à cet événement'));
// Act & Assert
expect(() => useCase(tEventId), throwsA(isA<Exception>()));
});
test('should throw exception when cancellation fails', () async {
// Arrange
when(mockRepository.desinscrireEvenement(any))
.thenThrow(Exception('Erreur de désinscription'));
// Act & Assert
expect(() => useCase(tEventId), throwsException);
});
});
}

View File

@@ -0,0 +1,289 @@
// Mocks generated by Mockito 5.4.4 from annotations
// in unionflow_mobile_apps/test/features/events/domain/usecases/cancel_registration_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i5;
import 'package:mockito/mockito.dart' as _i1;
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart'
as _i3;
import 'package:unionflow_mobile_apps/features/events/data/repositories/evenement_repository_impl.dart'
as _i2;
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart'
as _i4;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
class _FakeEvenementSearchResult_0 extends _i1.SmartFake
implements _i2.EvenementSearchResult {
_FakeEvenementSearchResult_0(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
class _FakeEvenementModel_1 extends _i1.SmartFake
implements _i3.EvenementModel {
_FakeEvenementModel_1(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
/// A class which mocks [IEvenementRepository].
///
/// See the documentation for Mockito's code generation for more information.
class MockIEvenementRepository extends _i1.Mock
implements _i4.IEvenementRepository {
MockIEvenementRepository() {
_i1.throwOnMissingStub(this);
}
@override
_i5.Future<_i2.EvenementSearchResult> getEvenements({
int? page = 0,
int? size = 20,
String? recherche,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenements,
[],
{
#page: page,
#size: size,
#recherche: recherche,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenements,
[],
{
#page: page,
#size: size,
#recherche: recherche,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i3.EvenementModel?> getEvenementById(String? id) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementById,
[id],
),
returnValue: _i5.Future<_i3.EvenementModel?>.value(),
) as _i5.Future<_i3.EvenementModel?>);
@override
_i5.Future<_i3.EvenementModel> createEvenement(
_i3.EvenementModel? evenement) =>
(super.noSuchMethod(
Invocation.method(
#createEvenement,
[evenement],
),
returnValue: _i5.Future<_i3.EvenementModel>.value(_FakeEvenementModel_1(
this,
Invocation.method(
#createEvenement,
[evenement],
),
)),
) as _i5.Future<_i3.EvenementModel>);
@override
_i5.Future<_i3.EvenementModel> updateEvenement(
String? id,
_i3.EvenementModel? evenement,
) =>
(super.noSuchMethod(
Invocation.method(
#updateEvenement,
[
id,
evenement,
],
),
returnValue: _i5.Future<_i3.EvenementModel>.value(_FakeEvenementModel_1(
this,
Invocation.method(
#updateEvenement,
[
id,
evenement,
],
),
)),
) as _i5.Future<_i3.EvenementModel>);
@override
_i5.Future<void> deleteEvenement(String? id) => (super.noSuchMethod(
Invocation.method(
#deleteEvenement,
[id],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsAVenir({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsAVenir,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsAVenir,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsEnCours({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsEnCours,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsEnCours,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsPasses({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsPasses,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsPasses,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<void> inscrireEvenement(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#inscrireEvenement,
[evenementId],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> desinscrireEvenement(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#desinscrireEvenement,
[evenementId],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<bool> getInscriptionStatus(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#getInscriptionStatus,
[evenementId],
),
returnValue: _i5.Future<bool>.value(false),
) as _i5.Future<bool>);
@override
_i5.Future<List<Map<String, dynamic>>> getParticipants(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#getParticipants,
[evenementId],
),
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
<Map<String, dynamic>>[]),
) as _i5.Future<List<Map<String, dynamic>>>);
@override
_i5.Future<Map<String, dynamic>> getEvenementsStats() => (super.noSuchMethod(
Invocation.method(
#getEvenementsStats,
[],
),
returnValue:
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
) as _i5.Future<Map<String, dynamic>>);
}

View File

@@ -0,0 +1,118 @@
/// Tests unitaires pour CreateEvent use case
library create_event_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/create_event.dart';
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart';
@GenerateMocks([IEvenementRepository])
import 'create_event_test.mocks.dart';
void main() {
late CreateEvent useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = CreateEvent(mockRepository);
});
group('CreateEvent Use Case', () {
final tNewEvent = EvenementModel(
titre: 'Nouvelle Réunion',
description: 'Réunion mensuelle du comité',
dateDebut: DateTime(2025, 1, 15, 10, 0),
dateFin: DateTime(2025, 1, 15, 12, 0),
lieu: 'Salle de réunion',
type: TypeEvenement.reunion,
statut: StatutEvenement.planifie,
);
final tCreatedEvent = EvenementModel(
id: 456,
titre: 'Nouvelle Réunion',
description: 'Réunion mensuelle du comité',
dateDebut: DateTime(2025, 1, 15, 10, 0),
dateFin: DateTime(2025, 1, 15, 12, 0),
lieu: 'Salle de réunion',
type: TypeEvenement.reunion,
statut: StatutEvenement.planifie,
);
test('should create event successfully', () async {
// Arrange
when(mockRepository.createEvenement(tNewEvent))
.thenAnswer((_) async => tCreatedEvent);
// Act
final result = await useCase(tNewEvent);
// Assert
expect(result, equals(tCreatedEvent));
expect(result.id, isNotNull);
expect(result.id, equals(456));
expect(result.titre, equals('Nouvelle Réunion'));
verify(mockRepository.createEvenement(tNewEvent));
verifyNoMoreInteractions(mockRepository);
});
test('should create public event with registration', () async {
// Arrange
final publicEvent = EvenementModel(
titre: 'Conférence Publique',
dateDebut: DateTime(2025, 2, 1, 14, 0),
dateFin: DateTime(2025, 2, 1, 17, 0),
type: TypeEvenement.conference,
statut: StatutEvenement.planifie,
estPublic: true,
inscriptionRequise: true,
maxParticipants: 200,
);
final createdPublic = publicEvent.copyWith(id: 789);
when(mockRepository.createEvenement(publicEvent))
.thenAnswer((_) async => createdPublic);
// Act
final result = await useCase(publicEvent);
// Assert
expect(result.estPublic, isTrue);
expect(result.inscriptionRequise, isTrue);
expect(result.maxParticipants, equals(200));
});
test('should create event with cost', () async {
// Arrange
final paidEvent = EvenementModel(
titre: 'Séminaire Payant',
dateDebut: DateTime(2025, 3, 1, 9, 0),
dateFin: DateTime(2025, 3, 1, 18, 0),
type: TypeEvenement.seminaire,
statut: StatutEvenement.planifie,
cout: 50000.0,
devise: 'XOF',
);
when(mockRepository.createEvenement(any))
.thenAnswer((_) async => paidEvent.copyWith(id: 999));
// Act
final result = await useCase(paidEvent);
// Assert
expect(result.cout, equals(50000.0));
expect(result.devise, equals('XOF'));
});
test('should throw exception when creation fails', () async {
// Arrange
when(mockRepository.createEvenement(any))
.thenThrow(Exception('Validation error'));
// Act & Assert
expect(() => useCase(tNewEvent), throwsException);
});
});
}

View File

@@ -0,0 +1,66 @@
/// Tests unitaires pour DeleteEvent use case
library delete_event_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/delete_event.dart';
@GenerateMocks([IEvenementRepository])
import 'delete_event_test.mocks.dart';
void main() {
late DeleteEvent useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = DeleteEvent(mockRepository);
});
group('DeleteEvent Use Case', () {
const tEventId = 'event123';
test('should delete event successfully', () async {
// Arrange
when(mockRepository.deleteEvenement(tEventId))
.thenAnswer((_) async => Future.value());
// Act
await useCase(tEventId);
// Assert
verify(mockRepository.deleteEvenement(tEventId));
verifyNoMoreInteractions(mockRepository);
});
test('should throw exception when event not found', () async {
// Arrange
when(mockRepository.deleteEvenement(any))
.thenThrow(Exception('Événement non trouvé'));
// Act & Assert
expect(() => useCase('nonexistent'), throwsA(isA<Exception>()));
verify(mockRepository.deleteEvenement('nonexistent'));
});
test('should throw exception when event has participants', () async {
// Arrange
when(mockRepository.deleteEvenement(any))
.thenThrow(Exception('Impossible de supprimer un événement avec des participants'));
// Act & Assert
expect(() => useCase(tEventId), throwsA(isA<Exception>()));
});
test('should throw exception when deletion fails', () async {
// Arrange
when(mockRepository.deleteEvenement(any))
.thenThrow(Exception('Erreur de suppression'));
// Act & Assert
expect(() => useCase(tEventId), throwsException);
});
});
}

View File

@@ -0,0 +1,95 @@
/// Tests unitaires pour GetEventById use case
library get_event_by_id_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/get_event_by_id.dart';
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart';
@GenerateMocks([IEvenementRepository])
import 'get_event_by_id_test.mocks.dart';
void main() {
late GetEventById useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = GetEventById(mockRepository);
});
group('GetEventById Use Case', () {
const tEventId = 'event123';
final tEvent = EvenementModel(
id: 123,
titre: 'Assemblée Générale 2024',
description: 'Assemblée générale annuelle de l\'organisation',
dateDebut: DateTime(2024, 12, 15, 14, 0),
dateFin: DateTime(2024, 12, 15, 18, 0),
lieu: 'Salle des Congrès',
adresse: '123 Rue de la République',
ville: 'Dakar',
type: TypeEvenement.assembleeGenerale,
statut: StatutEvenement.confirme,
priorite: PrioriteEvenement.haute,
participantsActuels: 45,
maxParticipants: 100,
estPublic: true,
inscriptionRequise: true,
);
test('should return event by id', () async {
// Arrange
when(mockRepository.getEvenementById(tEventId))
.thenAnswer((_) async => tEvent);
// Act
final result = await useCase(tEventId);
// Assert
expect(result, equals(tEvent));
expect(result?.id, equals(123));
expect(result?.titre, equals('Assemblée Générale 2024'));
verify(mockRepository.getEvenementById(tEventId));
verifyNoMoreInteractions(mockRepository);
});
test('should return event with all details populated', () async {
// Arrange
when(mockRepository.getEvenementById(tEventId))
.thenAnswer((_) async => tEvent);
// Act
final result = await useCase(tEventId);
// Assert
expect(result?.lieu, isNotNull);
expect(result?.adresse, isNotNull);
expect(result?.participantsActuels, equals(45));
expect(result?.maxParticipants, equals(100));
});
test('should return null when event not found', () async {
// Arrange
when(mockRepository.getEvenementById(any))
.thenAnswer((_) async => null);
// Act
final result = await useCase('nonexistent');
// Assert
expect(result, isNull);
});
test('should throw exception when repository fails', () async {
// Arrange
when(mockRepository.getEvenementById(any))
.thenThrow(Exception('Database error'));
// Act & Assert
expect(() => useCase(tEventId), throwsException);
});
});
}

View File

@@ -0,0 +1,102 @@
/// Tests unitaires pour GetEventParticipants use case
library get_event_participants_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/get_event_participants.dart';
@GenerateMocks([IEvenementRepository])
import 'get_event_participants_test.mocks.dart';
void main() {
late GetEventParticipants useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = GetEventParticipants(mockRepository);
});
group('GetEventParticipants Use Case', () {
const tEventId = 'event123';
final tParticipantsList = [
{
'id': 'membre1',
'nom': 'Dupont',
'prenom': 'Jean',
'email': 'jean.dupont@example.com',
'dateInscription': '2024-11-01T10:00:00Z',
'statut': 'CONFIRME',
},
{
'id': 'membre2',
'nom': 'Martin',
'prenom': 'Marie',
'email': 'marie.martin@example.com',
'dateInscription': '2024-11-02T14:00:00Z',
'statut': 'EN_ATTENTE',
},
{
'id': 'membre3',
'nom': 'Diallo',
'prenom': 'Amadou',
'email': 'amadou.diallo@example.com',
'dateInscription': '2024-11-03T09:00:00Z',
'statut': 'CONFIRME',
},
];
test('should return list of event participants', () async {
// Arrange
when(mockRepository.getParticipants(tEventId))
.thenAnswer((_) async => tParticipantsList);
// Act
final result = await useCase(tEventId);
// Assert
expect(result, equals(tParticipantsList));
expect(result.length, equals(3));
expect(result[0]['nom'], equals('Dupont'));
expect(result[0]['statut'], equals('CONFIRME'));
verify(mockRepository.getParticipants(tEventId));
verifyNoMoreInteractions(mockRepository);
});
test('should return participants with different statuses', () async {
// Arrange
when(mockRepository.getParticipants(tEventId))
.thenAnswer((_) async => tParticipantsList);
// Act
final result = await useCase(tEventId);
// Assert
expect(result.where((p) => p['statut'] == 'CONFIRME').length, equals(2));
expect(result.where((p) => p['statut'] == 'EN_ATTENTE').length, equals(1));
});
test('should return empty list when no participants', () async {
// Arrange
when(mockRepository.getParticipants(tEventId))
.thenAnswer((_) async => []);
// Act
final result = await useCase(tEventId);
// Assert
expect(result, isEmpty);
});
test('should throw exception when event not found', () async {
// Arrange
when(mockRepository.getParticipants(any))
.thenThrow(Exception('Événement non trouvé'));
// Act & Assert
expect(() => useCase('nonexistent'), throwsException);
});
});
}

View File

@@ -0,0 +1,138 @@
/// Tests unitaires pour GetEvents use case
library get_events_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/get_events.dart';
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart';
import 'package:unionflow_mobile_apps/features/events/data/repositories/evenement_repository_impl.dart';
@GenerateMocks([IEvenementRepository])
import 'get_events_test.mocks.dart';
void main() {
late GetEvents useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = GetEvents(mockRepository);
});
group('GetEvents Use Case', () {
final tEventsList = [
EvenementModel(
id: 1,
titre: 'Assemblée Générale 2024',
description: 'Assemblée générale annuelle',
dateDebut: DateTime(2024, 12, 15, 14, 0),
dateFin: DateTime(2024, 12, 15, 18, 0),
lieu: 'Salle des Congrès',
type: TypeEvenement.assembleeGenerale,
statut: StatutEvenement.confirme,
priorite: PrioriteEvenement.haute,
participantsActuels: 45,
maxParticipants: 100,
),
EvenementModel(
id: 2,
titre: 'Formation Leadership',
description: 'Formation sur le leadership',
dateDebut: DateTime(2024, 12, 20, 9, 0),
dateFin: DateTime(2024, 12, 20, 17, 0),
lieu: 'Centre de Formation',
type: TypeEvenement.formation,
statut: StatutEvenement.planifie,
participantsActuels: 15,
maxParticipants: 30,
),
];
final tSearchResult = EvenementSearchResult(
evenements: tEventsList,
total: 2,
page: 0,
size: 20,
totalPages: 1,
);
test('should return paginated list of events', () async {
// Arrange
when(mockRepository.getEvenements(
page: anyNamed('page'),
size: anyNamed('size'),
recherche: anyNamed('recherche'),
)).thenAnswer((_) async => tSearchResult);
// Act
final result = await useCase(page: 0, size: 20);
// Assert
expect(result, equals(tSearchResult));
expect(result.evenements.length, equals(2));
expect(result.total, equals(2));
verify(mockRepository.getEvenements(page: 0, size: 20));
verifyNoMoreInteractions(mockRepository);
});
test('should filter events by search query', () async {
// Arrange
final filteredResult = EvenementSearchResult(
evenements: [tEventsList[0]],
total: 1,
page: 0,
size: 20,
totalPages: 1,
);
when(mockRepository.getEvenements(
page: 0,
size: 20,
recherche: 'Assemblée',
)).thenAnswer((_) async => filteredResult);
// Act
final result = await useCase(page: 0, size: 20, recherche: 'Assemblée');
// Assert
expect(result.evenements.length, equals(1));
expect(result.evenements.first.titre, contains('Assemblée'));
});
test('should return empty result when no events exist', () async {
// Arrange
final emptyResult = EvenementSearchResult(
evenements: [],
total: 0,
page: 0,
size: 20,
totalPages: 0,
);
when(mockRepository.getEvenements(
page: anyNamed('page'),
size: anyNamed('size'),
recherche: anyNamed('recherche'),
)).thenAnswer((_) async => emptyResult);
// Act
final result = await useCase(page: 0, size: 20);
// Assert
expect(result.evenements, isEmpty);
expect(result.total, equals(0));
});
test('should throw exception when repository fails', () async {
// Arrange
when(mockRepository.getEvenements(
page: anyNamed('page'),
size: anyNamed('size'),
recherche: anyNamed('recherche'),
)).thenThrow(Exception('Network error'));
// Act & Assert
expect(() => useCase(page: 0, size: 20), throwsException);
});
});
}

View File

@@ -0,0 +1,121 @@
/// Tests unitaires pour GetMyRegistrations use case
library get_my_registrations_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/get_my_registrations.dart';
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart';
import 'package:unionflow_mobile_apps/features/events/data/repositories/evenement_repository_impl.dart';
@GenerateMocks([IEvenementRepository])
import 'get_my_registrations_test.mocks.dart';
void main() {
late GetMyRegistrations useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = GetMyRegistrations(mockRepository);
});
group('GetMyRegistrations Use Case', () {
final tRegisteredEvents = [
EvenementModel(
id: 1,
titre: 'Formation Leadership',
dateDebut: DateTime(2024, 12, 20, 9, 0),
dateFin: DateTime(2024, 12, 20, 17, 0),
type: TypeEvenement.formation,
statut: StatutEvenement.confirme,
inscriptionRequise: true,
participantsActuels: 15,
),
EvenementModel(
id: 2,
titre: 'Séminaire Annuel',
dateDebut: DateTime(2025, 1, 10, 14, 0),
dateFin: DateTime(2025, 1, 10, 18, 0),
type: TypeEvenement.seminaire,
statut: StatutEvenement.planifie,
inscriptionRequise: true,
participantsActuels: 30,
),
];
final tSearchResult = EvenementSearchResult(
evenements: tRegisteredEvents,
total: 2,
page: 0,
size: 20,
totalPages: 1,
);
test('should return list of registered events', () async {
// Arrange
when(mockRepository.getEvenementsAVenir(page: anyNamed('page'), size: anyNamed('size')))
.thenAnswer((_) async => tSearchResult);
// Act
final result = await useCase(page: 0, size: 20);
// Assert
expect(result, equals(tSearchResult));
expect(result.evenements.length, equals(2));
expect(result.total, equals(2));
verify(mockRepository.getEvenementsAVenir(page: 0, size: 20));
verifyNoMoreInteractions(mockRepository);
});
test('should return events with custom page size', () async {
// Arrange
final smallResult = EvenementSearchResult(
evenements: [tRegisteredEvents[0]],
total: 2,
page: 0,
size: 1,
totalPages: 2,
);
when(mockRepository.getEvenementsAVenir(page: 0, size: 1))
.thenAnswer((_) async => smallResult);
// Act
final result = await useCase(page: 0, size: 1);
// Assert
expect(result.evenements.length, equals(1));
expect(result.size, equals(1));
});
test('should return empty result when no registrations', () async {
// Arrange
final emptyResult = EvenementSearchResult(
evenements: [],
total: 0,
page: 0,
size: 20,
totalPages: 0,
);
when(mockRepository.getEvenementsAVenir(page: anyNamed('page'), size: anyNamed('size')))
.thenAnswer((_) async => emptyResult);
// Act
final result = await useCase(page: 0, size: 20);
// Assert
expect(result.evenements, isEmpty);
expect(result.total, equals(0));
});
test('should throw exception when repository fails', () async {
// Arrange
when(mockRepository.getEvenementsAVenir(page: anyNamed('page'), size: anyNamed('size')))
.thenThrow(Exception('Network error'));
// Act & Assert
expect(() => useCase(page: 0, size: 20), throwsException);
});
});
}

View File

@@ -0,0 +1,65 @@
/// Tests unitaires pour RegisterForEvent use case
library register_for_event_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/register_for_event.dart';
@GenerateMocks([IEvenementRepository])
import 'register_for_event_test.mocks.dart';
void main() {
late RegisterForEvent useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = RegisterForEvent(mockRepository);
});
group('RegisterForEvent Use Case', () {
const tEventId = 'event123';
test('should register for event successfully', () async {
// Arrange
when(mockRepository.inscrireEvenement(tEventId))
.thenAnswer((_) async => Future.value());
// Act
await useCase(tEventId);
// Assert
verify(mockRepository.inscrireEvenement(tEventId));
verifyNoMoreInteractions(mockRepository);
});
test('should throw exception when event not found', () async {
// Arrange
when(mockRepository.inscrireEvenement(any))
.thenThrow(Exception('Événement non trouvé'));
// Act & Assert
expect(() => useCase('nonexistent'), throwsA(isA<Exception>()));
});
test('should throw exception when already registered', () async {
// Arrange
when(mockRepository.inscrireEvenement(any))
.thenThrow(Exception('Vous êtes déjà inscrit à cet événement'));
// Act & Assert
expect(() => useCase(tEventId), throwsA(isA<Exception>()));
});
test('should throw exception when event is full', () async {
// Arrange
when(mockRepository.inscrireEvenement(any))
.thenThrow(Exception('Événement complet'));
// Act & Assert
expect(() => useCase(tEventId), throwsException);
});
});
}

View File

@@ -0,0 +1,67 @@
/// Tests unitaires pour SubmitEventFeedback use case
library submit_event_feedback_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/submit_event_feedback.dart';
@GenerateMocks([IEvenementRepository])
import 'submit_event_feedback_test.mocks.dart';
void main() {
late SubmitEventFeedback useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = SubmitEventFeedback(mockRepository);
});
group('SubmitEventFeedback Use Case', () {
const tEventId = 'event123';
const tNote = 5;
const tCommentaire = 'Excellent événement, très enrichissant!';
test('should throw UnimplementedError as endpoint not available', () async {
// Act & Assert
expect(
() => useCase(evenementId: tEventId, note: tNote),
throwsA(isA<UnimplementedError>()),
);
});
test('should throw UnimplementedError with feedback message', () async {
// Act & Assert
expect(
() => useCase(
evenementId: tEventId,
note: tNote,
commentaire: tCommentaire,
),
throwsA(isA<UnimplementedError>()),
);
});
test('should throw UnimplementedError for minimum rating', () async {
// Act & Assert
expect(
() => useCase(evenementId: tEventId, note: 1),
throwsA(isA<UnimplementedError>()),
);
});
test('should throw UnimplementedError for maximum rating', () async {
// Act & Assert
expect(
() => useCase(
evenementId: tEventId,
note: 5,
commentaire: 'Parfait!',
),
throwsA(isA<UnimplementedError>()),
);
});
});
}

View File

@@ -0,0 +1,289 @@
// Mocks generated by Mockito 5.4.4 from annotations
// in unionflow_mobile_apps/test/features/events/domain/usecases/submit_event_feedback_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i5;
import 'package:mockito/mockito.dart' as _i1;
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart'
as _i3;
import 'package:unionflow_mobile_apps/features/events/data/repositories/evenement_repository_impl.dart'
as _i2;
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart'
as _i4;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
class _FakeEvenementSearchResult_0 extends _i1.SmartFake
implements _i2.EvenementSearchResult {
_FakeEvenementSearchResult_0(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
class _FakeEvenementModel_1 extends _i1.SmartFake
implements _i3.EvenementModel {
_FakeEvenementModel_1(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
/// A class which mocks [IEvenementRepository].
///
/// See the documentation for Mockito's code generation for more information.
class MockIEvenementRepository extends _i1.Mock
implements _i4.IEvenementRepository {
MockIEvenementRepository() {
_i1.throwOnMissingStub(this);
}
@override
_i5.Future<_i2.EvenementSearchResult> getEvenements({
int? page = 0,
int? size = 20,
String? recherche,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenements,
[],
{
#page: page,
#size: size,
#recherche: recherche,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenements,
[],
{
#page: page,
#size: size,
#recherche: recherche,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i3.EvenementModel?> getEvenementById(String? id) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementById,
[id],
),
returnValue: _i5.Future<_i3.EvenementModel?>.value(),
) as _i5.Future<_i3.EvenementModel?>);
@override
_i5.Future<_i3.EvenementModel> createEvenement(
_i3.EvenementModel? evenement) =>
(super.noSuchMethod(
Invocation.method(
#createEvenement,
[evenement],
),
returnValue: _i5.Future<_i3.EvenementModel>.value(_FakeEvenementModel_1(
this,
Invocation.method(
#createEvenement,
[evenement],
),
)),
) as _i5.Future<_i3.EvenementModel>);
@override
_i5.Future<_i3.EvenementModel> updateEvenement(
String? id,
_i3.EvenementModel? evenement,
) =>
(super.noSuchMethod(
Invocation.method(
#updateEvenement,
[
id,
evenement,
],
),
returnValue: _i5.Future<_i3.EvenementModel>.value(_FakeEvenementModel_1(
this,
Invocation.method(
#updateEvenement,
[
id,
evenement,
],
),
)),
) as _i5.Future<_i3.EvenementModel>);
@override
_i5.Future<void> deleteEvenement(String? id) => (super.noSuchMethod(
Invocation.method(
#deleteEvenement,
[id],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsAVenir({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsAVenir,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsAVenir,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsEnCours({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsEnCours,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsEnCours,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsPasses({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsPasses,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsPasses,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<void> inscrireEvenement(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#inscrireEvenement,
[evenementId],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> desinscrireEvenement(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#desinscrireEvenement,
[evenementId],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<bool> getInscriptionStatus(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#getInscriptionStatus,
[evenementId],
),
returnValue: _i5.Future<bool>.value(false),
) as _i5.Future<bool>);
@override
_i5.Future<List<Map<String, dynamic>>> getParticipants(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#getParticipants,
[evenementId],
),
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
<Map<String, dynamic>>[]),
) as _i5.Future<List<Map<String, dynamic>>>);
@override
_i5.Future<Map<String, dynamic>> getEvenementsStats() => (super.noSuchMethod(
Invocation.method(
#getEvenementsStats,
[],
),
returnValue:
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
) as _i5.Future<Map<String, dynamic>>);
}

View File

@@ -0,0 +1,104 @@
/// Tests unitaires pour UpdateEvent use case
library update_event_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart';
import 'package:unionflow_mobile_apps/features/events/domain/usecases/update_event.dart';
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart';
@GenerateMocks([IEvenementRepository])
import 'update_event_test.mocks.dart';
void main() {
late UpdateEvent useCase;
late MockIEvenementRepository mockRepository;
setUp(() {
mockRepository = MockIEvenementRepository();
useCase = UpdateEvent(mockRepository);
});
group('UpdateEvent Use Case', () {
const tEventId = 'event123';
final tUpdatedEvent = EvenementModel(
id: 123,
titre: 'Assemblée Générale 2024 - Modifiée',
description: 'Assemblée générale annuelle (mise à jour)',
dateDebut: DateTime(2024, 12, 16, 14, 0),
dateFin: DateTime(2024, 12, 16, 18, 0),
lieu: 'Nouveau lieu',
type: TypeEvenement.assembleeGenerale,
statut: StatutEvenement.confirme,
);
test('should update event successfully', () async {
// Arrange
when(mockRepository.updateEvenement(tEventId, tUpdatedEvent))
.thenAnswer((_) async => tUpdatedEvent);
// Act
final result = await useCase(tEventId, tUpdatedEvent);
// Assert
expect(result, equals(tUpdatedEvent));
expect(result.titre, contains('Modifiée'));
expect(result.lieu, equals('Nouveau lieu'));
verify(mockRepository.updateEvenement(tEventId, tUpdatedEvent));
verifyNoMoreInteractions(mockRepository);
});
test('should update event status', () async {
// Arrange
final statusUpdate = EvenementModel(
id: 123,
titre: 'Événement',
dateDebut: DateTime(2024, 12, 15, 14, 0),
dateFin: DateTime(2024, 12, 15, 18, 0),
type: TypeEvenement.reunion,
statut: StatutEvenement.annule,
);
when(mockRepository.updateEvenement(tEventId, statusUpdate))
.thenAnswer((_) async => statusUpdate);
// Act
final result = await useCase(tEventId, statusUpdate);
// Assert
expect(result.statut, equals(StatutEvenement.annule));
});
test('should update event capacity', () async {
// Arrange
final capacityUpdate = EvenementModel(
id: 123,
titre: 'Événement',
dateDebut: DateTime(2024, 12, 15, 14, 0),
dateFin: DateTime(2024, 12, 15, 18, 0),
type: TypeEvenement.formation,
statut: StatutEvenement.planifie,
maxParticipants: 50,
participantsActuels: 25,
);
when(mockRepository.updateEvenement(tEventId, capacityUpdate))
.thenAnswer((_) async => capacityUpdate);
// Act
final result = await useCase(tEventId, capacityUpdate);
// Assert
expect(result.maxParticipants, equals(50));
expect(result.participantsActuels, equals(25));
});
test('should throw exception when update fails', () async {
// Arrange
when(mockRepository.updateEvenement(any, any))
.thenThrow(Exception('Update failed'));
// Act & Assert
expect(() => useCase(tEventId, tUpdatedEvent), throwsException);
});
});
}

View File

@@ -0,0 +1,289 @@
// Mocks generated by Mockito 5.4.4 from annotations
// in unionflow_mobile_apps/test/features/events/domain/usecases/update_event_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i5;
import 'package:mockito/mockito.dart' as _i1;
import 'package:unionflow_mobile_apps/features/events/data/models/evenement_model.dart'
as _i3;
import 'package:unionflow_mobile_apps/features/events/data/repositories/evenement_repository_impl.dart'
as _i2;
import 'package:unionflow_mobile_apps/features/events/domain/repositories/evenement_repository.dart'
as _i4;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
class _FakeEvenementSearchResult_0 extends _i1.SmartFake
implements _i2.EvenementSearchResult {
_FakeEvenementSearchResult_0(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
class _FakeEvenementModel_1 extends _i1.SmartFake
implements _i3.EvenementModel {
_FakeEvenementModel_1(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
/// A class which mocks [IEvenementRepository].
///
/// See the documentation for Mockito's code generation for more information.
class MockIEvenementRepository extends _i1.Mock
implements _i4.IEvenementRepository {
MockIEvenementRepository() {
_i1.throwOnMissingStub(this);
}
@override
_i5.Future<_i2.EvenementSearchResult> getEvenements({
int? page = 0,
int? size = 20,
String? recherche,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenements,
[],
{
#page: page,
#size: size,
#recherche: recherche,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenements,
[],
{
#page: page,
#size: size,
#recherche: recherche,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i3.EvenementModel?> getEvenementById(String? id) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementById,
[id],
),
returnValue: _i5.Future<_i3.EvenementModel?>.value(),
) as _i5.Future<_i3.EvenementModel?>);
@override
_i5.Future<_i3.EvenementModel> createEvenement(
_i3.EvenementModel? evenement) =>
(super.noSuchMethod(
Invocation.method(
#createEvenement,
[evenement],
),
returnValue: _i5.Future<_i3.EvenementModel>.value(_FakeEvenementModel_1(
this,
Invocation.method(
#createEvenement,
[evenement],
),
)),
) as _i5.Future<_i3.EvenementModel>);
@override
_i5.Future<_i3.EvenementModel> updateEvenement(
String? id,
_i3.EvenementModel? evenement,
) =>
(super.noSuchMethod(
Invocation.method(
#updateEvenement,
[
id,
evenement,
],
),
returnValue: _i5.Future<_i3.EvenementModel>.value(_FakeEvenementModel_1(
this,
Invocation.method(
#updateEvenement,
[
id,
evenement,
],
),
)),
) as _i5.Future<_i3.EvenementModel>);
@override
_i5.Future<void> deleteEvenement(String? id) => (super.noSuchMethod(
Invocation.method(
#deleteEvenement,
[id],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsAVenir({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsAVenir,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsAVenir,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsEnCours({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsEnCours,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsEnCours,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<_i2.EvenementSearchResult> getEvenementsPasses({
int? page = 0,
int? size = 20,
}) =>
(super.noSuchMethod(
Invocation.method(
#getEvenementsPasses,
[],
{
#page: page,
#size: size,
},
),
returnValue: _i5.Future<_i2.EvenementSearchResult>.value(
_FakeEvenementSearchResult_0(
this,
Invocation.method(
#getEvenementsPasses,
[],
{
#page: page,
#size: size,
},
),
)),
) as _i5.Future<_i2.EvenementSearchResult>);
@override
_i5.Future<void> inscrireEvenement(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#inscrireEvenement,
[evenementId],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> desinscrireEvenement(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#desinscrireEvenement,
[evenementId],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<bool> getInscriptionStatus(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#getInscriptionStatus,
[evenementId],
),
returnValue: _i5.Future<bool>.value(false),
) as _i5.Future<bool>);
@override
_i5.Future<List<Map<String, dynamic>>> getParticipants(String? evenementId) =>
(super.noSuchMethod(
Invocation.method(
#getParticipants,
[evenementId],
),
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
<Map<String, dynamic>>[]),
) as _i5.Future<List<Map<String, dynamic>>>);
@override
_i5.Future<Map<String, dynamic>> getEvenementsStats() => (super.noSuchMethod(
Invocation.method(
#getEvenementsStats,
[],
),
returnValue:
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
) as _i5.Future<Map<String, dynamic>>);
}