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:
540
test/features/adhesions/bloc/adhesions_bloc_test.dart
Normal file
540
test/features/adhesions/bloc/adhesions_bloc_test.dart
Normal file
@@ -0,0 +1,540 @@
|
||||
/// Tests unitaires pour AdhesionsBloc
|
||||
library adhesions_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/adhesions/bloc/adhesions_bloc.dart';
|
||||
import 'package:unionflow_mobile_apps/features/adhesions/data/models/adhesion_model.dart';
|
||||
import 'package:unionflow_mobile_apps/features/adhesions/data/repositories/adhesion_repository.dart';
|
||||
|
||||
@GenerateMocks([AdhesionRepository])
|
||||
import 'adhesions_bloc_test.mocks.dart';
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
AdhesionModel _makeAdhesion({
|
||||
String id = 'adh1',
|
||||
String statut = 'EN_ATTENTE',
|
||||
}) =>
|
||||
AdhesionModel(
|
||||
id: id,
|
||||
membreId: 'membre1',
|
||||
nomMembre: 'Dupont Jean',
|
||||
organisationId: 'org1',
|
||||
nomOrganisation: 'TestOrg',
|
||||
statut: statut,
|
||||
fraisAdhesion: 10000,
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Tests
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void main() {
|
||||
late MockAdhesionRepository mockRepository;
|
||||
|
||||
AdhesionsBloc buildBloc() => AdhesionsBloc(mockRepository);
|
||||
|
||||
setUp(() {
|
||||
mockRepository = MockAdhesionRepository();
|
||||
});
|
||||
|
||||
// ---- initial state -------------------------------------------------------
|
||||
|
||||
test('initial state has status initial and empty adhesions list', () {
|
||||
final bloc = buildBloc();
|
||||
expect(bloc.state.status, AdhesionsStatus.initial);
|
||||
expect(bloc.state.adhesions, isEmpty);
|
||||
bloc.close();
|
||||
});
|
||||
|
||||
// ---- LoadAdhesions -------------------------------------------------------
|
||||
|
||||
group('LoadAdhesions', () {
|
||||
final adhesionList = [_makeAdhesion(), _makeAdhesion(id: 'adh2')];
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then loaded with adhesions list',
|
||||
build: () {
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => adhesionList);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesions()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesions.length, 'count', 2),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then loaded with empty list',
|
||||
build: () {
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => []);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesions()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesions, 'adhesions', isEmpty),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then error on exception',
|
||||
build: () {
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenThrow(Exception('network failure'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesions()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'uses custom page and size',
|
||||
build: () {
|
||||
when(mockRepository.getAll(page: 1, size: 5))
|
||||
.thenAnswer((_) async => [_makeAdhesion()]);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesions(page: 1, size: 5)),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded),
|
||||
],
|
||||
verify: (_) => verify(mockRepository.getAll(page: 1, size: 5)),
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadAdhesionsByMembre -----------------------------------------------
|
||||
|
||||
group('LoadAdhesionsByMembre', () {
|
||||
final list = [_makeAdhesion()];
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then loaded with membre adhesions',
|
||||
build: () {
|
||||
when(mockRepository.getByMembre(any,
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => list);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(LoadAdhesionsByMembre('membre1')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesions.length, 'count', 1),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error when repository throws',
|
||||
build: () {
|
||||
when(mockRepository.getByMembre(any,
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenThrow(Exception('server error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(LoadAdhesionsByMembre('membre1')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadAdhesionsEnAttente ----------------------------------------------
|
||||
|
||||
group('LoadAdhesionsEnAttente', () {
|
||||
final enAttente = [_makeAdhesion(statut: 'EN_ATTENTE')];
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then loaded with pending adhesions',
|
||||
build: () {
|
||||
when(mockRepository.getEnAttente(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => enAttente);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesionsEnAttente()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesions.length, 'count', 1),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on repository failure',
|
||||
build: () {
|
||||
when(mockRepository.getEnAttente(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenThrow(Exception('server error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesionsEnAttente()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadAdhesionsByStatut -----------------------------------------------
|
||||
|
||||
group('LoadAdhesionsByStatut', () {
|
||||
final approved = [_makeAdhesion(statut: 'APPROUVEE')];
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then loaded filtered by statut',
|
||||
build: () {
|
||||
when(mockRepository.getByStatut(any,
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => approved);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(LoadAdhesionsByStatut('APPROUVEE')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on failure',
|
||||
build: () {
|
||||
when(mockRepository.getByStatut(any,
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenThrow(Exception('filter failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(LoadAdhesionsByStatut('APPROUVEE')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadAdhesionById ----------------------------------------------------
|
||||
|
||||
group('LoadAdhesionById', () {
|
||||
final adhesion = _makeAdhesion();
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits loading then loaded with adhesionDetail',
|
||||
build: () {
|
||||
when(mockRepository.getById(any))
|
||||
.thenAnswer((_) async => adhesion);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(LoadAdhesionById('adh1')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesionDetail?.id, 'detail id', 'adh1'),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error when not found',
|
||||
build: () {
|
||||
when(mockRepository.getById(any))
|
||||
.thenThrow(Exception('not found'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(LoadAdhesionById('missing')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- CreateAdhesion ------------------------------------------------------
|
||||
|
||||
group('CreateAdhesion', () {
|
||||
final adhesion = _makeAdhesion();
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'creates adhesion then re-triggers LoadAdhesions',
|
||||
build: () {
|
||||
when(mockRepository.create(any)).thenAnswer((_) async => adhesion);
|
||||
// LoadAdhesions triggered internally
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => [adhesion]);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(CreateAdhesion(adhesion)),
|
||||
expect: () => [
|
||||
// Loading from CreateAdhesion
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
// Loading from auto-triggered LoadAdhesions
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
// Loaded from LoadAdhesions result
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on failure',
|
||||
build: () {
|
||||
when(mockRepository.create(any))
|
||||
.thenThrow(Exception('creation failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(CreateAdhesion(adhesion)),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- ApprouverAdhesion ---------------------------------------------------
|
||||
|
||||
group('ApprouverAdhesion', () {
|
||||
final approved = _makeAdhesion(statut: 'APPROUVEE');
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'approves adhesion and re-triggers LoadAdhesions',
|
||||
build: () {
|
||||
when(mockRepository.approuver(any, approuvePar: anyNamed('approuvePar')))
|
||||
.thenAnswer((_) async => approved);
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => [approved]);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(ApprouverAdhesion('adh1', approuvePar: 'admin1')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesionDetail?.statut, 'statut', 'APPROUVEE'),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on failure',
|
||||
build: () {
|
||||
when(mockRepository.approuver(any, approuvePar: anyNamed('approuvePar')))
|
||||
.thenThrow(Exception('approval failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(ApprouverAdhesion('adh1')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- RejeterAdhesion -----------------------------------------------------
|
||||
|
||||
group('RejeterAdhesion', () {
|
||||
final rejected = _makeAdhesion(statut: 'REJETEE');
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'rejects adhesion with motif and re-triggers LoadAdhesions',
|
||||
build: () {
|
||||
when(mockRepository.rejeter(any, any))
|
||||
.thenAnswer((_) async => rejected);
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => []);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(RejeterAdhesion('adh1', 'Dossier incomplet')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesionDetail?.statut, 'statut', 'REJETEE'),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on failure',
|
||||
build: () {
|
||||
when(mockRepository.rejeter(any, any))
|
||||
.thenThrow(Exception('rejection failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(RejeterAdhesion('adh1', 'motif')),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- EnregistrerPaiementAdhesion -----------------------------------------
|
||||
|
||||
group('EnregistrerPaiementAdhesion', () {
|
||||
final paid = _makeAdhesion(statut: 'PAYEE');
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'records payment then re-triggers LoadAdhesions',
|
||||
build: () {
|
||||
when(mockRepository.enregistrerPaiement(
|
||||
any,
|
||||
montantPaye: anyNamed('montantPaye'),
|
||||
methodePaiement: anyNamed('methodePaiement'),
|
||||
referencePaiement: anyNamed('referencePaiement'),
|
||||
)).thenAnswer((_) async => paid);
|
||||
when(mockRepository.getAll(
|
||||
page: anyNamed('page'), size: anyNamed('size')))
|
||||
.thenAnswer((_) async => [paid]);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(EnregistrerPaiementAdhesion(
|
||||
'adh1',
|
||||
montantPaye: 10000,
|
||||
methodePaiement: 'WAVE_MONEY',
|
||||
referencePaiement: 'REF-001',
|
||||
)),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded)
|
||||
.having((s) => s.adhesionDetail?.statut, 'statut', 'PAYEE'),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loaded),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on failure',
|
||||
build: () {
|
||||
when(mockRepository.enregistrerPaiement(
|
||||
any,
|
||||
montantPaye: anyNamed('montantPaye'),
|
||||
methodePaiement: anyNamed('methodePaiement'),
|
||||
referencePaiement: anyNamed('referencePaiement'),
|
||||
)).thenThrow(Exception('payment failed'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(EnregistrerPaiementAdhesion('adh1', montantPaye: 5000)),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.loading),
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
// ---- LoadAdhesionsStats --------------------------------------------------
|
||||
|
||||
group('LoadAdhesionsStats', () {
|
||||
final stats = {
|
||||
'total': 10,
|
||||
'enAttente': 3,
|
||||
'approuvees': 5,
|
||||
'rejetees': 2,
|
||||
};
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits state with stats populated on success',
|
||||
build: () {
|
||||
when(mockRepository.getStats()).thenAnswer((_) async => stats);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesionsStats()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.stats, 'stats', stats),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits state with null stats when repository returns null',
|
||||
build: () {
|
||||
when(mockRepository.getStats()).thenAnswer((_) async => null);
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesionsStats()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.stats, 'stats', isNull),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<AdhesionsBloc, AdhesionsState>(
|
||||
'emits error on failure',
|
||||
build: () {
|
||||
when(mockRepository.getStats())
|
||||
.thenThrow(Exception('stats error'));
|
||||
return buildBloc();
|
||||
},
|
||||
act: (b) => b.add(const LoadAdhesionsStats()),
|
||||
expect: () => [
|
||||
isA<AdhesionsState>()
|
||||
.having((s) => s.status, 'status', AdhesionsStatus.error),
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
212
test/features/adhesions/bloc/adhesions_bloc_test.mocks.dart
Normal file
212
test/features/adhesions/bloc/adhesions_bloc_test.mocks.dart
Normal file
@@ -0,0 +1,212 @@
|
||||
// Mocks generated by Mockito 5.4.6 from annotations
|
||||
// in unionflow_mobile_apps/test/features/adhesions/bloc/adhesions_bloc_test.dart.
|
||||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i4;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:unionflow_mobile_apps/features/adhesions/data/models/adhesion_model.dart'
|
||||
as _i2;
|
||||
import 'package:unionflow_mobile_apps/features/adhesions/data/repositories/adhesion_repository.dart'
|
||||
as _i3;
|
||||
|
||||
// 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 _FakeAdhesionModel_0 extends _i1.SmartFake implements _i2.AdhesionModel {
|
||||
_FakeAdhesionModel_0(Object parent, Invocation parentInvocation)
|
||||
: super(parent, parentInvocation);
|
||||
}
|
||||
|
||||
/// A class which mocks [AdhesionRepository].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockAdhesionRepository extends _i1.Mock
|
||||
implements _i3.AdhesionRepository {
|
||||
MockAdhesionRepository() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i4.Future<List<_i2.AdhesionModel>> getAll({int? page = 0, int? size = 20}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getAll, [], {#page: page, #size: size}),
|
||||
returnValue: _i4.Future<List<_i2.AdhesionModel>>.value(
|
||||
<_i2.AdhesionModel>[],
|
||||
),
|
||||
)
|
||||
as _i4.Future<List<_i2.AdhesionModel>>);
|
||||
|
||||
@override
|
||||
_i4.Future<_i2.AdhesionModel?> getById(String? id) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getById, [id]),
|
||||
returnValue: _i4.Future<_i2.AdhesionModel?>.value(),
|
||||
)
|
||||
as _i4.Future<_i2.AdhesionModel?>);
|
||||
|
||||
@override
|
||||
_i4.Future<_i2.AdhesionModel> create(_i2.AdhesionModel? adhesion) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#create, [adhesion]),
|
||||
returnValue: _i4.Future<_i2.AdhesionModel>.value(
|
||||
_FakeAdhesionModel_0(
|
||||
this,
|
||||
Invocation.method(#create, [adhesion]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i4.Future<_i2.AdhesionModel>);
|
||||
|
||||
@override
|
||||
_i4.Future<_i2.AdhesionModel> approuver(String? id, {String? approuvePar}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#approuver, [id], {#approuvePar: approuvePar}),
|
||||
returnValue: _i4.Future<_i2.AdhesionModel>.value(
|
||||
_FakeAdhesionModel_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#approuver,
|
||||
[id],
|
||||
{#approuvePar: approuvePar},
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i4.Future<_i2.AdhesionModel>);
|
||||
|
||||
@override
|
||||
_i4.Future<_i2.AdhesionModel> rejeter(String? id, String? motifRejet) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#rejeter, [id, motifRejet]),
|
||||
returnValue: _i4.Future<_i2.AdhesionModel>.value(
|
||||
_FakeAdhesionModel_0(
|
||||
this,
|
||||
Invocation.method(#rejeter, [id, motifRejet]),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i4.Future<_i2.AdhesionModel>);
|
||||
|
||||
@override
|
||||
_i4.Future<_i2.AdhesionModel> enregistrerPaiement(
|
||||
String? id, {
|
||||
required double? montantPaye,
|
||||
String? methodePaiement,
|
||||
String? referencePaiement,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#enregistrerPaiement,
|
||||
[id],
|
||||
{
|
||||
#montantPaye: montantPaye,
|
||||
#methodePaiement: methodePaiement,
|
||||
#referencePaiement: referencePaiement,
|
||||
},
|
||||
),
|
||||
returnValue: _i4.Future<_i2.AdhesionModel>.value(
|
||||
_FakeAdhesionModel_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#enregistrerPaiement,
|
||||
[id],
|
||||
{
|
||||
#montantPaye: montantPaye,
|
||||
#methodePaiement: methodePaiement,
|
||||
#referencePaiement: referencePaiement,
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
as _i4.Future<_i2.AdhesionModel>);
|
||||
|
||||
@override
|
||||
_i4.Future<List<_i2.AdhesionModel>> getByMembre(
|
||||
String? membreId, {
|
||||
int? page = 0,
|
||||
int? size = 20,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getByMembre,
|
||||
[membreId],
|
||||
{#page: page, #size: size},
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.AdhesionModel>>.value(
|
||||
<_i2.AdhesionModel>[],
|
||||
),
|
||||
)
|
||||
as _i4.Future<List<_i2.AdhesionModel>>);
|
||||
|
||||
@override
|
||||
_i4.Future<List<_i2.AdhesionModel>> getByOrganisation(
|
||||
String? organisationId, {
|
||||
int? page = 0,
|
||||
int? size = 20,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getByOrganisation,
|
||||
[organisationId],
|
||||
{#page: page, #size: size},
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.AdhesionModel>>.value(
|
||||
<_i2.AdhesionModel>[],
|
||||
),
|
||||
)
|
||||
as _i4.Future<List<_i2.AdhesionModel>>);
|
||||
|
||||
@override
|
||||
_i4.Future<List<_i2.AdhesionModel>> getByStatut(
|
||||
String? statut, {
|
||||
int? page = 0,
|
||||
int? size = 20,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getByStatut,
|
||||
[statut],
|
||||
{#page: page, #size: size},
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.AdhesionModel>>.value(
|
||||
<_i2.AdhesionModel>[],
|
||||
),
|
||||
)
|
||||
as _i4.Future<List<_i2.AdhesionModel>>);
|
||||
|
||||
@override
|
||||
_i4.Future<List<_i2.AdhesionModel>> getEnAttente({
|
||||
int? page = 0,
|
||||
int? size = 20,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getEnAttente, [], {#page: page, #size: size}),
|
||||
returnValue: _i4.Future<List<_i2.AdhesionModel>>.value(
|
||||
<_i2.AdhesionModel>[],
|
||||
),
|
||||
)
|
||||
as _i4.Future<List<_i2.AdhesionModel>>);
|
||||
|
||||
@override
|
||||
_i4.Future<Map<String, dynamic>?> getStats() =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(#getStats, []),
|
||||
returnValue: _i4.Future<Map<String, dynamic>?>.value(),
|
||||
)
|
||||
as _i4.Future<Map<String, dynamic>?>);
|
||||
}
|
||||
Reference in New Issue
Block a user