From 6c3a72f7f8be63e36ecbc2d75bacb387120158a6 Mon Sep 17 00:00:00 2001 From: Pratik-canopas Date: Mon, 31 Jul 2023 11:00:24 +0530 Subject: [PATCH] Add pagination in user leave, refactor test --- lib/data/Repo/leave_repo.dart | 25 +++--- lib/data/services/leave_service.dart | 11 +++ .../home/home_screen/admin_home_screen.dart | 2 +- .../admin_employee_details_leave_bloc.dart | 2 +- .../bloc/who_is_out_card_bloc.dart | 83 ++++++++++--------- .../bloc/who_is_out_card_event.dart | 31 ++++--- .../bloc/who_is_out_card_state.dart | 4 +- .../who_is_out_card/who_is_out_card.dart | 13 +-- .../home/home_screen/user_home_screen.dart | 2 +- .../bloc/leaves/user_leave_bloc.dart | 59 ++++++------- .../bloc/leaves/user_leave_event.dart | 20 ++++- .../leaves_screen/user_leave_screen.dart | 3 +- .../leaves_screen/widget/year_selection.dart | 12 +-- .../admin_home_bloc_test.mocks.dart | 13 ++- ...leave_request_details_bloc_test.mocks.dart | 18 ++++ .../leave_screen/admin_leaves_test.mocks.dart | 13 ++- .../employee_detail_bloc_test.mocks.dart | 18 ++++ .../admin_employee_details_leaves_test.dart | 7 +- ...in_employee_details_leaves_test.mocks.dart | 13 ++- .../who_is_out_card/who_is_out_card_test.dart | 43 +++++++--- .../who_is_out_card_test.mocks.dart | 13 ++- .../home_screen/user_home_test.mocks.dart | 13 ++- .../apply_leave_bloc_test.mocks.dart | 18 ++++ .../user_leave_detail_bloc_test.mocks.dart | 18 ++++ .../user_leave_count_bloc_test.mocks.dart | 18 ++++ .../bloc/leaves/user_leave_bloc_test.dart | 31 ++++--- .../leaves/user_leave_bloc_test.mocks.dart | 13 ++- .../user_employee_detail_bloc_test.mocks.dart | 18 ++++ 28 files changed, 370 insertions(+), 164 deletions(-) diff --git a/lib/data/Repo/leave_repo.dart b/lib/data/Repo/leave_repo.dart index ccede35fe..cd06db186 100644 --- a/lib/data/Repo/leave_repo.dart +++ b/lib/data/Repo/leave_repo.dart @@ -47,19 +47,24 @@ class LeaveRepo { status: LeaveStatus.pending, spaceId: _userStateNotifier.currentSpaceId!); - Stream> userLeaves(String uid) => _leavesController.stream - .asyncMap((leaves) => leaves.where((leave) => leave.uid == uid).toList()); + Stream> userLeavesByYear(String uid, int year) => + _leaveService.userYearlyLeave( + uid: uid, year: year, spaceId: _userStateNotifier.currentSpaceId!); Stream> leaveByMonth(DateTime date) => Rx.combineLatest2, List, List>( - _leaveService.monthlyLeaveByStartDate( - year: date.year, - month: date.month, - spaceId: _userStateNotifier.currentSpaceId!).distinct(), - _leaveService.monthlyLeaveByEndDate( - year: date.year, - month: date.month, - spaceId: _userStateNotifier.currentSpaceId!).distinct(), + _leaveService + .monthlyLeaveByStartDate( + year: date.year, + month: date.month, + spaceId: _userStateNotifier.currentSpaceId!) + .distinct(), + _leaveService + .monthlyLeaveByEndDate( + year: date.year, + month: date.month, + spaceId: _userStateNotifier.currentSpaceId!) + .distinct(), (leavesByStartDate, leavesByEndDate) { List mergedList = leavesByStartDate; mergedList.addAll(leavesByEndDate.where((endDateLeave) => diff --git a/lib/data/services/leave_service.dart b/lib/data/services/leave_service.dart index 8b25abf88..76ee01e89 100644 --- a/lib/data/services/leave_service.dart +++ b/lib/data/services/leave_service.dart @@ -56,6 +56,17 @@ class LeaveService { .where((leave) => leave.startDate.isBefore(DateTime(year, month))) .toList()); + Stream> userYearlyLeave( + {required String uid, required int year, required String spaceId}) => + _leaveDb(spaceId: _userManager.currentSpaceId!) + .where(FireStoreConst.uid, isEqualTo: uid) + .where(FireStoreConst.startLeaveDate, + isGreaterThanOrEqualTo: DateTime(year).timeStampToInt) + .where(FireStoreConst.startLeaveDate, + isLessThanOrEqualTo: DateTime(year, 12, 31).timeStampToInt) + .snapshots() + .map((event) => event.docs.map((leave) => leave.data()).toList()); + Stream> userLeaveByStatus( {required String uid, required LeaveStatus status, diff --git a/lib/ui/admin/home/home_screen/admin_home_screen.dart b/lib/ui/admin/home/home_screen/admin_home_screen.dart index 2791ea959..6bb20d9f1 100644 --- a/lib/ui/admin/home/home_screen/admin_home_screen.dart +++ b/lib/ui/admin/home/home_screen/admin_home_screen.dart @@ -27,7 +27,7 @@ class AdminHomeScreenPage extends StatelessWidget { BlocProvider( create: (context) => getIt.get()..add(AdminHomeInitialLoadEvent()), ), - BlocProvider(create: (context) => getIt()..add(WhoIsOutInitialLoadEvent())), + BlocProvider(create: (context) => getIt()..add(FetchWhoIsOutCardLeaves())), ], child: const AdminHomeScreen(), ); diff --git a/lib/ui/admin/members/details_leaves/bloc/admin_employee_details_leave_bloc.dart b/lib/ui/admin/members/details_leaves/bloc/admin_employee_details_leave_bloc.dart index c6b291a1a..8e50f2946 100644 --- a/lib/ui/admin/members/details_leaves/bloc/admin_employee_details_leave_bloc.dart +++ b/lib/ui/admin/members/details_leaves/bloc/admin_employee_details_leave_bloc.dart @@ -22,7 +22,7 @@ class AdminEmployeeDetailsLeavesBLoc extends Bloc< emit(state.copyWith(status: Status.loading)); try { return emit.forEach( - _leaveRepo.userLeaves(event.employeeId), + _leaveRepo.userLeavesByYear(event.employeeId, DateTime.now().year), onData: (List data) { final userLeaves = data.toList(); userLeaves.sort((a, b) => b.startDate.compareTo(a.startDate)); diff --git a/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_bloc.dart b/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_bloc.dart index 4be4a4c6d..765f5412b 100644 --- a/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_bloc.dart +++ b/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_bloc.dart @@ -17,6 +17,7 @@ import 'who_is_out_card_state.dart'; class WhoIsOutCardBloc extends Bloc { final EmployeeRepo _employeeRepo; final LeaveRepo _leaveRepo; + StreamSubscription? _subscription; WhoIsOutCardBloc( this._employeeRepo, @@ -24,52 +25,33 @@ class WhoIsOutCardBloc extends Bloc { ) : super(WhoIsOutCardState( selectedDate: DateTime.now().dateOnly, focusDay: DateTime.now().dateOnly)) { - on(initialLoad); + on(_fetchWhoIsOutCardLeaves); on(_changeCalendarDate); on(_changeCalendarFormat); - on(_fetchMoreLeavesEvent); + on(_showCalendarData); + on(_showCalendarError); } - FutureOr initialLoad( - WhoIsOutInitialLoadEvent event, Emitter emit) async { - emit(state.copyWith(status: Status.loading)); - try { - return emit.forEach( - getLeaveApplicationStream( - leaveStream: _leaveRepo.leaveByMonth(state.focusDay), - membersStream: _employeeRepo.employees), - onData: (List leaveApplications) => state.copyWith( - allAbsences: leaveApplications, - status: Status.success, - selectedDayAbsences: getSelectedDateAbsences( - date: state.selectedDate, allAbsences: leaveApplications)), - onError: (error, stackTrace) => state.copyWith( - status: Status.error, error: firestoreFetchDataError)); - } on Exception { - emit( - state.copyWith(status: Status.error, error: firestoreFetchDataError)); - } - } - - FutureOr _fetchMoreLeavesEvent( - FetchMoreLeaves event, Emitter emit) async { + FutureOr _fetchWhoIsOutCardLeaves( + FetchWhoIsOutCardLeaves event, Emitter emit) async { + emit(state.copyWith( + status: state.selectedDayAbsences == null ? Status.loading : null, + focusDay: event.focusDay)); try { - return emit.forEach( - getLeaveApplicationStream( - leaveStream: _leaveRepo.leaveByMonth(event.date), - membersStream: _employeeRepo.employees), - onData: (List leaveApplications) => state.copyWith( - allAbsences: leaveApplications, focusDay: event.date), - onError: (error, stackTrace) => state.copyWith( - status: Status.error, - error: firestoreFetchDataError, - focusDay: event.date), - ); + if (_subscription != null) { + await _subscription?.cancel(); + } + _subscription = getLeaveApplicationStream( + leaveStream: + _leaveRepo.leaveByMonth(event.focusDay ?? state.focusDay), + membersStream: _employeeRepo.employees) + .listen((List leaveApplications) { + add(ShowCalendarData(leaveApplications)); + }, onError: (error, _) { + add(ShowCalendarError()); + }); } on Exception { - emit(state.copyWith( - status: Status.error, - error: firestoreFetchDataError, - focusDay: event.date)); + add(ShowCalendarError()); } } @@ -86,6 +68,21 @@ class WhoIsOutCardBloc extends Bloc { emit(state.copyWith(calendarFormat: event.calendarFormat)); } + void _showCalendarData( + ShowCalendarData event, Emitter emit) async { + emit(state.copyWith( + status: Status.success, + allAbsences: event.allAbsence, + selectedDayAbsences: state.selectedDayAbsences ?? + getSelectedDateAbsences( + date: state.selectedDate, allAbsences: event.allAbsence))); + } + + void _showCalendarError( + ShowCalendarError event, Emitter emit) async { + emit(state.copyWith(status: Status.error, error: firestoreFetchDataError)); + } + List getSelectedDateAbsences( {required DateTime date, required List allAbsences}) { return allAbsences @@ -95,4 +92,10 @@ class WhoIsOutCardBloc extends Bloc { LeaveDayDuration.noLeave) .toList(); } + + @override + Future close() async { + await _subscription?.cancel(); + return super.close(); + } } diff --git a/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_event.dart b/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_event.dart index 23a05819b..505b8493f 100644 --- a/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_event.dart +++ b/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_event.dart @@ -1,9 +1,29 @@ import 'package:equatable/equatable.dart'; import 'package:table_calendar/table_calendar.dart'; +import '../../../../data/model/leave_application.dart'; + abstract class WhoIsOutEvent extends Equatable {} -class WhoIsOutInitialLoadEvent extends WhoIsOutEvent { +class FetchWhoIsOutCardLeaves extends WhoIsOutEvent { + final DateTime? focusDay; + + FetchWhoIsOutCardLeaves({this.focusDay}); + + @override + List get props => [focusDay]; +} + +class ShowCalendarData extends WhoIsOutEvent { + final List allAbsence; + + ShowCalendarData( this.allAbsence); + + @override + List get props => [allAbsence]; +} + +class ShowCalendarError extends WhoIsOutEvent { @override List get props => []; } @@ -25,12 +45,3 @@ class ChangeCalendarDate extends WhoIsOutEvent { @override List get props => [date]; } - -class FetchMoreLeaves extends WhoIsOutEvent { - final DateTime date; - - FetchMoreLeaves(this.date); - - @override - List get props => [date]; -} diff --git a/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_state.dart b/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_state.dart index 516e3226c..52eb959aa 100644 --- a/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_state.dart +++ b/lib/ui/shared/who_is_out_card/bloc/who_is_out_card_state.dart @@ -9,7 +9,7 @@ class WhoIsOutCardState extends Equatable { final DateTime focusDay; final CalendarFormat calendarFormat; final List allAbsences; - final List selectedDayAbsences; + final List? selectedDayAbsences; final String? error; const WhoIsOutCardState( @@ -18,7 +18,7 @@ class WhoIsOutCardState extends Equatable { required this.focusDay, this.status = Status.initial, this.allAbsences = const [], - this.selectedDayAbsences = const [], + this.selectedDayAbsences, this.error}); WhoIsOutCardState copyWith( diff --git a/lib/ui/shared/who_is_out_card/who_is_out_card.dart b/lib/ui/shared/who_is_out_card/who_is_out_card.dart index 8518e90a5..233bd9608 100644 --- a/lib/ui/shared/who_is_out_card/who_is_out_card.dart +++ b/lib/ui/shared/who_is_out_card/who_is_out_card.dart @@ -19,7 +19,8 @@ class WhoIsOutCard extends StatelessWidget { @override Widget build(BuildContext context) { return BlocListener( - listenWhen: (previous, current) => current.status == Status.error && current.error != null, + listenWhen: (previous, current) => + current.status == Status.error && current.error != null, listener: (context, state) { if (state.status == Status.error && state.error != null) { showSnackBar(context: context, error: state.error); @@ -58,7 +59,7 @@ class WhoIsOutCard extends StatelessWidget { builder: (context, state) => AbsenceEmployeesListWhoIsOutCardView( status: state.status, - absence: state.selectedDayAbsences, + absence: state.selectedDayAbsences ?? [], dateOfEmployeeAbsence: state.selectedDate, ), ), @@ -91,7 +92,7 @@ class _LeaveCalendarState extends State { rangeSelectionMode: RangeSelectionMode.disabled, onPageChanged: (focusedDay) => context .read() - .add(FetchMoreLeaves(focusedDay)), + .add(FetchWhoIsOutCardLeaves(focusDay: focusedDay)), onDaySelected: (selectedDay, focusedDay) { context .read() @@ -112,7 +113,8 @@ class _LeaveCalendarState extends State { leftChevronMargin: EdgeInsets.zero, leftChevronPadding: EdgeInsets.zero, leftChevronIcon: SizedBox(), - headerPadding: EdgeInsets.symmetric(vertical: 10,horizontal: 8), + headerPadding: + EdgeInsets.symmetric(vertical: 10, horizontal: 8), rightChevronMargin: EdgeInsets.zero, rightChevronPadding: EdgeInsets.zero, titleCentered: true, @@ -121,7 +123,8 @@ class _LeaveCalendarState extends State { titleTextStyle: AppFontStyle.labelRegular), eventLoader: (day) => context .read() - .getSelectedDateAbsences(date: day, allAbsences: state.allAbsences), + .getSelectedDateAbsences( + date: day, allAbsences: state.allAbsences), focusedDay: state.focusDay, ); }); diff --git a/lib/ui/user/home/home_screen/user_home_screen.dart b/lib/ui/user/home/home_screen/user_home_screen.dart index 12849c580..873b1f854 100644 --- a/lib/ui/user/home/home_screen/user_home_screen.dart +++ b/lib/ui/user/home/home_screen/user_home_screen.dart @@ -30,7 +30,7 @@ class UserHomeScreenPage extends StatelessWidget { ), BlocProvider( create: (_) => - getIt()..add(WhoIsOutInitialLoadEvent())), + getIt()..add(FetchWhoIsOutCardLeaves())), ], child: const UserHomeScreen(), ); diff --git a/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc.dart b/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc.dart index af1fe901e..8e90d9abe 100644 --- a/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc.dart +++ b/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'package:collection/collection.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; import 'package:projectunity/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_event.dart'; @@ -11,56 +10,48 @@ import '../../../../../../data/model/leave/leave.dart'; import '../../../../../../data/provider/user_state.dart'; @Injectable() -class UserLeaveBloc extends Bloc { +class UserLeaveBloc extends Bloc { final LeaveRepo _leaveRepo; final UserStateNotifier _userManager; - late List _allLeaves = []; + StreamSubscription? _subscription; UserLeaveBloc(this._userManager, this._leaveRepo) : super(UserLeaveState()) { - on(_fetchLeaves); - on(_showLeaveByYear); + on(_listenLeaves); + on(_showLeaves); + on(_showError); } - Future _fetchLeaves( - FetchUserLeaveEvent event, Emitter emit) async { - emit(state.copyWith(status: Status.loading)); + Future _listenLeaves( + ListenUserLeaves event, Emitter emit) async { + emit(state.copyWith(status: Status.loading, selectedYear: event.year)); try { - return emit.forEach(_leaveRepo.userLeaves(_userManager.employeeId), - onData: (List leaves) { - _allLeaves = leaves.toList(); - return state.copyWith( - status: Status.success, - leaves: - _getSelectedYearLeaveWithSortByDate(state.selectedYear)); - }, - onError: (error, _) => state.copyWith( - status: Status.error, error: firestoreFetchDataError)); + if (_subscription != null) { + await _subscription?.cancel(); + } + _subscription = _leaveRepo + .userLeavesByYear(_userManager.employeeId, event.year) + .listen((List leaves) { + add(ShowUserLeaves(leaves)); + }, onError: (error, _) { + add(const ShowError()); + }); } on Exception { - emit( - state.copyWith(status: Status.error, error: firestoreFetchDataError)); + add(const ShowError()); } } - List _getSelectedYearLeaveWithSortByDate(int year) { - final List leaves = _allLeaves - .where((leave) => - leave.startDate.year == year || leave.endDate.year == year) - .whereNotNull() - .toList(); - leaves.sort((a, b) => b.startDate.compareTo(a.startDate)); - return leaves; + void _showLeaves(ShowUserLeaves event, Emitter emit) { + event.leaves.sort((a, b) => b.startDate.compareTo(a.startDate)); + emit(state.copyWith(status: Status.success, leaves: event.leaves)); } - Future _showLeaveByYear( - ChangeYearEvent event, Emitter emit) async { - emit(state.copyWith( - leaves: _getSelectedYearLeaveWithSortByDate(event.year), - selectedYear: event.year)); + void _showError(ShowError event, Emitter emit) { + emit(state.copyWith(status: Status.error, error: firestoreFetchDataError)); } @override Future close() async { - _allLeaves.clear(); + await _subscription?.cancel(); return super.close(); } } diff --git a/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_event.dart b/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_event.dart index d0e7f3958..830a70340 100644 --- a/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_event.dart +++ b/lib/ui/user/leaves/leaves_screen/bloc/leaves/user_leave_event.dart @@ -1,9 +1,21 @@ -abstract class UserLeaveEvents {} +import '../../../../../../data/model/leave/leave.dart'; -class FetchUserLeaveEvent extends UserLeaveEvents {} +abstract class UserLeavesEvents { + const UserLeavesEvents(); +} -class ChangeYearEvent extends UserLeaveEvents { +class ListenUserLeaves extends UserLeavesEvents { final int year; - ChangeYearEvent({required this.year}); + const ListenUserLeaves({required this.year}); +} + +class ShowUserLeaves extends UserLeavesEvents { + final List leaves; + + const ShowUserLeaves(this.leaves); +} + +class ShowError extends UserLeavesEvents { + const ShowError(); } diff --git a/lib/ui/user/leaves/leaves_screen/user_leave_screen.dart b/lib/ui/user/leaves/leaves_screen/user_leave_screen.dart index 41b243491..de26b7a6e 100644 --- a/lib/ui/user/leaves/leaves_screen/user_leave_screen.dart +++ b/lib/ui/user/leaves/leaves_screen/user_leave_screen.dart @@ -24,7 +24,8 @@ class UserLeavePage extends StatelessWidget { create: (_) => getIt()..add(FetchLeaveCountEvent())), BlocProvider( - create: (_) => getIt()..add(FetchUserLeaveEvent())) + create: (_) => getIt() + ..add(ListenUserLeaves(year: DateTime.now().year))) ], child: const UserLeaveScreen()); } } diff --git a/lib/ui/user/leaves/leaves_screen/widget/year_selection.dart b/lib/ui/user/leaves/leaves_screen/widget/year_selection.dart index 7532bd69c..842925efc 100644 --- a/lib/ui/user/leaves/leaves_screen/widget/year_selection.dart +++ b/lib/ui/user/leaves/leaves_screen/widget/year_selection.dart @@ -54,8 +54,7 @@ class YearSelection extends StatelessWidget { alignment: Alignment.center, items: List.generate( DateTime.now().year - (dateOfJoining.year - 1), - (change) => - dateOfJoining.year + change).map((year) { + (change) => dateOfJoining.year + change).map((year) { return DropdownMenuItem( alignment: Alignment.center, value: year, @@ -63,9 +62,12 @@ class YearSelection extends StatelessWidget { ); }).toList(), value: state.selectedYear, - onChanged: (int? value) { - context.read().add( - ChangeYearEvent(year: value ?? state.selectedYear)); + onChanged: (int? year) { + if (year != null) { + context + .read() + .add(ListenUserLeaves(year: year)); + } }, ), ), diff --git a/test/unit_test/admin/home/home_screen/admin_home_bloc_test.mocks.dart b/test/unit_test/admin/home/home_screen/admin_home_bloc_test.mocks.dart index b2a4f97ca..399db1266 100644 --- a/test/unit_test/admin/home/home_screen/admin_home_bloc_test.mocks.dart +++ b/test/unit_test/admin/home/home_screen/admin_home_bloc_test.mocks.dart @@ -105,10 +105,17 @@ class MockLeaveRepo extends _i1.Mock implements _i5.LeaveRepo { returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); @override - _i3.Stream> userLeaves(String? uid) => (super.noSuchMethod( + _i3.Stream> userLeavesByYear( + String? uid, + int? year, + ) => + (super.noSuchMethod( Invocation.method( - #userLeaves, - [uid], + #userLeavesByYear, + [ + uid, + year, + ], ), returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); diff --git a/test/unit_test/admin/leaves/application_detail/admin_leave_request_details_bloc_test.mocks.dart b/test/unit_test/admin/leaves/application_detail/admin_leave_request_details_bloc_test.mocks.dart index 2672b2af4..9820dafea 100644 --- a/test/unit_test/admin/leaves/application_detail/admin_leave_request_details_bloc_test.mocks.dart +++ b/test/unit_test/admin/leaves/application_detail/admin_leave_request_details_bloc_test.mocks.dart @@ -116,6 +116,24 @@ class MockLeaveService extends _i1.Mock implements _i4.LeaveService { returnValue: _i5.Stream>.empty(), ) as _i5.Stream>); @override + _i5.Stream> userYearlyLeave({ + required String? uid, + required int? year, + required String? spaceId, + }) => + (super.noSuchMethod( + Invocation.method( + #userYearlyLeave, + [], + { + #uid: uid, + #year: year, + #spaceId: spaceId, + }, + ), + returnValue: _i5.Stream>.empty(), + ) as _i5.Stream>); + @override _i5.Stream> userLeaveByStatus({ required String? uid, required _i6.LeaveStatus? status, diff --git a/test/unit_test/admin/leaves/leave_screen/admin_leaves_test.mocks.dart b/test/unit_test/admin/leaves/leave_screen/admin_leaves_test.mocks.dart index 50631e651..464fdf72c 100644 --- a/test/unit_test/admin/leaves/leave_screen/admin_leaves_test.mocks.dart +++ b/test/unit_test/admin/leaves/leave_screen/admin_leaves_test.mocks.dart @@ -105,10 +105,17 @@ class MockLeaveRepo extends _i1.Mock implements _i5.LeaveRepo { returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); @override - _i3.Stream> userLeaves(String? uid) => (super.noSuchMethod( + _i3.Stream> userLeavesByYear( + String? uid, + int? year, + ) => + (super.noSuchMethod( Invocation.method( - #userLeaves, - [uid], + #userLeavesByYear, + [ + uid, + year, + ], ), returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); diff --git a/test/unit_test/admin/member/detail/employee_detail_bloc_test.mocks.dart b/test/unit_test/admin/member/detail/employee_detail_bloc_test.mocks.dart index 1fd0427b2..8b5958898 100644 --- a/test/unit_test/admin/member/detail/employee_detail_bloc_test.mocks.dart +++ b/test/unit_test/admin/member/detail/employee_detail_bloc_test.mocks.dart @@ -353,6 +353,24 @@ class MockLeaveService extends _i1.Mock implements _i10.LeaveService { returnValue: _i7.Stream>.empty(), ) as _i7.Stream>); @override + _i7.Stream> userYearlyLeave({ + required String? uid, + required int? year, + required String? spaceId, + }) => + (super.noSuchMethod( + Invocation.method( + #userYearlyLeave, + [], + { + #uid: uid, + #year: year, + #spaceId: spaceId, + }, + ), + returnValue: _i7.Stream>.empty(), + ) as _i7.Stream>); + @override _i7.Stream> userLeaveByStatus({ required String? uid, required _i11.LeaveStatus? status, diff --git a/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.dart b/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.dart index e2a868835..b82326810 100644 --- a/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.dart +++ b/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.dart @@ -41,7 +41,7 @@ void main() { group('Admin Employee Details Leaves Test', () { test('data fetch success on init test', () { - when(leaveRepo.userLeaves(leave.uid)) + when(leaveRepo.userLeavesByYear(leave.uid, DateTime.now().year)) .thenAnswer((_) => Stream.value([leave])); bloc.add(InitEvents(employeeId: leave.uid)); @@ -55,7 +55,7 @@ void main() { }); test('data fetch failure by stream error', () { - when(leaveRepo.userLeaves(leave.uid)) + when(leaveRepo.userLeavesByYear(leave.uid, DateTime.now().year)) .thenAnswer((_) => Stream.error(firestoreFetchDataError)); bloc.add(InitEvents(employeeId: leave.uid)); expect( @@ -68,7 +68,8 @@ void main() { }); test('data fetch failure by exception', () { - when(leaveRepo.userLeaves(leave.uid)).thenThrow(Exception('error')); + when(leaveRepo.userLeavesByYear(leave.uid, DateTime.now().year)) + .thenThrow(Exception('error')); bloc.add(InitEvents(employeeId: leave.uid)); expect( bloc.stream, diff --git a/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.mocks.dart b/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.mocks.dart index 2874e0ad7..edad28067 100644 --- a/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.mocks.dart +++ b/test/unit_test/admin/member/employee_leaves/admin_employee_details_leaves_test.mocks.dart @@ -57,10 +57,17 @@ class MockLeaveRepo extends _i1.Mock implements _i2.LeaveRepo { returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); @override - _i3.Stream> userLeaves(String? uid) => (super.noSuchMethod( + _i3.Stream> userLeavesByYear( + String? uid, + int? year, + ) => + (super.noSuchMethod( Invocation.method( - #userLeaves, - [uid], + #userLeavesByYear, + [ + uid, + year, + ], ), returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); diff --git a/test/unit_test/shared/who_is_out_card/who_is_out_card_test.dart b/test/unit_test/shared/who_is_out_card/who_is_out_card_test.dart index b9269a361..9e3df6667 100644 --- a/test/unit_test/shared/who_is_out_card/who_is_out_card_test.dart +++ b/test/unit_test/shared/who_is_out_card/who_is_out_card_test.dart @@ -63,7 +63,7 @@ void main() { when(employeeRepo.employees).thenAnswer((_) => Stream.value([employee])); when(leaveRepo.leaveByMonth(focusDay)) .thenAnswer((_) => Stream.value([leave])); - bLoc.add(WhoIsOutInitialLoadEvent()); + bLoc.add(FetchWhoIsOutCardLeaves()); expect( bLoc.stream, @@ -88,7 +88,7 @@ void main() { test("Fetch initial month leaves failure state if exception thrown", () { when(employeeRepo.employees).thenAnswer((_) => Stream.value([employee])); when(leaveRepo.leaveByMonth(selectedDate)).thenThrow(Exception("error")); - bLoc.add(WhoIsOutInitialLoadEvent()); + bLoc.add(FetchWhoIsOutCardLeaves()); expect( bLoc.stream, @@ -110,7 +110,7 @@ void main() { when(employeeRepo.employees).thenAnswer((_) => Stream.value([employee])); when(leaveRepo.leaveByMonth(selectedDate)) .thenAnswer((_) => Stream.error(firestoreFetchDataError)); - bLoc.add(WhoIsOutInitialLoadEvent()); + bLoc.add(FetchWhoIsOutCardLeaves()); expect( bLoc.stream, @@ -131,16 +131,25 @@ void main() { when(employeeRepo.employees).thenAnswer((_) => Stream.value([employee])); when(leaveRepo.leaveByMonth(DateTime(focusDay.year, focusDay.month + 1))) .thenAnswer((_) => Stream.value([leave])); - bLoc.add(FetchMoreLeaves(DateTime(focusDay.year, focusDay.month + 1))); + bLoc.add(FetchWhoIsOutCardLeaves( + focusDay: DateTime(focusDay.year, focusDay.month + 1))); expect( bLoc.stream, - emits( + emitsInOrder([ + WhoIsOutCardState( + selectedDate: selectedDate, + focusDay: DateTime(focusDay.year, focusDay.month + 1), + status: Status.loading), WhoIsOutCardState( + status: Status.success, selectedDate: selectedDate, focusDay: DateTime(focusDay.year, focusDay.month + 1), allAbsences: [LeaveApplication(employee: employee, leave: leave)], + selectedDayAbsences: [ + LeaveApplication(employee: employee, leave: leave) + ], ), - )); + ])); }); test( @@ -149,16 +158,21 @@ void main() { when(employeeRepo.employees).thenAnswer((_) => Stream.value([employee])); when(leaveRepo.leaveByMonth(DateTime(focusDay.year, focusDay.month + 1))) .thenAnswer((_) => Stream.error(firestoreFetchDataError)); - bLoc.add(FetchMoreLeaves(DateTime(focusDay.year, focusDay.month + 1))); + bLoc.add(FetchWhoIsOutCardLeaves( + focusDay: DateTime(focusDay.year, focusDay.month + 1))); expect( bLoc.stream, - emits( + emitsInOrder([ + WhoIsOutCardState( + selectedDate: selectedDate, + focusDay: DateTime(focusDay.year, focusDay.month + 1), + status: Status.loading), WhoIsOutCardState( selectedDate: selectedDate, focusDay: DateTime(focusDay.year, focusDay.month + 1), error: firestoreFetchDataError, status: Status.error), - )); + ])); }); test( @@ -167,16 +181,21 @@ void main() { when(employeeRepo.employees).thenAnswer((_) => Stream.value([employee])); when(leaveRepo.leaveByMonth(DateTime(focusDay.year, focusDay.month + 1))) .thenAnswer((_) => Stream.error(firestoreFetchDataError)); - bLoc.add(FetchMoreLeaves(DateTime(focusDay.year, focusDay.month + 1))); + bLoc.add(FetchWhoIsOutCardLeaves( + focusDay: DateTime(focusDay.year, focusDay.month + 1))); expect( bLoc.stream, - emits( + emitsInOrder([ + WhoIsOutCardState( + selectedDate: selectedDate, + focusDay: DateTime(focusDay.year, focusDay.month + 1), + status: Status.loading), WhoIsOutCardState( selectedDate: selectedDate, focusDay: DateTime(focusDay.year, focusDay.month + 1), error: firestoreFetchDataError, status: Status.error), - )); + ])); }); test("Change Calendar format test", () { diff --git a/test/unit_test/shared/who_is_out_card/who_is_out_card_test.mocks.dart b/test/unit_test/shared/who_is_out_card/who_is_out_card_test.mocks.dart index 483beebde..6340d4063 100644 --- a/test/unit_test/shared/who_is_out_card/who_is_out_card_test.mocks.dart +++ b/test/unit_test/shared/who_is_out_card/who_is_out_card_test.mocks.dart @@ -59,10 +59,17 @@ class MockLeaveRepo extends _i1.Mock implements _i2.LeaveRepo { returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); @override - _i3.Stream> userLeaves(String? uid) => (super.noSuchMethod( + _i3.Stream> userLeavesByYear( + String? uid, + int? year, + ) => + (super.noSuchMethod( Invocation.method( - #userLeaves, - [uid], + #userLeavesByYear, + [ + uid, + year, + ], ), returnValue: _i3.Stream>.empty(), ) as _i3.Stream>); diff --git a/test/unit_test/user/home/home_screen/user_home_test.mocks.dart b/test/unit_test/user/home/home_screen/user_home_test.mocks.dart index 064e9c612..3452bc3ba 100644 --- a/test/unit_test/user/home/home_screen/user_home_test.mocks.dart +++ b/test/unit_test/user/home/home_screen/user_home_test.mocks.dart @@ -234,10 +234,17 @@ class MockLeaveRepo extends _i1.Mock implements _i8.LeaveRepo { returnValue: _i4.Stream>.empty(), ) as _i4.Stream>); @override - _i4.Stream> userLeaves(String? uid) => (super.noSuchMethod( + _i4.Stream> userLeavesByYear( + String? uid, + int? year, + ) => + (super.noSuchMethod( Invocation.method( - #userLeaves, - [uid], + #userLeavesByYear, + [ + uid, + year, + ], ), returnValue: _i4.Stream>.empty(), ) as _i4.Stream>); diff --git a/test/unit_test/user/leaves/apply_leave/apply_leave_bloc_test.mocks.dart b/test/unit_test/user/leaves/apply_leave/apply_leave_bloc_test.mocks.dart index 4b3c3e73d..6f93e33f7 100644 --- a/test/unit_test/user/leaves/apply_leave/apply_leave_bloc_test.mocks.dart +++ b/test/unit_test/user/leaves/apply_leave/apply_leave_bloc_test.mocks.dart @@ -115,6 +115,24 @@ class MockLeaveService extends _i1.Mock implements _i4.LeaveService { returnValue: _i5.Stream>.empty(), ) as _i5.Stream>); @override + _i5.Stream> userYearlyLeave({ + required String? uid, + required int? year, + required String? spaceId, + }) => + (super.noSuchMethod( + Invocation.method( + #userYearlyLeave, + [], + { + #uid: uid, + #year: year, + #spaceId: spaceId, + }, + ), + returnValue: _i5.Stream>.empty(), + ) as _i5.Stream>); + @override _i5.Stream> userLeaveByStatus({ required String? uid, required _i6.LeaveStatus? status, diff --git a/test/unit_test/user/leaves/detail/user_leave_detail_bloc_test.mocks.dart b/test/unit_test/user/leaves/detail/user_leave_detail_bloc_test.mocks.dart index 26f8da420..9d2ba283f 100644 --- a/test/unit_test/user/leaves/detail/user_leave_detail_bloc_test.mocks.dart +++ b/test/unit_test/user/leaves/detail/user_leave_detail_bloc_test.mocks.dart @@ -98,6 +98,24 @@ class MockLeaveService extends _i1.Mock implements _i3.LeaveService { returnValue: _i4.Stream>.empty(), ) as _i4.Stream>); @override + _i4.Stream> userYearlyLeave({ + required String? uid, + required int? year, + required String? spaceId, + }) => + (super.noSuchMethod( + Invocation.method( + #userYearlyLeave, + [], + { + #uid: uid, + #year: year, + #spaceId: spaceId, + }, + ), + returnValue: _i4.Stream>.empty(), + ) as _i4.Stream>); + @override _i4.Stream> userLeaveByStatus({ required String? uid, required _i5.LeaveStatus? status, diff --git a/test/unit_test/user/leaves/leaves_screen/bloc/leave_count/user_leave_count_bloc_test.mocks.dart b/test/unit_test/user/leaves/leaves_screen/bloc/leave_count/user_leave_count_bloc_test.mocks.dart index e0a45a6c8..0e02c6c4f 100644 --- a/test/unit_test/user/leaves/leaves_screen/bloc/leave_count/user_leave_count_bloc_test.mocks.dart +++ b/test/unit_test/user/leaves/leaves_screen/bloc/leave_count/user_leave_count_bloc_test.mocks.dart @@ -114,6 +114,24 @@ class MockLeaveService extends _i1.Mock implements _i4.LeaveService { returnValue: _i5.Stream>.empty(), ) as _i5.Stream>); @override + _i5.Stream> userYearlyLeave({ + required String? uid, + required int? year, + required String? spaceId, + }) => + (super.noSuchMethod( + Invocation.method( + #userYearlyLeave, + [], + { + #uid: uid, + #year: year, + #spaceId: spaceId, + }, + ), + returnValue: _i5.Stream>.empty(), + ) as _i5.Stream>); + @override _i5.Stream> userLeaveByStatus({ required String? uid, required _i6.LeaveStatus? status, diff --git a/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.dart b/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.dart index 6eeeb2604..964b7efae 100644 --- a/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.dart +++ b/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.dart @@ -85,58 +85,55 @@ void main() { test( 'Emits loading state and success with sorted leave and show current year leave after add UserLeaveEvent respectively', () { - bloc.add(FetchUserLeaveEvent()); when(userStateNotifier.employeeId).thenReturn(employeeId); - when(leaveRepo.userLeaves(employeeId)).thenAnswer( - (_) => Stream.value([pastLeave, upcomingLeave, specificYearLeave])); + when(leaveRepo.userLeavesByYear(employeeId, today.year)).thenAnswer( + (_) => Stream.value([pastLeave, upcomingLeave])); + bloc.add(ListenUserLeaves(year: today.year)); expectLater( bloc.stream, emitsInOrder([ - UserLeaveState(status: Status.loading), + UserLeaveState(status: Status.loading, selectedYear: today.year), UserLeaveState( status: Status.success, leaves: [upcomingLeave, pastLeave]), ])); }); test('Emits error state when Exception is thrown', () { - bloc.add(FetchUserLeaveEvent()); + bloc.add(ListenUserLeaves(year: today.year)); when(userStateNotifier.employeeId).thenReturn(employeeId); - when(leaveRepo.userLeaves(employeeId)).thenThrow(Exception('error')); + when(leaveRepo.userLeavesByYear(employeeId, today.year)).thenThrow(Exception('error')); expectLater( bloc.stream, emitsInOrder([ - UserLeaveState(status: Status.loading), + UserLeaveState(status: Status.loading, selectedYear: today.year), UserLeaveState(error: firestoreFetchDataError, status: Status.error) ])); }); test('Emits error state when stream have any error', () { - bloc.add(FetchUserLeaveEvent()); + bloc.add( ListenUserLeaves(year: today.year)); when(userStateNotifier.employeeId).thenReturn(employeeId); - when(leaveRepo.userLeaves(employeeId)) + when(leaveRepo.userLeavesByYear(employeeId, today.year)) .thenAnswer((_) => Stream.error(firestoreFetchDataError)); expectLater( bloc.stream, emitsInOrder([ - UserLeaveState(status: Status.loading), + UserLeaveState(status: Status.loading, selectedYear: today.year), UserLeaveState(error: firestoreFetchDataError, status: Status.error) ])); }); test('change year and show year wise leave test', () { - bloc.add(FetchUserLeaveEvent()); when(userStateNotifier.employeeId).thenReturn(employeeId); - when(leaveRepo.userLeaves(employeeId)).thenAnswer( - (_) => Stream.value([pastLeave, upcomingLeave, specificYearLeave])); - bloc.add(ChangeYearEvent(year: 2022)); + when(leaveRepo.userLeavesByYear(employeeId, 2022)).thenAnswer( + (_) => Stream.value([specificYearLeave])); + bloc.add(const ListenUserLeaves(year: 2022)); expectLater( bloc.stream, emitsInOrder([ - UserLeaveState(status: Status.loading), - UserLeaveState( - status: Status.success, leaves: [upcomingLeave, pastLeave]), + UserLeaveState(status: Status.loading, selectedYear: 2022), UserLeaveState( status: Status.success, leaves: [specificYearLeave], diff --git a/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.mocks.dart b/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.mocks.dart index 279192831..cc75697f9 100644 --- a/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.mocks.dart +++ b/test/unit_test/user/leaves/leaves_screen/bloc/leaves/user_leave_bloc_test.mocks.dart @@ -72,10 +72,17 @@ class MockLeaveRepo extends _i1.Mock implements _i3.LeaveRepo { returnValue: _i4.Stream>.empty(), ) as _i4.Stream>); @override - _i4.Stream> userLeaves(String? uid) => (super.noSuchMethod( + _i4.Stream> userLeavesByYear( + String? uid, + int? year, + ) => + (super.noSuchMethod( Invocation.method( - #userLeaves, - [uid], + #userLeavesByYear, + [ + uid, + year, + ], ), returnValue: _i4.Stream>.empty(), ) as _i4.Stream>); diff --git a/test/unit_test/user/members/detail/user_employee_detail_bloc_test.mocks.dart b/test/unit_test/user/members/detail/user_employee_detail_bloc_test.mocks.dart index ac9e98e70..3e1be2542 100644 --- a/test/unit_test/user/members/detail/user_employee_detail_bloc_test.mocks.dart +++ b/test/unit_test/user/members/detail/user_employee_detail_bloc_test.mocks.dart @@ -98,6 +98,24 @@ class MockLeaveService extends _i1.Mock implements _i3.LeaveService { returnValue: _i4.Stream>.empty(), ) as _i4.Stream>); @override + _i4.Stream> userYearlyLeave({ + required String? uid, + required int? year, + required String? spaceId, + }) => + (super.noSuchMethod( + Invocation.method( + #userYearlyLeave, + [], + { + #uid: uid, + #year: year, + #spaceId: spaceId, + }, + ), + returnValue: _i4.Stream>.empty(), + ) as _i4.Stream>); + @override _i4.Stream> userLeaveByStatus({ required String? uid, required _i5.LeaveStatus? status,