From 9de4c1eacc8ed17bd44004a3627eaf4355c409fc Mon Sep 17 00:00:00 2001 From: Pratik Canopas <109139581+cp-pratik-k@users.noreply.github.com> Date: Thu, 13 Jul 2023 14:17:10 +0530 Subject: [PATCH] Invite Notification (#31) * Add implementation for invite notification * Update test accouring invite notification change * rename function * add crashlitics logs for notification error * Disable firebase crashlytics for debug mode * Add log on notification sent * Fix pipeline --- lib/data/di/service_locator.config.dart | 2 + lib/data/provider/user_state.dart | 2 + .../services/mail_notification_service.dart | 62 ++- lib/main.dart | 5 + .../bloc/invite_member_bloc.dart | 10 +- .../join_space/bloc/join_space_bloc.dart | 16 +- .../invite_member_bloc_test.dart | 175 ++++---- .../invite_member_bloc_test.mocks.dart | 324 ++++++++++---- ...leave_request_details_bloc_test.mocks.dart | 48 +- .../space/join_space/join_space_test.dart | 13 +- .../join_space/join_space_test.mocks.dart | 418 ++++++++++++------ .../apply_leave_bloc_test.mocks.dart | 48 +- 12 files changed, 780 insertions(+), 343 deletions(-) diff --git a/lib/data/di/service_locator.config.dart b/lib/data/di/service_locator.config.dart index 8191e64ef..e0a19a5b3 100644 --- a/lib/data/di/service_locator.config.dart +++ b/lib/data/di/service_locator.config.dart @@ -168,6 +168,7 @@ extension GetItInjectableX on _i1.GetIt { gh<_i13.InvitationService>(), gh<_i22.UserStateNotifier>(), gh<_i27.EmployeeService>(), + gh<_i16.NotificationService>(), )); gh.factory<_i29.JoinSpaceBloc>(() => _i29.JoinSpaceBloc( gh<_i13.InvitationService>(), @@ -176,6 +177,7 @@ extension GetItInjectableX on _i1.GetIt { gh<_i23.AccountService>(), gh<_i27.EmployeeService>(), gh<_i25.AuthService>(), + gh<_i16.NotificationService>(), )); gh.lazySingleton<_i30.LeaveService>(() => _i30.LeaveService( gh<_i22.UserStateNotifier>(), diff --git a/lib/data/provider/user_state.dart b/lib/data/provider/user_state.dart index 2124a4540..21235ca23 100644 --- a/lib/data/provider/user_state.dart +++ b/lib/data/provider/user_state.dart @@ -81,6 +81,8 @@ class UserStateNotifier with ChangeNotifier { Space? get currentSpace => _userPreference.getSpace(); + String? get currentSpaceName => _userPreference.getSpace()?.name; + String? get currentSpaceId => _userPreference.getSpace()?.id; Employee? get _employee => _userPreference.getEmployee(); diff --git a/lib/data/services/mail_notification_service.dart b/lib/data/services/mail_notification_service.dart index 8aaa23b9f..ba45bd5a0 100644 --- a/lib/data/services/mail_notification_service.dart +++ b/lib/data/services/mail_notification_service.dart @@ -1,4 +1,6 @@ import 'dart:convert'; +import 'dart:developer'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/foundation.dart'; import 'package:injectable/injectable.dart'; import 'package:http/http.dart' as http; @@ -18,13 +20,13 @@ class NotificationService { httpClient.close(); } - Future notifyHRForNewLeave( + Future notifyHRForNewLeave( {required String name, required String reason, required DateTime startDate, required DateTime endDate, required String receiver}) async { - if (kDebugMode) return true; + if (kDebugMode) return; try { http.Response response = await httpClient.post(Uri.https(baseURL, 'api/leave/new'), @@ -35,13 +37,16 @@ class NotificationService { 'reason': reason, 'receiver': receiver, })); - return response.statusCode == 200; - } on Exception { - return false; + if (response.statusCode == 200) { + log('New Leave notification mail send successfully', + name: 'Notification'); + } + } on Exception catch (e) { + FirebaseCrashlytics.instance.log(e.toString()); } } - Future leaveResponse( + Future leaveResponse( {required String name, required DateTime startDate, required DateTime endDate, @@ -56,9 +61,12 @@ class NotificationService { "status": status.value, "receiver": receiver, })); - return response.statusCode == 200; - } on Exception { - return false; + if (response.statusCode == 200) { + log('Leave request update notification mail send successfully', + name: 'Notification'); + } + } on Exception catch (e) { + FirebaseCrashlytics.instance.log(e.toString()); } } @@ -71,4 +79,40 @@ class NotificationService { } return '${DateFormat('dd MMM yyyy').format(startDate)} to ${DateFormat('dd MMM yyyy').format(endDate)}'; } + + Future sendInviteNotification( + {required String companyName, required String receiver}) async { + try { + http.Response response = + await httpClient.post(Uri.https(baseURL, '/api/invitation'), + body: json.encode({ + "receiver": receiver, + "companyname": companyName, + "spacelink": "https://unity.canopas.com/home", + })); + if (response.statusCode == 200) { + log('Invite notification mail send successfully', name: 'Notification'); + } + } on Exception catch (e) { + FirebaseCrashlytics.instance.log(e.toString()); + } + } + + Future sendSpaceInviteAcceptNotification( + {required String sender, required String receiver}) async { + try { + http.Response response = + await httpClient.post(Uri.https(baseURL, '/api/acceptence'), + body: json.encode({ + "receiver": receiver, + "sender": sender, + })); + if (response.statusCode == 200) { + log('Accept invitation notification mail send successfully', + name: 'Notification'); + } + } on Exception catch (e) { + FirebaseCrashlytics.instance.log(e.toString()); + } + } } diff --git a/lib/main.dart b/lib/main.dart index bea68de0b..52de0f218 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:ui'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localization.dart'; @@ -33,6 +34,10 @@ Future main() async { FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); return true; }; + + if (kDebugMode) { + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(false); + } usePathUrlStrategy(); runApp(MyApp()); } diff --git a/lib/ui/admin/home/invite_member/bloc/invite_member_bloc.dart b/lib/ui/admin/home/invite_member/bloc/invite_member_bloc.dart index 3b9ab5e13..84eafeb0f 100644 --- a/lib/ui/admin/home/invite_member/bloc/invite_member_bloc.dart +++ b/lib/ui/admin/home/invite_member/bloc/invite_member_bloc.dart @@ -2,6 +2,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; import 'package:projectunity/data/core/exception/error_const.dart'; import 'package:projectunity/data/services/employee_service.dart'; +import 'package:projectunity/data/services/mail_notification_service.dart'; import '../../../../../data/core/utils/bloc_status.dart'; import '../../../../../data/provider/user_state.dart'; import '../../../../../data/services/invitation_services.dart'; @@ -12,10 +13,11 @@ import 'invite_member_state.dart'; class InviteMemberBloc extends Bloc { final InvitationService _invitationService; final EmployeeService _employeeService; + final NotificationService _notificationService; final UserStateNotifier _userManager; - InviteMemberBloc( - this._invitationService, this._userManager, this._employeeService) + InviteMemberBloc(this._invitationService, this._userManager, + this._employeeService, this._notificationService) : super(const InviteMemberState()) { on(_enterEmailEvent); on(_inviteMember); @@ -44,6 +46,10 @@ class InviteMemberBloc extends Bloc { senderId: _userManager.userUID!, spaceId: _userManager.currentSpaceId!, receiverEmail: state.email); + await _notificationService.sendInviteNotification( + companyName: _userManager.currentSpaceName!, + receiver: state.email, + ); emit(state.copyWith(status: Status.success)); } } on Exception { diff --git a/lib/ui/space/join_space/bloc/join_space_bloc.dart b/lib/ui/space/join_space/bloc/join_space_bloc.dart index 47e9ee173..7e8bed96c 100644 --- a/lib/ui/space/join_space/bloc/join_space_bloc.dart +++ b/lib/ui/space/join_space/bloc/join_space_bloc.dart @@ -6,6 +6,7 @@ import 'package:projectunity/data/model/employee/employee.dart'; import 'package:projectunity/data/provider/user_state.dart'; import 'package:projectunity/data/services/account_service.dart'; import 'package:projectunity/data/services/auth_service.dart'; +import 'package:projectunity/data/services/mail_notification_service.dart'; import 'package:projectunity/ui/space/join_space/bloc/join_space_event.dart'; import 'package:projectunity/ui/space/join_space/bloc/join_space_state.dart'; import '../../../../data/core/utils/bloc_status.dart'; @@ -21,12 +22,19 @@ class JoinSpaceBloc extends Bloc { final EmployeeService _employeeService; final SpaceService _spaceService; final InvitationService _invitationService; + final NotificationService _notificationService; final AccountService accountService; final AuthService _authService; late final List invitations; - JoinSpaceBloc(this._invitationService, this._spaceService, this._userManager, - this.accountService, this._employeeService, this._authService) + JoinSpaceBloc( + this._invitationService, + this._spaceService, + this._userManager, + this.accountService, + this._employeeService, + this._authService, + this._notificationService) : super(const JoinSpaceState()) { on(_init); on(_joinSpace); @@ -108,7 +116,9 @@ class JoinSpaceBloc extends Bloc { space: event.space, spaceUser: employee); final invitation = getSelectedInvitation(event.space.id); await _invitationService.deleteInvitation(id: invitation.id); - + await _notificationService.sendSpaceInviteAcceptNotification( + sender: _userManager.userEmail!, + receiver: event.space.notificationEmail!); emit(state.copyWith(selectSpaceStatus: Status.success)); } on Exception { emit(state.copyWith( diff --git a/test/unit_test/admin/home/search_member/invite_member_bloc_test.dart b/test/unit_test/admin/home/search_member/invite_member_bloc_test.dart index ebdb2c8c9..aefead021 100644 --- a/test/unit_test/admin/home/search_member/invite_member_bloc_test.dart +++ b/test/unit_test/admin/home/search_member/invite_member_bloc_test.dart @@ -6,72 +6,83 @@ import 'package:projectunity/data/core/utils/bloc_status.dart'; import 'package:projectunity/data/provider/user_state.dart'; import 'package:projectunity/data/services/employee_service.dart'; import 'package:projectunity/data/services/invitation_services.dart'; +import 'package:projectunity/data/services/mail_notification_service.dart'; import 'package:projectunity/ui/admin/home/invite_member/bloc/invite_member_bloc.dart'; import 'package:projectunity/ui/admin/home/invite_member/bloc/invite_member_event.dart'; import 'package:projectunity/ui/admin/home/invite_member/bloc/invite_member_state.dart'; import 'invite_member_bloc_test.mocks.dart'; -@GenerateMocks([InvitationService, UserStateNotifier, EmployeeService]) +@GenerateMocks([ + InvitationService, + UserStateNotifier, + EmployeeService, + NotificationService +]) void main() { late InviteMemberBloc inviteMemberBloc; late InvitationService invitationService; late EmployeeService employeeService; late UserStateNotifier userStateNotifier; + late NotificationService notificationService; setUp(() { userStateNotifier = MockUserStateNotifier(); invitationService = MockInvitationService(); employeeService = MockEmployeeService(); - inviteMemberBloc = - InviteMemberBloc(invitationService, userStateNotifier, employeeService); + notificationService = MockNotificationService(); + inviteMemberBloc = InviteMemberBloc(invitationService, userStateNotifier, + employeeService, notificationService); }); test('Should emit state initial state as default state ', () { expect(inviteMemberBloc.state, - const InviteMemberState(status: Status.initial)); - }); + const InviteMemberState(status: Status.initial)); + }); - test( - 'Should emit state with emailError false if user has not added any input', - () { - expect( - inviteMemberBloc.state, const InviteMemberState(emailError: false)); - }); + test( + 'Should emit state with emailError false if user has not added any input', + () { + expect(inviteMemberBloc.state, const InviteMemberState(emailError: false)); + }); - test( - 'Should emit state with input that contains properly formatted email if user add any input in textField', - () { - inviteMemberBloc.add(AddEmailEvent('Andrew.j@google.com')); - expect( - inviteMemberBloc.stream, - emits(const InviteMemberState( - email: 'Andrew.j@google.com', emailError: false))); - }); + test( + 'Should emit state with input that contains properly formatted email if user add any input in textField', + () { + inviteMemberBloc.add(AddEmailEvent('Andrew.j@google.com')); + expect( + inviteMemberBloc.stream, + emits(const InviteMemberState( + email: 'Andrew.j@google.com', emailError: false))); + }); - test( - 'Should emit error state with input that contains does not properly formatted email if user add any input in textField', - () { - inviteMemberBloc.add(AddEmailEvent('Andrew')); - expect(inviteMemberBloc.stream, - emits(const InviteMemberState(email: 'Andrew', emailError: true))); - }); + test( + 'Should emit error state with input that contains does not properly formatted email if user add any input in textField', + () { + inviteMemberBloc.add(AddEmailEvent('Andrew')); + expect(inviteMemberBloc.stream, + emits(const InviteMemberState(email: 'Andrew', emailError: true))); + }); - test( - 'Should emit loading and error state if email input is not valid on InviteMemberEvent', - () { - inviteMemberBloc.add(InviteMemberEvent()); - expect( - inviteMemberBloc.stream, - emitsInOrder([ - const InviteMemberState(status: Status.loading), - const InviteMemberState( - status: Status.error, error: provideRequiredInformation) - ])); - }); + test( + 'Should emit loading and error state if email input is not valid on InviteMemberEvent', + () { + inviteMemberBloc.add(InviteMemberEvent()); + expect( + inviteMemberBloc.stream, + emitsInOrder([ + const InviteMemberState(status: Status.loading), + const InviteMemberState( + status: Status.error, error: provideRequiredInformation) + ])); + }); - test( - 'Should emit loading state and success state if email input is valid on InviteMemberEvent', - () async { + test( + 'Should emit loading state and success state if email input is valid on InviteMemberEvent', + () async { + when(userStateNotifier.currentSpaceName).thenReturn('canopas'); + when(notificationService.sendInviteNotification( + companyName: 'canopas', receiver: 'andrew.j@google.com')) + .thenAnswer((realInvocation) async => true); when(userStateNotifier.userUID).thenReturn('uid'); when(userStateNotifier.currentSpaceId).thenReturn('space_id'); when(employeeService.hasUser('andrew.j@google.com')) @@ -85,23 +96,23 @@ void main() { receiverEmail: 'andrew.j@google.com')) .thenAnswer((_) async => {}); inviteMemberBloc.add(AddEmailEvent('andrew.j@google.com')); - inviteMemberBloc.add(InviteMemberEvent()); - expectLater( - inviteMemberBloc.stream, - emitsInOrder([ - const InviteMemberState( - status: Status.initial, email: 'andrew.j@google.com'), - const InviteMemberState( - status: Status.loading, email: 'andrew.j@google.com'), - const InviteMemberState( - status: Status.success, email: 'andrew.j@google.com') - ])); - }); + inviteMemberBloc.add(InviteMemberEvent()); + expectLater( + inviteMemberBloc.stream, + emitsInOrder([ + const InviteMemberState( + status: Status.initial, email: 'andrew.j@google.com'), + const InviteMemberState( + status: Status.loading, email: 'andrew.j@google.com'), + const InviteMemberState( + status: Status.success, email: 'andrew.j@google.com') + ])); + }); - test( - 'Should emit loading state and error state if Exception is thrown by firestore', - () { - when(invitationService.addInvitation( + test( + 'Should emit loading state and error state if Exception is thrown by firestore', + () { + when(invitationService.addInvitation( senderId: 'uid', spaceId: 'space_id', receiverEmail: 'andrew.j@google.com')) @@ -119,21 +130,21 @@ void main() { expectLater( inviteMemberBloc.stream, emitsInOrder([ - const InviteMemberState( - status: Status.initial, email: 'andrew.j@google.com'), - const InviteMemberState( - status: Status.loading, email: 'andrew.j@google.com'), - const InviteMemberState( - status: Status.error, - email: 'andrew.j@google.com', - error: firestoreFetchDataError) - ])); - }); + const InviteMemberState( + status: Status.initial, email: 'andrew.j@google.com'), + const InviteMemberState( + status: Status.loading, email: 'andrew.j@google.com'), + const InviteMemberState( + status: Status.error, + email: 'andrew.j@google.com', + error: firestoreFetchDataError) + ])); + }); - test( - 'Should emit loading state and error state if user already invited exception', - () { - when(invitationService.addInvitation( + test( + 'Should emit loading state and error state if user already invited exception', + () { + when(invitationService.addInvitation( senderId: 'uid', spaceId: 'space_id', receiverEmail: 'andrew.j@google.com')) @@ -151,14 +162,14 @@ void main() { expectLater( inviteMemberBloc.stream, emitsInOrder([ - const InviteMemberState( - status: Status.initial, email: 'andrew.j@google.com'), - const InviteMemberState( - status: Status.loading, email: 'andrew.j@google.com'), - const InviteMemberState( - status: Status.error, - email: 'andrew.j@google.com', - error: userAlreadyInvited) - ])); - }); + const InviteMemberState( + status: Status.initial, email: 'andrew.j@google.com'), + const InviteMemberState( + status: Status.loading, email: 'andrew.j@google.com'), + const InviteMemberState( + status: Status.error, + email: 'andrew.j@google.com', + error: userAlreadyInvited) + ])); + }); } diff --git a/test/unit_test/admin/home/search_member/invite_member_bloc_test.mocks.dart b/test/unit_test/admin/home/search_member/invite_member_bloc_test.mocks.dart index 1b5dc5f88..1dbf5fb69 100644 --- a/test/unit_test/admin/home/search_member/invite_member_bloc_test.mocks.dart +++ b/test/unit_test/admin/home/search_member/invite_member_bloc_test.mocks.dart @@ -3,18 +3,22 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i5; -import 'dart:ui' as _i10; +import 'dart:async' as _i6; +import 'dart:ui' as _i11; import 'package:cloud_firestore/cloud_firestore.dart' as _i2; +import 'package:http/http.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:projectunity/data/model/account/account.dart' as _i8; +import 'package:projectunity/data/model/account/account.dart' as _i9; import 'package:projectunity/data/model/employee/employee.dart' as _i3; -import 'package:projectunity/data/model/invitation/invitation.dart' as _i6; -import 'package:projectunity/data/model/space/space.dart' as _i9; -import 'package:projectunity/data/provider/user_state.dart' as _i7; -import 'package:projectunity/data/services/employee_service.dart' as _i11; -import 'package:projectunity/data/services/invitation_services.dart' as _i4; +import 'package:projectunity/data/model/invitation/invitation.dart' as _i7; +import 'package:projectunity/data/model/leave/leave.dart' as _i14; +import 'package:projectunity/data/model/space/space.dart' as _i10; +import 'package:projectunity/data/provider/user_state.dart' as _i8; +import 'package:projectunity/data/services/employee_service.dart' as _i12; +import 'package:projectunity/data/services/invitation_services.dart' as _i5; +import 'package:projectunity/data/services/mail_notification_service.dart' + as _i13; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -48,10 +52,20 @@ class _FakeEmployee_1 extends _i1.SmartFake implements _i3.Employee { ); } +class _FakeClient_2 extends _i1.SmartFake implements _i4.Client { + _FakeClient_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [InvitationService]. /// /// See the documentation for Mockito's code generation for more information. -class MockInvitationService extends _i1.Mock implements _i4.InvitationService { +class MockInvitationService extends _i1.Mock implements _i5.InvitationService { MockInvitationService() { _i1.throwOnMissingStub(this); } @@ -65,17 +79,17 @@ class MockInvitationService extends _i1.Mock implements _i4.InvitationService { ), ) as _i2.FirebaseFirestore); @override - _i5.Future> fetchSpaceInvitationsForUserEmail( + _i6.Future> fetchSpaceInvitationsForUserEmail( String? email) => (super.noSuchMethod( Invocation.method( #fetchSpaceInvitationsForUserEmail, [email], ), - returnValue: _i5.Future>.value(<_i6.Invitation>[]), - ) as _i5.Future>); + returnValue: _i6.Future>.value(<_i7.Invitation>[]), + ) as _i6.Future>); @override - _i5.Future checkMemberInvitationAlreadyExist({ + _i6.Future checkMemberInvitationAlreadyExist({ required String? spaceId, required String? email, }) => @@ -88,10 +102,10 @@ class MockInvitationService extends _i1.Mock implements _i4.InvitationService { #email: email, }, ), - returnValue: _i5.Future.value(false), - ) as _i5.Future); + returnValue: _i6.Future.value(false), + ) as _i6.Future); @override - _i5.Future> fetchSpaceInvitations( + _i6.Future> fetchSpaceInvitations( {required String? spaceId}) => (super.noSuchMethod( Invocation.method( @@ -99,10 +113,10 @@ class MockInvitationService extends _i1.Mock implements _i4.InvitationService { [], {#spaceId: spaceId}, ), - returnValue: _i5.Future>.value(<_i6.Invitation>[]), - ) as _i5.Future>); + returnValue: _i6.Future>.value(<_i7.Invitation>[]), + ) as _i6.Future>); @override - _i5.Future addInvitation({ + _i6.Future addInvitation({ required String? senderId, required String? spaceId, required String? receiverEmail, @@ -117,35 +131,35 @@ class MockInvitationService extends _i1.Mock implements _i4.InvitationService { #receiverEmail: receiverEmail, }, ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future deleteInvitation({required String? id}) => + _i6.Future deleteInvitation({required String? id}) => (super.noSuchMethod( Invocation.method( #deleteInvitation, [], {#id: id}, ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); } /// A class which mocks [UserStateNotifier]. /// /// See the documentation for Mockito's code generation for more information. -class MockUserStateNotifier extends _i1.Mock implements _i7.UserStateNotifier { +class MockUserStateNotifier extends _i1.Mock implements _i8.UserStateNotifier { MockUserStateNotifier() { _i1.throwOnMissingStub(this); } @override - _i7.UserState get state => (super.noSuchMethod( + _i8.UserState get state => (super.noSuchMethod( Invocation.getter(#state), - returnValue: _i7.UserState.authenticated, - ) as _i7.UserState); + returnValue: _i8.UserState.authenticated, + ) as _i8.UserState); @override String get employeeId => (super.noSuchMethod( Invocation.getter(#employeeId), @@ -193,17 +207,17 @@ class MockUserStateNotifier extends _i1.Mock implements _i7.UserStateNotifier { returnValueForMissingStub: null, ); @override - _i5.Future setUser(_i8.Account? user) => (super.noSuchMethod( + _i6.Future setUser(_i9.Account? user) => (super.noSuchMethod( Invocation.method( #setUser, [user], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future setEmployeeWithSpace({ - required _i9.Space? space, + _i6.Future setEmployeeWithSpace({ + required _i10.Space? space, required _i3.Employee? spaceUser, bool? redirect = true, }) => @@ -217,38 +231,38 @@ class MockUserStateNotifier extends _i1.Mock implements _i7.UserStateNotifier { #redirect: redirect, }, ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future updateSpace(_i9.Space? space) => (super.noSuchMethod( + _i6.Future updateSpace(_i10.Space? space) => (super.noSuchMethod( Invocation.method( #updateSpace, [space], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future removeEmployeeWithSpace() => (super.noSuchMethod( + _i6.Future removeEmployeeWithSpace() => (super.noSuchMethod( Invocation.method( #removeEmployeeWithSpace, [], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future removeAll() => (super.noSuchMethod( + _i6.Future removeAll() => (super.noSuchMethod( Invocation.method( #removeAll, [], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i11.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -256,7 +270,7 @@ class MockUserStateNotifier extends _i1.Mock implements _i7.UserStateNotifier { returnValueForMissingStub: null, ); @override - void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -284,7 +298,7 @@ class MockUserStateNotifier extends _i1.Mock implements _i7.UserStateNotifier { /// A class which mocks [EmployeeService]. /// /// See the documentation for Mockito's code generation for more information. -class MockEmployeeService extends _i1.Mock implements _i11.EmployeeService { +class MockEmployeeService extends _i1.Mock implements _i12.EmployeeService { MockEmployeeService() { _i1.throwOnMissingStub(this); } @@ -298,16 +312,16 @@ class MockEmployeeService extends _i1.Mock implements _i11.EmployeeService { ), ) as _i2.FirebaseFirestore); @override - _i5.Stream> employees(String? spaceId) => + _i6.Stream> employees(String? spaceId) => (super.noSuchMethod( Invocation.method( #employees, [spaceId], ), - returnValue: _i5.Stream>.empty(), - ) as _i5.Stream>); + returnValue: _i6.Stream>.empty(), + ) as _i6.Stream>); @override - _i5.Future addEmployeeBySpaceId({ + _i6.Future addEmployeeBySpaceId({ required _i3.Employee? employee, required String? spaceId, }) => @@ -320,11 +334,11 @@ class MockEmployeeService extends _i1.Mock implements _i11.EmployeeService { #spaceId: spaceId, }, ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future<_i3.Employee?> getEmployeeBySpaceId({ + _i6.Future<_i3.Employee?> getEmployeeBySpaceId({ required String? userId, required String? spaceId, }) => @@ -337,54 +351,54 @@ class MockEmployeeService extends _i1.Mock implements _i11.EmployeeService { #spaceId: spaceId, }, ), - returnValue: _i5.Future<_i3.Employee?>.value(), - ) as _i5.Future<_i3.Employee?>); + returnValue: _i6.Future<_i3.Employee?>.value(), + ) as _i6.Future<_i3.Employee?>); @override - _i5.Future> getEmployees() => (super.noSuchMethod( + _i6.Future> getEmployees() => (super.noSuchMethod( Invocation.method( #getEmployees, [], ), - returnValue: _i5.Future>.value(<_i3.Employee>[]), - ) as _i5.Future>); + returnValue: _i6.Future>.value(<_i3.Employee>[]), + ) as _i6.Future>); @override - _i5.Future<_i3.Employee?> getEmployee(String? id) => (super.noSuchMethod( + _i6.Future<_i3.Employee?> getEmployee(String? id) => (super.noSuchMethod( Invocation.method( #getEmployee, [id], ), - returnValue: _i5.Future<_i3.Employee?>.value(), - ) as _i5.Future<_i3.Employee?>); + returnValue: _i6.Future<_i3.Employee?>.value(), + ) as _i6.Future<_i3.Employee?>); @override - _i5.Future hasUser(String? email) => (super.noSuchMethod( + _i6.Future hasUser(String? email) => (super.noSuchMethod( Invocation.method( #hasUser, [email], ), - returnValue: _i5.Future.value(false), - ) as _i5.Future); + returnValue: _i6.Future.value(false), + ) as _i6.Future); @override - _i5.Future addEmployee(_i3.Employee? employee) => (super.noSuchMethod( + _i6.Future addEmployee(_i3.Employee? employee) => (super.noSuchMethod( Invocation.method( #addEmployee, [employee], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future updateEmployeeDetails({required _i3.Employee? employee}) => + _i6.Future updateEmployeeDetails({required _i3.Employee? employee}) => (super.noSuchMethod( Invocation.method( #updateEmployeeDetails, [], {#employee: employee}, ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future changeEmployeeRoleType( + _i6.Future changeEmployeeRoleType( String? id, _i3.Role? role, ) => @@ -396,20 +410,20 @@ class MockEmployeeService extends _i1.Mock implements _i11.EmployeeService { role, ], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future deleteEmployee(String? id) => (super.noSuchMethod( + _i6.Future deleteEmployee(String? id) => (super.noSuchMethod( Invocation.method( #deleteEmployee, [id], ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i5.Future changeAccountStatus({ + _i6.Future changeAccountStatus({ required String? id, required _i3.EmployeeStatus? status, }) => @@ -422,7 +436,131 @@ class MockEmployeeService extends _i1.Mock implements _i11.EmployeeService { #status: status, }, ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); +} + +/// A class which mocks [NotificationService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockNotificationService extends _i1.Mock + implements _i13.NotificationService { + MockNotificationService() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Client get httpClient => (super.noSuchMethod( + Invocation.getter(#httpClient), + returnValue: _FakeClient_2( + this, + Invocation.getter(#httpClient), + ), + ) as _i4.Client); + @override + _i6.Future dispose() => (super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future notifyHRForNewLeave({ + required String? name, + required String? reason, + required DateTime? startDate, + required DateTime? endDate, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #notifyHRForNewLeave, + [], + { + #name: name, + #reason: reason, + #startDate: startDate, + #endDate: endDate, + #receiver: receiver, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future leaveResponse({ + required String? name, + required DateTime? startDate, + required DateTime? endDate, + required _i14.LeaveStatus? status, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #leaveResponse, + [], + { + #name: name, + #startDate: startDate, + #endDate: endDate, + #status: status, + #receiver: receiver, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + String getFormatDate({ + required DateTime? startDate, + required DateTime? endDate, + }) => + (super.noSuchMethod( + Invocation.method( + #getFormatDate, + [], + { + #startDate: startDate, + #endDate: endDate, + }, + ), + returnValue: '', + ) as String); + @override + _i6.Future sendInviteNotification({ + required String? companyName, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendInviteNotification, + [], + { + #companyName: companyName, + #receiver: receiver, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future sendSpaceInviteAcceptNotification({ + required String? sender, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendSpaceInviteAcceptNotification, + [], + { + #sender: sender, + #receiver: receiver, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); } 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 84a004c3b..6566a80a3 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 @@ -583,7 +583,7 @@ class MockNotificationService extends _i1.Mock returnValueForMissingStub: _i7.Future.value(), ) as _i7.Future); @override - _i7.Future notifyHRForNewLeave({ + _i7.Future notifyHRForNewLeave({ required String? name, required String? reason, required DateTime? startDate, @@ -602,10 +602,11 @@ class MockNotificationService extends _i1.Mock #receiver: receiver, }, ), - returnValue: _i7.Future.value(false), - ) as _i7.Future); + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); @override - _i7.Future leaveResponse({ + _i7.Future leaveResponse({ required String? name, required DateTime? startDate, required DateTime? endDate, @@ -624,8 +625,9 @@ class MockNotificationService extends _i1.Mock #receiver: receiver, }, ), - returnValue: _i7.Future.value(false), - ) as _i7.Future); + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); @override String getFormatDate({ required DateTime? startDate, @@ -642,4 +644,38 @@ class MockNotificationService extends _i1.Mock ), returnValue: '', ) as String); + @override + _i7.Future sendInviteNotification({ + required String? companyName, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendInviteNotification, + [], + { + #companyName: companyName, + #receiver: receiver, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future sendSpaceInviteAcceptNotification({ + required String? sender, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendSpaceInviteAcceptNotification, + [], + { + #sender: sender, + #receiver: receiver, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); } diff --git a/test/unit_test/space/join_space/join_space_test.dart b/test/unit_test/space/join_space/join_space_test.dart index 289b72fbd..023a02b61 100644 --- a/test/unit_test/space/join_space/join_space_test.dart +++ b/test/unit_test/space/join_space/join_space_test.dart @@ -11,6 +11,7 @@ import 'package:projectunity/data/services/account_service.dart'; import 'package:projectunity/data/services/auth_service.dart'; import 'package:projectunity/data/services/employee_service.dart'; import 'package:projectunity/data/services/invitation_services.dart'; +import 'package:projectunity/data/services/mail_notification_service.dart'; import 'package:projectunity/data/services/space_service.dart'; import 'package:projectunity/ui/space/join_space/bloc/join_space_bloc.dart'; import 'package:projectunity/ui/space/join_space/bloc/join_space_event.dart'; @@ -24,7 +25,8 @@ import 'join_space_test.mocks.dart'; UserStateNotifier, AccountService, EmployeeService, - AuthService + AuthService, + NotificationService ]) void main() { late SpaceService spaceService; @@ -33,6 +35,7 @@ void main() { late InvitationService invitationService; late AccountService accountService; late AuthService authService; + late NotificationService notificationService; late JoinSpaceBloc bloc; const invitation = Invitation( id: 'id', @@ -46,9 +49,10 @@ void main() { employeeService = MockEmployeeService(); invitationService = MockInvitationService(); accountService = MockAccountService(); + notificationService = MockNotificationService(); bloc = JoinSpaceBloc(invitationService, spaceService, userStateNotifier, - accountService, employeeService, authService); + accountService, employeeService, authService, notificationService); when(userStateNotifier.userUID).thenReturn('uid'); when(userStateNotifier.userEmail).thenReturn('email'); }); @@ -58,6 +62,7 @@ void main() { name: 'dummy space', createdAt: DateTime.now(), paidTimeOff: 12, + notificationEmail: 'hr@canopas.com', ownerIds: const ['uid']); final employee = Employee( @@ -173,6 +178,10 @@ void main() { test( 'Should emit loading and success state if user select space from requested spaces', () { + when(userStateNotifier.userEmail).thenReturn('dummy@canopas.com'); + when(notificationService.sendSpaceInviteAcceptNotification( + sender: 'dummy@canopas.com', receiver: space.notificationEmail!)) + .thenAnswer((_) async => true); bloc.invitations = [invitation]; when(employeeService.addEmployeeBySpaceId( employee: employee, spaceId: space.id)) diff --git a/test/unit_test/space/join_space/join_space_test.mocks.dart b/test/unit_test/space/join_space/join_space_test.mocks.dart index 1c3071c07..70d0d067c 100644 --- a/test/unit_test/space/join_space/join_space_test.mocks.dart +++ b/test/unit_test/space/join_space/join_space_test.mocks.dart @@ -3,23 +3,27 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i9; -import 'dart:ui' as _i13; +import 'dart:async' as _i10; +import 'dart:ui' as _i14; import 'package:cloud_firestore/cloud_firestore.dart' as _i2; import 'package:firebase_auth/firebase_auth.dart' as _i7; +import 'package:http/http.dart' as _i8; import 'package:mockito/mockito.dart' as _i1; import 'package:projectunity/data/model/account/account.dart' as _i6; import 'package:projectunity/data/model/employee/employee.dart' as _i4; -import 'package:projectunity/data/model/invitation/invitation.dart' as _i10; +import 'package:projectunity/data/model/invitation/invitation.dart' as _i11; +import 'package:projectunity/data/model/leave/leave.dart' as _i19; import 'package:projectunity/data/model/space/space.dart' as _i3; import 'package:projectunity/data/provider/device_info.dart' as _i5; -import 'package:projectunity/data/provider/user_state.dart' as _i12; -import 'package:projectunity/data/services/account_service.dart' as _i14; -import 'package:projectunity/data/services/auth_service.dart' as _i16; -import 'package:projectunity/data/services/employee_service.dart' as _i15; -import 'package:projectunity/data/services/invitation_services.dart' as _i8; -import 'package:projectunity/data/services/space_service.dart' as _i11; +import 'package:projectunity/data/provider/user_state.dart' as _i13; +import 'package:projectunity/data/services/account_service.dart' as _i15; +import 'package:projectunity/data/services/auth_service.dart' as _i17; +import 'package:projectunity/data/services/employee_service.dart' as _i16; +import 'package:projectunity/data/services/invitation_services.dart' as _i9; +import 'package:projectunity/data/services/mail_notification_service.dart' + as _i18; +import 'package:projectunity/data/services/space_service.dart' as _i12; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -94,10 +98,20 @@ class _FakeFirebaseAuth_5 extends _i1.SmartFake implements _i7.FirebaseAuth { ); } +class _FakeClient_6 extends _i1.SmartFake implements _i8.Client { + _FakeClient_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [InvitationService]. /// /// See the documentation for Mockito's code generation for more information. -class MockInvitationService extends _i1.Mock implements _i8.InvitationService { +class MockInvitationService extends _i1.Mock implements _i9.InvitationService { MockInvitationService() { _i1.throwOnMissingStub(this); } @@ -111,7 +125,7 @@ class MockInvitationService extends _i1.Mock implements _i8.InvitationService { ), ) as _i2.FirebaseFirestore); @override - _i9.Future> fetchSpaceInvitationsForUserEmail( + _i10.Future> fetchSpaceInvitationsForUserEmail( String? email) => (super.noSuchMethod( Invocation.method( @@ -119,10 +133,10 @@ class MockInvitationService extends _i1.Mock implements _i8.InvitationService { [email], ), returnValue: - _i9.Future>.value(<_i10.Invitation>[]), - ) as _i9.Future>); + _i10.Future>.value(<_i11.Invitation>[]), + ) as _i10.Future>); @override - _i9.Future checkMemberInvitationAlreadyExist({ + _i10.Future checkMemberInvitationAlreadyExist({ required String? spaceId, required String? email, }) => @@ -135,10 +149,10 @@ class MockInvitationService extends _i1.Mock implements _i8.InvitationService { #email: email, }, ), - returnValue: _i9.Future.value(false), - ) as _i9.Future); + returnValue: _i10.Future.value(false), + ) as _i10.Future); @override - _i9.Future> fetchSpaceInvitations( + _i10.Future> fetchSpaceInvitations( {required String? spaceId}) => (super.noSuchMethod( Invocation.method( @@ -147,10 +161,10 @@ class MockInvitationService extends _i1.Mock implements _i8.InvitationService { {#spaceId: spaceId}, ), returnValue: - _i9.Future>.value(<_i10.Invitation>[]), - ) as _i9.Future>); + _i10.Future>.value(<_i11.Invitation>[]), + ) as _i10.Future>); @override - _i9.Future addInvitation({ + _i10.Future addInvitation({ required String? senderId, required String? spaceId, required String? receiverEmail, @@ -165,26 +179,26 @@ class MockInvitationService extends _i1.Mock implements _i8.InvitationService { #receiverEmail: receiverEmail, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future deleteInvitation({required String? id}) => + _i10.Future deleteInvitation({required String? id}) => (super.noSuchMethod( Invocation.method( #deleteInvitation, [], {#id: id}, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); } /// A class which mocks [SpaceService]. /// /// See the documentation for Mockito's code generation for more information. -class MockSpaceService extends _i1.Mock implements _i11.SpaceService { +class MockSpaceService extends _i1.Mock implements _i12.SpaceService { MockSpaceService() { _i1.throwOnMissingStub(this); } @@ -206,15 +220,15 @@ class MockSpaceService extends _i1.Mock implements _i11.SpaceService { returnValueForMissingStub: null, ); @override - _i9.Future<_i3.Space?> getSpace(String? spaceId) => (super.noSuchMethod( + _i10.Future<_i3.Space?> getSpace(String? spaceId) => (super.noSuchMethod( Invocation.method( #getSpace, [spaceId], ), - returnValue: _i9.Future<_i3.Space?>.value(), - ) as _i9.Future<_i3.Space?>); + returnValue: _i10.Future<_i3.Space?>.value(), + ) as _i10.Future<_i3.Space?>); @override - _i9.Future<_i3.Space> createSpace({ + _i10.Future<_i3.Space> createSpace({ String? logo, required String? name, String? domain, @@ -233,7 +247,7 @@ class MockSpaceService extends _i1.Mock implements _i11.SpaceService { #ownerId: ownerId, }, ), - returnValue: _i9.Future<_i3.Space>.value(_FakeSpace_1( + returnValue: _i10.Future<_i3.Space>.value(_FakeSpace_1( this, Invocation.method( #createSpace, @@ -247,18 +261,18 @@ class MockSpaceService extends _i1.Mock implements _i11.SpaceService { }, ), )), - ) as _i9.Future<_i3.Space>); + ) as _i10.Future<_i3.Space>); @override - _i9.Future updateSpace(_i3.Space? space) => (super.noSuchMethod( + _i10.Future updateSpace(_i3.Space? space) => (super.noSuchMethod( Invocation.method( #updateSpace, [space], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future deleteSpace({ + _i10.Future deleteSpace({ required String? spaceId, required List? owners, required String? uid, @@ -273,30 +287,30 @@ class MockSpaceService extends _i1.Mock implements _i11.SpaceService { #uid: uid, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future> getSpacesOfUser(String? uid) => + _i10.Future> getSpacesOfUser(String? uid) => (super.noSuchMethod( Invocation.method( #getSpacesOfUser, [uid], ), - returnValue: _i9.Future>.value(<_i3.Space>[]), - ) as _i9.Future>); + returnValue: _i10.Future>.value(<_i3.Space>[]), + ) as _i10.Future>); @override - _i9.Future getPaidLeaves({required String? spaceId}) => + _i10.Future getPaidLeaves({required String? spaceId}) => (super.noSuchMethod( Invocation.method( #getPaidLeaves, [], {#spaceId: spaceId}, ), - returnValue: _i9.Future.value(0), - ) as _i9.Future); + returnValue: _i10.Future.value(0), + ) as _i10.Future); @override - _i9.Future updateLeaveCount({ + _i10.Future updateLeaveCount({ required String? spaceId, required int? paidLeaveCount, }) => @@ -309,24 +323,24 @@ class MockSpaceService extends _i1.Mock implements _i11.SpaceService { #paidLeaveCount: paidLeaveCount, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); } /// A class which mocks [UserStateNotifier]. /// /// See the documentation for Mockito's code generation for more information. -class MockUserStateNotifier extends _i1.Mock implements _i12.UserStateNotifier { +class MockUserStateNotifier extends _i1.Mock implements _i13.UserStateNotifier { MockUserStateNotifier() { _i1.throwOnMissingStub(this); } @override - _i12.UserState get state => (super.noSuchMethod( + _i13.UserState get state => (super.noSuchMethod( Invocation.getter(#state), - returnValue: _i12.UserState.authenticated, - ) as _i12.UserState); + returnValue: _i13.UserState.authenticated, + ) as _i13.UserState); @override String get employeeId => (super.noSuchMethod( Invocation.getter(#employeeId), @@ -374,16 +388,16 @@ class MockUserStateNotifier extends _i1.Mock implements _i12.UserStateNotifier { returnValueForMissingStub: null, ); @override - _i9.Future setUser(_i6.Account? user) => (super.noSuchMethod( + _i10.Future setUser(_i6.Account? user) => (super.noSuchMethod( Invocation.method( #setUser, [user], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future setEmployeeWithSpace({ + _i10.Future setEmployeeWithSpace({ required _i3.Space? space, required _i4.Employee? spaceUser, bool? redirect = true, @@ -398,38 +412,38 @@ class MockUserStateNotifier extends _i1.Mock implements _i12.UserStateNotifier { #redirect: redirect, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future updateSpace(_i3.Space? space) => (super.noSuchMethod( + _i10.Future updateSpace(_i3.Space? space) => (super.noSuchMethod( Invocation.method( #updateSpace, [space], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future removeEmployeeWithSpace() => (super.noSuchMethod( + _i10.Future removeEmployeeWithSpace() => (super.noSuchMethod( Invocation.method( #removeEmployeeWithSpace, [], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future removeAll() => (super.noSuchMethod( + _i10.Future removeAll() => (super.noSuchMethod( Invocation.method( #removeAll, [], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - void addListener(_i13.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -437,7 +451,7 @@ class MockUserStateNotifier extends _i1.Mock implements _i12.UserStateNotifier { returnValueForMissingStub: null, ); @override - void removeListener(_i13.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -465,7 +479,7 @@ class MockUserStateNotifier extends _i1.Mock implements _i12.UserStateNotifier { /// A class which mocks [AccountService]. /// /// See the documentation for Mockito's code generation for more information. -class MockAccountService extends _i1.Mock implements _i14.AccountService { +class MockAccountService extends _i1.Mock implements _i15.AccountService { MockAccountService() { _i1.throwOnMissingStub(this); } @@ -487,21 +501,21 @@ class MockAccountService extends _i1.Mock implements _i14.AccountService { ), ) as _i5.DeviceInfoProvider); @override - _i9.Future<_i6.Account> getUser(_i7.User? authData) => (super.noSuchMethod( + _i10.Future<_i6.Account> getUser(_i7.User? authData) => (super.noSuchMethod( Invocation.method( #getUser, [authData], ), - returnValue: _i9.Future<_i6.Account>.value(_FakeAccount_4( + returnValue: _i10.Future<_i6.Account>.value(_FakeAccount_4( this, Invocation.method( #getUser, [authData], ), )), - ) as _i9.Future<_i6.Account>); + ) as _i10.Future<_i6.Account>); @override - _i9.Future updateSpaceOfUser({ + _i10.Future updateSpaceOfUser({ required String? spaceID, required String? uid, }) => @@ -514,11 +528,11 @@ class MockAccountService extends _i1.Mock implements _i14.AccountService { #uid: uid, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future deleteSpaceIdFromAccount({ + _i10.Future deleteSpaceIdFromAccount({ required String? spaceId, required String? uid, }) => @@ -531,25 +545,25 @@ class MockAccountService extends _i1.Mock implements _i14.AccountService { #uid: uid, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future> fetchSpaceIds({required String? uid}) => + _i10.Future> fetchSpaceIds({required String? uid}) => (super.noSuchMethod( Invocation.method( #fetchSpaceIds, [], {#uid: uid}, ), - returnValue: _i9.Future>.value([]), - ) as _i9.Future>); + returnValue: _i10.Future>.value([]), + ) as _i10.Future>); } /// A class which mocks [EmployeeService]. /// /// See the documentation for Mockito's code generation for more information. -class MockEmployeeService extends _i1.Mock implements _i15.EmployeeService { +class MockEmployeeService extends _i1.Mock implements _i16.EmployeeService { MockEmployeeService() { _i1.throwOnMissingStub(this); } @@ -563,16 +577,16 @@ class MockEmployeeService extends _i1.Mock implements _i15.EmployeeService { ), ) as _i2.FirebaseFirestore); @override - _i9.Stream> employees(String? spaceId) => + _i10.Stream> employees(String? spaceId) => (super.noSuchMethod( Invocation.method( #employees, [spaceId], ), - returnValue: _i9.Stream>.empty(), - ) as _i9.Stream>); + returnValue: _i10.Stream>.empty(), + ) as _i10.Stream>); @override - _i9.Future addEmployeeBySpaceId({ + _i10.Future addEmployeeBySpaceId({ required _i4.Employee? employee, required String? spaceId, }) => @@ -585,11 +599,11 @@ class MockEmployeeService extends _i1.Mock implements _i15.EmployeeService { #spaceId: spaceId, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future<_i4.Employee?> getEmployeeBySpaceId({ + _i10.Future<_i4.Employee?> getEmployeeBySpaceId({ required String? userId, required String? spaceId, }) => @@ -602,54 +616,54 @@ class MockEmployeeService extends _i1.Mock implements _i15.EmployeeService { #spaceId: spaceId, }, ), - returnValue: _i9.Future<_i4.Employee?>.value(), - ) as _i9.Future<_i4.Employee?>); + returnValue: _i10.Future<_i4.Employee?>.value(), + ) as _i10.Future<_i4.Employee?>); @override - _i9.Future> getEmployees() => (super.noSuchMethod( + _i10.Future> getEmployees() => (super.noSuchMethod( Invocation.method( #getEmployees, [], ), - returnValue: _i9.Future>.value(<_i4.Employee>[]), - ) as _i9.Future>); + returnValue: _i10.Future>.value(<_i4.Employee>[]), + ) as _i10.Future>); @override - _i9.Future<_i4.Employee?> getEmployee(String? id) => (super.noSuchMethod( + _i10.Future<_i4.Employee?> getEmployee(String? id) => (super.noSuchMethod( Invocation.method( #getEmployee, [id], ), - returnValue: _i9.Future<_i4.Employee?>.value(), - ) as _i9.Future<_i4.Employee?>); + returnValue: _i10.Future<_i4.Employee?>.value(), + ) as _i10.Future<_i4.Employee?>); @override - _i9.Future hasUser(String? email) => (super.noSuchMethod( + _i10.Future hasUser(String? email) => (super.noSuchMethod( Invocation.method( #hasUser, [email], ), - returnValue: _i9.Future.value(false), - ) as _i9.Future); + returnValue: _i10.Future.value(false), + ) as _i10.Future); @override - _i9.Future addEmployee(_i4.Employee? employee) => (super.noSuchMethod( + _i10.Future addEmployee(_i4.Employee? employee) => (super.noSuchMethod( Invocation.method( #addEmployee, [employee], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future updateEmployeeDetails({required _i4.Employee? employee}) => + _i10.Future updateEmployeeDetails({required _i4.Employee? employee}) => (super.noSuchMethod( Invocation.method( #updateEmployeeDetails, [], {#employee: employee}, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future changeEmployeeRoleType( + _i10.Future changeEmployeeRoleType( String? id, _i4.Role? role, ) => @@ -661,20 +675,20 @@ class MockEmployeeService extends _i1.Mock implements _i15.EmployeeService { role, ], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future deleteEmployee(String? id) => (super.noSuchMethod( + _i10.Future deleteEmployee(String? id) => (super.noSuchMethod( Invocation.method( #deleteEmployee, [id], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future changeAccountStatus({ + _i10.Future changeAccountStatus({ required String? id, required _i4.EmployeeStatus? status, }) => @@ -687,15 +701,15 @@ class MockEmployeeService extends _i1.Mock implements _i15.EmployeeService { #status: status, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); } /// A class which mocks [AuthService]. /// /// See the documentation for Mockito's code generation for more information. -class MockAuthService extends _i1.Mock implements _i16.AuthService { +class MockAuthService extends _i1.Mock implements _i17.AuthService { MockAuthService() { _i1.throwOnMissingStub(this); } @@ -717,19 +731,143 @@ class MockAuthService extends _i1.Mock implements _i16.AuthService { ), ) as _i7.FirebaseAuth); @override - _i9.Future<_i7.User?> signInWithGoogle() => (super.noSuchMethod( + _i10.Future<_i7.User?> signInWithGoogle() => (super.noSuchMethod( Invocation.method( #signInWithGoogle, [], ), - returnValue: _i9.Future<_i7.User?>.value(), - ) as _i9.Future<_i7.User?>); + returnValue: _i10.Future<_i7.User?>.value(), + ) as _i10.Future<_i7.User?>); @override - _i9.Future signOutWithGoogle() => (super.noSuchMethod( + _i10.Future signOutWithGoogle() => (super.noSuchMethod( Invocation.method( #signOutWithGoogle, [], ), - returnValue: _i9.Future.value(false), - ) as _i9.Future); + returnValue: _i10.Future.value(false), + ) as _i10.Future); +} + +/// A class which mocks [NotificationService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockNotificationService extends _i1.Mock + implements _i18.NotificationService { + MockNotificationService() { + _i1.throwOnMissingStub(this); + } + + @override + _i8.Client get httpClient => (super.noSuchMethod( + Invocation.getter(#httpClient), + returnValue: _FakeClient_6( + this, + Invocation.getter(#httpClient), + ), + ) as _i8.Client); + @override + _i10.Future dispose() => (super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); + @override + _i10.Future notifyHRForNewLeave({ + required String? name, + required String? reason, + required DateTime? startDate, + required DateTime? endDate, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #notifyHRForNewLeave, + [], + { + #name: name, + #reason: reason, + #startDate: startDate, + #endDate: endDate, + #receiver: receiver, + }, + ), + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); + @override + _i10.Future leaveResponse({ + required String? name, + required DateTime? startDate, + required DateTime? endDate, + required _i19.LeaveStatus? status, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #leaveResponse, + [], + { + #name: name, + #startDate: startDate, + #endDate: endDate, + #status: status, + #receiver: receiver, + }, + ), + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); + @override + String getFormatDate({ + required DateTime? startDate, + required DateTime? endDate, + }) => + (super.noSuchMethod( + Invocation.method( + #getFormatDate, + [], + { + #startDate: startDate, + #endDate: endDate, + }, + ), + returnValue: '', + ) as String); + @override + _i10.Future sendInviteNotification({ + required String? companyName, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendInviteNotification, + [], + { + #companyName: companyName, + #receiver: receiver, + }, + ), + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); + @override + _i10.Future sendSpaceInviteAcceptNotification({ + required String? sender, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendSpaceInviteAcceptNotification, + [], + { + #sender: sender, + #receiver: receiver, + }, + ), + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); } 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 4f1ad1d3b..2af730bd4 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 @@ -439,7 +439,7 @@ class MockNotificationService extends _i1.Mock returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future); @override - _i6.Future notifyHRForNewLeave({ + _i6.Future notifyHRForNewLeave({ required String? name, required String? reason, required DateTime? startDate, @@ -458,10 +458,11 @@ class MockNotificationService extends _i1.Mock #receiver: receiver, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override - _i6.Future leaveResponse({ + _i6.Future leaveResponse({ required String? name, required DateTime? startDate, required DateTime? endDate, @@ -480,8 +481,9 @@ class MockNotificationService extends _i1.Mock #receiver: receiver, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); @override String getFormatDate({ required DateTime? startDate, @@ -498,4 +500,38 @@ class MockNotificationService extends _i1.Mock ), returnValue: '', ) as String); + @override + _i6.Future sendInviteNotification({ + required String? companyName, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendInviteNotification, + [], + { + #companyName: companyName, + #receiver: receiver, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future sendSpaceInviteAcceptNotification({ + required String? sender, + required String? receiver, + }) => + (super.noSuchMethod( + Invocation.method( + #sendSpaceInviteAcceptNotification, + [], + { + #sender: sender, + #receiver: receiver, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); }