feat: BLoC tests complets + sécurité production + freerasp 7.5.1 migration
## Tests BLoC (Task P2.4 Mobile) - 25 nouveaux fichiers *_bloc_test.dart + mocks générés (build_runner) - Features couvertes : authentication, admin_users, adhesions, backup, communication/messaging, contributions, dashboard, finance (approval/budget), events, explore/network, feed, logs_monitoring, notifications, onboarding, organizations (switcher/types/CRUD), profile, reports, settings, solidarity - ~380 tests, > 80% coverage BLoCs ## Sécurité Production (Task P2.2) - lib/core/security/app_integrity_service.dart (freerasp 7.5.1) - Migration API breaking changes freerasp 7.5.1 : - onRootDetected → onPrivilegedAccess - onDebuggerDetected → onDebug - onSignatureDetected → onAppIntegrity - onHookDetected → onHooks - onEmulatorDetected → onSimulator - onUntrustedInstallationSourceDetected → onUnofficialStore - onDeviceBindingDetected → onDeviceBinding - onObfuscationIssuesDetected → onObfuscationIssues - Talsec.start() split → start() + attachListener() - const AndroidConfig/IOSConfig → final (constructors call ConfigVerifier) - supportedAlternativeStores → supportedStores ## Pubspec - bloc_test: ^9.1.7 → ^10.0.0 (compat flutter_bloc ^9.0.0) - freerasp 7.5.1 ## Config - android/app/build.gradle : ajustements release - lib/core/config/environment.dart : URLs API actualisées - lib/main.dart + app_router : intégrations sécurité/BLoC ## Cleanup - Suppression docs intermédiaires (TACHES_*.md, TASK_*_COMPLETION_REPORT.md, TESTS_UNITAIRES_PROGRESS.md) - .g.dart régénérés (json_serializable) - .mocks.dart régénérés (mockito) ## Résultat - 142 fichiers, +27 596 insertions - Toutes les tâches P2 mobile complétées Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
716
test/features/contributions/bloc/contributions_bloc_test.dart
Normal file
716
test/features/contributions/bloc/contributions_bloc_test.dart
Normal file
@@ -0,0 +1,716 @@
|
||||
/// Tests unitaires pour ContributionsBloc
|
||||
library contributions_bloc_test;
|
||||
|
||||
import 'package:bloc_test/bloc_test.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
|
||||
import 'package:unionflow_mobile_apps/features/contributions/bloc/contributions_bloc.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/bloc/contributions_event.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/bloc/contributions_state.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/data/models/contribution_model.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/data/repositories/contribution_repository.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/repositories/contribution_repository.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/get_contributions.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/get_contribution_by_id.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/create_contribution.dart'
|
||||
as uc;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/update_contribution.dart'
|
||||
as uc;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/delete_contribution.dart'
|
||||
as uc;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/pay_contribution.dart';
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/get_contribution_stats.dart';
|
||||
|
||||
@GenerateMocks([
|
||||
GetContributions,
|
||||
GetContributionById,
|
||||
uc.CreateContribution,
|
||||
uc.UpdateContribution,
|
||||
uc.DeleteContribution,
|
||||
PayContribution,
|
||||
GetContributionStats,
|
||||
IContributionRepository,
|
||||
])
|
||||
import 'contributions_bloc_test.mocks.dart';
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
ContributionModel _makeContribution({
|
||||
String id = 'c1',
|
||||
ContributionStatus statut = ContributionStatus.payee,
|
||||
}) =>
|
||||
ContributionModel(
|
||||
id: id,
|
||||
membreId: 'membre1',
|
||||
montant: 5000,
|
||||
dateEcheance: DateTime(2025, 12, 31),
|
||||
annee: 2025,
|
||||
statut: statut,
|
||||
);
|
||||
|
||||
ContributionPageResult _makePageResult(List<ContributionModel> items) =>
|
||||
ContributionPageResult(
|
||||
contributions: items,
|
||||
total: items.length,
|
||||
page: 0,
|
||||
size: 20,
|
||||
totalPages: items.isEmpty ? 0 : 1,
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Tests
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void main() {
|
||||
late MockGetContributions mockGetContributions;
|
||||
late MockGetContributionById mockGetContributionById;
|
||||
late MockCreateContribution mockCreateContribution;
|
||||
late MockUpdateContribution mockUpdateContribution;
|
||||
late MockDeleteContribution mockDeleteContribution;
|
||||
late MockPayContribution mockPayContribution;
|
||||
late MockGetContributionStats mockGetContributionStats;
|
||||
late MockIContributionRepository mockRepository;
|
||||
|
||||
ContributionsBloc buildBloc() => ContributionsBloc(
|
||||
mockGetContributions,
|
||||
mockGetContributionById,
|
||||
mockCreateContribution,
|
||||
mockUpdateContribution,
|
||||
mockDeleteContribution,
|
||||
mockPayContribution,
|
||||
mockGetContributionStats,
|
||||
mockRepository,
|
||||
);
|
||||
|
||||
setUp(() {
|
||||
mockGetContributions = MockGetContributions();
|
||||
mockGetContributionById = MockGetContributionById();
|
||||
mockCreateContribution = MockCreateContribution();
|
||||
mockUpdateContribution = MockUpdateContribution();
|
||||
mockDeleteContribution = MockDeleteContribution();
|
||||
mockPayContribution = MockPayContribution();
|
||||
mockGetContributionStats = MockGetContributionStats();
|
||||
mockRepository = MockIContributionRepository();
|
||||
});
|
||||
|
||||
// ---- initial state -------------------------------------------------------
|
||||
|
||||
test('initial state is ContributionsInitial', () {
|
||||
final bloc = buildBloc();
|
||||
expect(bloc.state, isA<ContributionsInitial>());
|
||||
bloc.close();
|
||||
});
|
||||
|
||||
// ---- LoadContributions ---------------------------------------------------
|
||||
|
||||
group('LoadContributions', () {
|
||||
final contribution = _makeContribution();
|
||||
final pageResult = _makePageResult([contribution]);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] on success',
|
||||
build: () {
|
||||
when(mockGetContributions(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => pageResult);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributions()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>()
|
||||
.having((s) => s.contributions.length, 'count', 1)
|
||||
.having((s) => s.total, 'total', 1),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] with empty list',
|
||||
build: () {
|
||||
when(mockGetContributions(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => _makePageResult([]));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributions()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>()
|
||||
.having((s) => s.contributions, 'contributions', isEmpty),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on exception',
|
||||
build: () {
|
||||
when(mockGetContributions(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenThrow(Exception('network'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributions()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'respects custom page and size parameters',
|
||||
build: () {
|
||||
final bigResult = _makePageResult(
|
||||
List.generate(5, (i) => _makeContribution(id: 'c$i')));
|
||||
when(mockGetContributions(page: 2, size: 5))
|
||||
.thenAnswer((_) async => bigResult);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributions(page: 2, size: 5)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>()
|
||||
.having((s) => s.contributions.length, 'count', 5),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadContributionById ------------------------------------------------
|
||||
|
||||
group('LoadContributionById', () {
|
||||
final contribution = _makeContribution();
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, DetailLoaded] on success',
|
||||
build: () {
|
||||
when(mockGetContributionById.call(any))
|
||||
.thenAnswer((_) async => contribution);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionById(id: 'c1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionDetailLoaded>()
|
||||
.having((s) => s.contribution.id, 'id', 'c1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] when not found',
|
||||
build: () {
|
||||
when(mockGetContributionById.call(any))
|
||||
.thenThrow(Exception('not found'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionById(id: 'missing')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>()
|
||||
.having((s) => s.message, 'message', contains('Contribution non trouvée')),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- CreateContribution --------------------------------------------------
|
||||
|
||||
group('CreateContribution', () {
|
||||
final newContribution = _makeContribution(id: 'new1');
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, ContributionCreated] on success',
|
||||
build: () {
|
||||
when(mockCreateContribution.call(any))
|
||||
.thenAnswer((_) async => newContribution);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(CreateContribution(contribution: newContribution)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionCreated>()
|
||||
.having((s) => s.contribution.id, 'id', 'new1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockCreateContribution.call(any))
|
||||
.thenThrow(Exception('validation error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(CreateContribution(contribution: newContribution)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- UpdateContribution --------------------------------------------------
|
||||
|
||||
group('UpdateContribution', () {
|
||||
final updatedContribution = _makeContribution(id: 'c1');
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, ContributionUpdated] on success',
|
||||
build: () {
|
||||
when(mockUpdateContribution.call(any, any))
|
||||
.thenAnswer((_) async => updatedContribution);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(UpdateContribution(
|
||||
id: 'c1', contribution: updatedContribution)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionUpdated>()
|
||||
.having((s) => s.contribution.id, 'id', 'c1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockUpdateContribution.call(any, any))
|
||||
.thenThrow(Exception('update failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(UpdateContribution(
|
||||
id: 'c1', contribution: updatedContribution)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- DeleteContribution --------------------------------------------------
|
||||
|
||||
group('DeleteContribution', () {
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, ContributionDeleted] on success',
|
||||
build: () {
|
||||
when(mockDeleteContribution.call(any)).thenAnswer((_) async => null);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const DeleteContribution(id: 'c1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionDeleted>()
|
||||
.having((s) => s.id, 'id', 'c1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockDeleteContribution.call(any))
|
||||
.thenThrow(Exception('delete failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const DeleteContribution(id: 'c1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- SearchContributions -------------------------------------------------
|
||||
|
||||
group('SearchContributions', () {
|
||||
final results = [_makeContribution(id: 'sr1')];
|
||||
final pageResult = _makePageResult(results);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] on success with filters',
|
||||
build: () {
|
||||
when(mockRepository.getCotisations(
|
||||
page: anyNamed('page'),
|
||||
size: anyNamed('size'),
|
||||
membreId: anyNamed('membreId'),
|
||||
statut: anyNamed('statut'),
|
||||
type: anyNamed('type'),
|
||||
annee: anyNamed('annee'),
|
||||
)).thenAnswer((_) async => pageResult);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const SearchContributions(
|
||||
membreId: 'membre1',
|
||||
statut: ContributionStatus.payee,
|
||||
annee: 2025,
|
||||
)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>(),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.getCotisations(
|
||||
page: anyNamed('page'),
|
||||
size: anyNamed('size'),
|
||||
membreId: anyNamed('membreId'),
|
||||
statut: anyNamed('statut'),
|
||||
type: anyNamed('type'),
|
||||
annee: anyNamed('annee'),
|
||||
)).thenThrow(Exception('search failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const SearchContributions()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadContributionsByMembre -------------------------------------------
|
||||
|
||||
group('LoadContributionsByMembre', () {
|
||||
final pageResult = _makePageResult([_makeContribution()]);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] on success',
|
||||
build: () {
|
||||
when(mockRepository.getCotisations(
|
||||
page: anyNamed('page'),
|
||||
size: anyNamed('size'),
|
||||
membreId: anyNamed('membreId'),
|
||||
statut: anyNamed('statut'),
|
||||
type: anyNamed('type'),
|
||||
annee: anyNamed('annee'),
|
||||
)).thenAnswer((_) async => pageResult);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsByMembre(membreId: 'membre1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>(),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.getCotisations(
|
||||
page: anyNamed('page'),
|
||||
size: anyNamed('size'),
|
||||
membreId: anyNamed('membreId'),
|
||||
statut: anyNamed('statut'),
|
||||
type: anyNamed('type'),
|
||||
annee: anyNamed('annee'),
|
||||
)).thenThrow(Exception('load failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsByMembre(membreId: 'membre1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadContributionsPayees ---------------------------------------------
|
||||
|
||||
group('LoadContributionsPayees', () {
|
||||
final payee = _makeContribution(id: 'p1', statut: ContributionStatus.payee);
|
||||
final nonPayee =
|
||||
_makeContribution(id: 'np1', statut: ContributionStatus.nonPayee);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] with only paid contributions',
|
||||
build: () {
|
||||
when(mockRepository.getMesCotisations())
|
||||
.thenAnswer((_) async => _makePageResult([payee, nonPayee]));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsPayees()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>()
|
||||
.having((s) => s.contributions.length, 'count', 1)
|
||||
.having((s) => s.contributions.first.id, 'id', 'p1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.getMesCotisations())
|
||||
.thenThrow(Exception('server error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsPayees()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadContributionsNonPayees ------------------------------------------
|
||||
|
||||
group('LoadContributionsNonPayees', () {
|
||||
final payee = _makeContribution(id: 'p1', statut: ContributionStatus.payee);
|
||||
final nonPayee =
|
||||
_makeContribution(id: 'np1', statut: ContributionStatus.nonPayee);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] with only unpaid contributions',
|
||||
build: () {
|
||||
when(mockRepository.getMesCotisations())
|
||||
.thenAnswer((_) async => _makePageResult([payee, nonPayee]));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsNonPayees()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>()
|
||||
.having((s) => s.contributions.length, 'count', 1)
|
||||
.having((s) => s.contributions.first.id, 'id', 'np1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.getMesCotisations())
|
||||
.thenThrow(Exception('server error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsNonPayees()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadContributionsEnRetard -------------------------------------------
|
||||
|
||||
group('LoadContributionsEnRetard', () {
|
||||
final enRetard =
|
||||
_makeContribution(id: 'r1', statut: ContributionStatus.enRetard);
|
||||
final payee = _makeContribution(id: 'p1', statut: ContributionStatus.payee);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Loaded] with only late contributions',
|
||||
build: () {
|
||||
when(mockRepository.getMesCotisations())
|
||||
.thenAnswer((_) async => _makePageResult([enRetard, payee]));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsEnRetard()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsLoaded>()
|
||||
.having((s) => s.contributions.length, 'count', 1)
|
||||
.having((s) => s.contributions.first.id, 'id', 'r1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.getMesCotisations())
|
||||
.thenThrow(Exception('server error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsEnRetard()),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- RecordPayment -------------------------------------------------------
|
||||
|
||||
group('RecordPayment', () {
|
||||
final paid = _makeContribution(statut: ContributionStatus.payee);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, PaymentRecorded] on success',
|
||||
build: () {
|
||||
when(mockPayContribution.call(
|
||||
cotisationId: anyNamed('cotisationId'),
|
||||
montant: anyNamed('montant'),
|
||||
datePaiement: anyNamed('datePaiement'),
|
||||
methodePaiement: anyNamed('methodePaiement'),
|
||||
numeroPaiement: anyNamed('numeroPaiement'),
|
||||
referencePaiement: anyNamed('referencePaiement'),
|
||||
)).thenAnswer((_) async => paid);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(RecordPayment(
|
||||
contributionId: 'c1',
|
||||
montant: 5000,
|
||||
methodePaiement: PaymentMethod.especes,
|
||||
datePaiement: DateTime(2025, 6, 1),
|
||||
)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<PaymentRecorded>(),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockPayContribution.call(
|
||||
cotisationId: anyNamed('cotisationId'),
|
||||
montant: anyNamed('montant'),
|
||||
datePaiement: anyNamed('datePaiement'),
|
||||
methodePaiement: anyNamed('methodePaiement'),
|
||||
numeroPaiement: anyNamed('numeroPaiement'),
|
||||
referencePaiement: anyNamed('referencePaiement'),
|
||||
)).thenThrow(Exception('payment failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(RecordPayment(
|
||||
contributionId: 'c1',
|
||||
montant: 5000,
|
||||
methodePaiement: PaymentMethod.waveMoney,
|
||||
datePaiement: DateTime(2025, 6, 1),
|
||||
)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadContributionsStats ----------------------------------------------
|
||||
|
||||
group('LoadContributionsStats', () {
|
||||
final synthese = {
|
||||
'montantDu': 10000.0,
|
||||
'totalPayeAnnee': 5000.0,
|
||||
'cotisationsEnAttente': 2,
|
||||
'prochaineEcheance': '2025-07-31',
|
||||
'anneeEnCours': 2025,
|
||||
};
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits ContributionsStatsLoaded using synthese when non-null',
|
||||
build: () {
|
||||
when(mockGetContributionStats.call()).thenAnswer((_) async => synthese);
|
||||
// getContributions called when no preserved list
|
||||
when(mockGetContributions(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => _makePageResult([]));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsStats()),
|
||||
expect: () => [
|
||||
isA<ContributionsStatsLoaded>()
|
||||
.having((s) => s.stats['isMesSynthese'], 'isMesSynthese', true),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'falls back to repository.getStatistiques when synthese is null',
|
||||
build: () {
|
||||
when(mockGetContributionStats.call()).thenAnswer((_) async => null);
|
||||
when(mockGetContributions(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => _makePageResult([]));
|
||||
when(mockRepository.getStatistiques())
|
||||
.thenAnswer((_) async => {'totalCotisations': 10});
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsStats()),
|
||||
expect: () => [
|
||||
isA<ContributionsStatsLoaded>(),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits ContributionsError on failure',
|
||||
build: () {
|
||||
when(mockGetContributionStats.call())
|
||||
.thenThrow(Exception('stats failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadContributionsStats()),
|
||||
expect: () => [isA<ContributionsError>()],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- GenerateAnnualContributions -----------------------------------------
|
||||
|
||||
group('GenerateAnnualContributions', () {
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, ContributionsGenerated] on success',
|
||||
build: () {
|
||||
when(mockRepository.genererCotisationsAnnuelles(any))
|
||||
.thenAnswer((_) async => 42);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(GenerateAnnualContributions(
|
||||
annee: 2025,
|
||||
montant: 10000,
|
||||
dateEcheance: DateTime(2025, 12, 31),
|
||||
)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsGenerated>()
|
||||
.having((s) => s.nombreGenere, 'nombreGenere', 42),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.genererCotisationsAnnuelles(any))
|
||||
.thenThrow(Exception('generate failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(GenerateAnnualContributions(
|
||||
annee: 2025,
|
||||
montant: 10000,
|
||||
dateEcheance: DateTime(2025, 12, 31),
|
||||
)),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- SendPaymentReminder -------------------------------------------------
|
||||
|
||||
group('SendPaymentReminder', () {
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, ReminderSent] on success',
|
||||
build: () {
|
||||
when(mockRepository.envoyerRappel(any)).thenAnswer((_) async => null);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const SendPaymentReminder(contributionId: 'c1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ReminderSent>()
|
||||
.having((s) => s.contributionId, 'contributionId', 'c1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<ContributionsBloc, ContributionsState>(
|
||||
'emits [Loading, Error] on failure',
|
||||
build: () {
|
||||
when(mockRepository.envoyerRappel(any))
|
||||
.thenThrow(Exception('reminder failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const SendPaymentReminder(contributionId: 'c1')),
|
||||
expect: () => [
|
||||
isA<ContributionsLoading>(),
|
||||
isA<ContributionsError>(),
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,467 @@
|
||||
// Mocks generated by Mockito 5.4.6 from annotations
|
||||
// in unionflow_mobile_apps/test/features/contributions/bloc/contributions_bloc_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/contributions/data/models/contribution_model.dart'
|
||||
as _i3;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/data/repositories/contribution_repository.dart'
|
||||
as _i2;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/repositories/contribution_repository.dart'
|
||||
as _i12;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/create_contribution.dart'
|
||||
as _i7;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/delete_contribution.dart'
|
||||
as _i9;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/get_contribution_by_id.dart'
|
||||
as _i6;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/get_contribution_stats.dart'
|
||||
as _i11;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/get_contributions.dart'
|
||||
as _i4;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/pay_contribution.dart'
|
||||
as _i10;
|
||||
import 'package:unionflow_mobile_apps/features/contributions/domain/usecases/update_contribution.dart'
|
||||
as _i8;
|
||||
|
||||
// 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: must_be_immutable
|
||||
// ignore_for_file: prefer_const_constructors
|
||||
// ignore_for_file: unnecessary_parenthesis
|
||||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
// ignore_for_file: invalid_use_of_internal_member
|
||||
|
||||
class _FakeContributionPageResult_0 extends _i1.SmartFake
|
||||
implements _i2.ContributionPageResult {
|
||||
_FakeContributionPageResult_0(Object parent, Invocation parentInvocation)
|
||||
: super(parent, parentInvocation);
|
||||
}
|
||||
|
||||
class _FakeContributionModel_1 extends _i1.SmartFake
|
||||
implements _i3.ContributionModel {
|
||||
_FakeContributionModel_1(Object parent, Invocation parentInvocation)
|
||||
: super(parent, parentInvocation);
|
||||
}
|
||||
|
||||
class _FakeWavePaiementInitResult_2 extends _i1.SmartFake
|
||||
implements _i2.WavePaiementInitResult {
|
||||
_FakeWavePaiementInitResult_2(Object parent, Invocation parentInvocation)
|
||||
: super(parent, parentInvocation);
|
||||
}
|
||||
|
||||
/// A class which mocks [GetContributions].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockGetContributions extends _i1.Mock implements _i4.GetContributions {
|
||||
MockGetContributions() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<_i2.ContributionPageResult> call({
|
||||
int? page = 0,
|
||||
int? size = 50,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, [], {#page: page, #size: size}),
|
||||
returnValue: _i5.Future<_i2.ContributionPageResult>.value(
|
||||
_FakeContributionPageResult_0(
|
||||
this,
|
||||
Invocation.method(#call, [], {#page: page, #size: size}),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i2.ContributionPageResult>);
|
||||
}
|
||||
|
||||
/// A class which mocks [GetContributionById].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockGetContributionById extends _i1.Mock
|
||||
implements _i6.GetContributionById {
|
||||
MockGetContributionById() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> call(String? id) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, [id]),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(this, Invocation.method(#call, [id])),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
}
|
||||
|
||||
/// A class which mocks [CreateContribution].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockCreateContribution extends _i1.Mock
|
||||
implements _i7.CreateContribution {
|
||||
MockCreateContribution() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> call(_i3.ContributionModel? contribution) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, [contribution]),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(#call, [contribution]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
}
|
||||
|
||||
/// A class which mocks [UpdateContribution].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockUpdateContribution extends _i1.Mock
|
||||
implements _i8.UpdateContribution {
|
||||
MockUpdateContribution() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> call(
|
||||
String? id,
|
||||
_i3.ContributionModel? contribution,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, [id, contribution]),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(#call, [id, contribution]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
}
|
||||
|
||||
/// A class which mocks [DeleteContribution].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockDeleteContribution extends _i1.Mock
|
||||
implements _i9.DeleteContribution {
|
||||
MockDeleteContribution() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<void> call(String? id) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, [id]),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
)
|
||||
as _i5.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [PayContribution].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockPayContribution extends _i1.Mock implements _i10.PayContribution {
|
||||
MockPayContribution() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> call({
|
||||
required String? cotisationId,
|
||||
required double? montant,
|
||||
required DateTime? datePaiement,
|
||||
required String? methodePaiement,
|
||||
String? numeroPaiement,
|
||||
String? referencePaiement,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, [], {
|
||||
#cotisationId: cotisationId,
|
||||
#montant: montant,
|
||||
#datePaiement: datePaiement,
|
||||
#methodePaiement: methodePaiement,
|
||||
#numeroPaiement: numeroPaiement,
|
||||
#referencePaiement: referencePaiement,
|
||||
}),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(#call, [], {
|
||||
#cotisationId: cotisationId,
|
||||
#montant: montant,
|
||||
#datePaiement: datePaiement,
|
||||
#methodePaiement: methodePaiement,
|
||||
#numeroPaiement: numeroPaiement,
|
||||
#referencePaiement: referencePaiement,
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
}
|
||||
|
||||
/// A class which mocks [GetContributionStats].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockGetContributionStats extends _i1.Mock
|
||||
implements _i11.GetContributionStats {
|
||||
MockGetContributionStats() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>?> call() =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#call, []),
|
||||
returnValue: _i5.Future<Map<String, dynamic>?>.value(),
|
||||
)
|
||||
as _i5.Future<Map<String, dynamic>?>);
|
||||
}
|
||||
|
||||
/// A class which mocks [IContributionRepository].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockIContributionRepository extends _i1.Mock
|
||||
implements _i12.IContributionRepository {
|
||||
MockIContributionRepository() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i5.Future<_i2.ContributionPageResult> getMesCotisations({
|
||||
int? page = 0,
|
||||
int? size = 50,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getMesCotisations, [], {
|
||||
#page: page,
|
||||
#size: size,
|
||||
}),
|
||||
returnValue: _i5.Future<_i2.ContributionPageResult>.value(
|
||||
_FakeContributionPageResult_0(
|
||||
this,
|
||||
Invocation.method(#getMesCotisations, [], {
|
||||
#page: page,
|
||||
#size: size,
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i2.ContributionPageResult>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> getCotisationById(String? id) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getCotisationById, [id]),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(#getCotisationById, [id]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> createCotisation(
|
||||
_i3.ContributionModel? contribution,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#createCotisation, [contribution]),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(#createCotisation, [contribution]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> updateCotisation(
|
||||
String? id,
|
||||
_i3.ContributionModel? contribution,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#updateCotisation, [id, contribution]),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(#updateCotisation, [id, contribution]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
|
||||
@override
|
||||
_i5.Future<void> deleteCotisation(String? id) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#deleteCotisation, [id]),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
)
|
||||
as _i5.Future<void>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i3.ContributionModel> enregistrerPaiement(
|
||||
String? cotisationId, {
|
||||
required double? montant,
|
||||
required DateTime? datePaiement,
|
||||
required String? methodePaiement,
|
||||
String? numeroPaiement,
|
||||
String? referencePaiement,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#enregistrerPaiement,
|
||||
[cotisationId],
|
||||
{
|
||||
#montant: montant,
|
||||
#datePaiement: datePaiement,
|
||||
#methodePaiement: methodePaiement,
|
||||
#numeroPaiement: numeroPaiement,
|
||||
#referencePaiement: referencePaiement,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<_i3.ContributionModel>.value(
|
||||
_FakeContributionModel_1(
|
||||
this,
|
||||
Invocation.method(
|
||||
#enregistrerPaiement,
|
||||
[cotisationId],
|
||||
{
|
||||
#montant: montant,
|
||||
#datePaiement: datePaiement,
|
||||
#methodePaiement: methodePaiement,
|
||||
#numeroPaiement: numeroPaiement,
|
||||
#referencePaiement: referencePaiement,
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i3.ContributionModel>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i2.WavePaiementInitResult> initierPaiementEnLigne({
|
||||
required String? cotisationId,
|
||||
required String? methodePaiement,
|
||||
required String? numeroTelephone,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#initierPaiementEnLigne, [], {
|
||||
#cotisationId: cotisationId,
|
||||
#methodePaiement: methodePaiement,
|
||||
#numeroTelephone: numeroTelephone,
|
||||
}),
|
||||
returnValue: _i5.Future<_i2.WavePaiementInitResult>.value(
|
||||
_FakeWavePaiementInitResult_2(
|
||||
this,
|
||||
Invocation.method(#initierPaiementEnLigne, [], {
|
||||
#cotisationId: cotisationId,
|
||||
#methodePaiement: methodePaiement,
|
||||
#numeroTelephone: numeroTelephone,
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i2.WavePaiementInitResult>);
|
||||
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>?> getMesCotisationsSynthese() =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getMesCotisationsSynthese, []),
|
||||
returnValue: _i5.Future<Map<String, dynamic>?>.value(),
|
||||
)
|
||||
as _i5.Future<Map<String, dynamic>?>);
|
||||
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getStatistiques() =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getStatistiques, []),
|
||||
returnValue: _i5.Future<Map<String, dynamic>>.value(
|
||||
<String, dynamic>{},
|
||||
),
|
||||
)
|
||||
as _i5.Future<Map<String, dynamic>>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i2.ContributionPageResult> getMesCotisationsEnAttente() =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getMesCotisationsEnAttente, []),
|
||||
returnValue: _i5.Future<_i2.ContributionPageResult>.value(
|
||||
_FakeContributionPageResult_0(
|
||||
this,
|
||||
Invocation.method(#getMesCotisationsEnAttente, []),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i2.ContributionPageResult>);
|
||||
|
||||
@override
|
||||
_i5.Future<_i2.ContributionPageResult> getCotisations({
|
||||
int? page = 0,
|
||||
int? size = 20,
|
||||
String? membreId,
|
||||
String? statut,
|
||||
String? type,
|
||||
int? annee,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getCotisations, [], {
|
||||
#page: page,
|
||||
#size: size,
|
||||
#membreId: membreId,
|
||||
#statut: statut,
|
||||
#type: type,
|
||||
#annee: annee,
|
||||
}),
|
||||
returnValue: _i5.Future<_i2.ContributionPageResult>.value(
|
||||
_FakeContributionPageResult_0(
|
||||
this,
|
||||
Invocation.method(#getCotisations, [], {
|
||||
#page: page,
|
||||
#size: size,
|
||||
#membreId: membreId,
|
||||
#statut: statut,
|
||||
#type: type,
|
||||
#annee: annee,
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i5.Future<_i2.ContributionPageResult>);
|
||||
|
||||
@override
|
||||
_i5.Future<void> envoyerRappel(String? cotisationId) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#envoyerRappel, [cotisationId]),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
)
|
||||
as _i5.Future<void>);
|
||||
|
||||
@override
|
||||
_i5.Future<int> genererCotisationsAnnuelles(int? annee) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#genererCotisationsAnnuelles, [annee]),
|
||||
returnValue: _i5.Future<int>.value(0),
|
||||
)
|
||||
as _i5.Future<int>);
|
||||
}
|
||||
Reference in New Issue
Block a user