TF-2877 Create notification data source & repo

This commit is contained in:
DatDang
2024-06-04 10:02:19 +07:00
committed by Dat H. Pham
parent 2652a99e0e
commit b89820618c
16 changed files with 550 additions and 2 deletions
@@ -0,0 +1,101 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/notification_datasource_impl.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
import 'package:tmail_ui_user/main/permissions/notification_permission_service.dart';
import 'notification_datasource_impl_test.mocks.dart';
@GenerateNiceMocks([
MockSpec<NotificationPermissionService>(),
MockSpec<ExceptionThrower>()])
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final permissionService = MockNotificationPermissionService();
final exceptionThrower = MockExceptionThrower();
final notificationDatasourceImpl = NotificationDataSourceImpl(
permissionService,
exceptionThrower);
final userName = UserName('value');
void setMockNotificationPermission({
VoidCallback? openAppSettingsCallback,
}) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('com.spencerccf.app_settings/methods'),
(message) async {
if (message.method == 'openSettings') {
openAppSettingsCallback?.call();
return true;
}
return null;
});
}
group('notification datasource test:', () {
group('getAppNotificationSetting test:', () {
test(
'should return true '
'when user grants notification permission',
() async {
// arrange
debugDefaultTargetPlatformOverride = TargetPlatform.android;
when(permissionService.checkNotificationPermissionEnabled(any)).thenAnswer((_) async => true);
// act
final result = await notificationDatasourceImpl.getNotificationSetting(userName);
// assert
verify(permissionService.checkNotificationPermissionEnabled(userName.value));
expect(result, true);
debugDefaultTargetPlatformOverride = null;
});
test(
'should return false '
'when user denies notification permission',
() async {
// arrange
debugDefaultTargetPlatformOverride = TargetPlatform.android;
when(permissionService.checkNotificationPermissionEnabled(any)).thenAnswer((_) async => false);
// act
final result = await notificationDatasourceImpl.getNotificationSetting(userName);
// assert
verify(permissionService.checkNotificationPermissionEnabled(userName.value));
expect(result, false);
debugDefaultTargetPlatformOverride = null;
});
});
group('toggleAppNotificationSetting test:', () {
test(
'should call openAppSettings '
'when user toggles notification setting on',
() async {
// arrange
debugDefaultTargetPlatformOverride = TargetPlatform.android;
bool openAppSettingsCalled = false;
setMockNotificationPermission(openAppSettingsCallback: () {
openAppSettingsCalled = true;
});
// act
await notificationDatasourceImpl.toggleNotificationSetting();
// assert
expect(openAppSettingsCalled, true);
debugDefaultTargetPlatformOverride = null;
});
});
});
}
@@ -0,0 +1,48 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:tmail_ui_user/features/manage_account/data/datasource/notification_datasource.dart';
import 'package:tmail_ui_user/features/manage_account/data/repository/notification_repository_impl.dart';
import 'notification_repository_impl_test.mocks.dart';
@GenerateNiceMocks([MockSpec<NotificationDataSource>()])
void main() {
final notificationDataSource = MockNotificationDataSource();
final notificationRepositoryImpl = NotificationRepositoryImpl(notificationDataSource);
final userName = UserName('value');
group('notification repository impl test:', () {
test(
'should call getNotificationSetting '
'when getNotificationSetting in datasource is called',
() {
// arrange
when(notificationDataSource.getNotificationSetting(any))
.thenAnswer((_) async => true);
// act
notificationRepositoryImpl.getNotificationSetting(userName);
// assert
verify(notificationDataSource.getNotificationSetting(userName)).called(1);
});
test(
'should call toggleNotificationSetting '
'when toggleNotificationSetting in datasource is called',
() {
// arrange
when(notificationDataSource.toggleNotificationSetting())
.thenAnswer((_) async => true);
// act
notificationRepositoryImpl.toggleNotificationSetting();
// assert
verify(notificationDataSource.toggleNotificationSetting()).called(1);
});
});
}
@@ -0,0 +1,123 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:tmail_ui_user/features/base/isolate/background_isolate_binary_messenger/background_isolate_binary_messenger_mobile.dart';
import 'package:tmail_ui_user/main/permissions/notification_permission_service.dart';
class TestNotificationPermissionService extends NotificationPermissionService {
bool callCheckGroupPermission = false;
@override
Future<bool> checkGroupPermissionByGroupId(String groupId) {
callCheckGroupPermission = true;
return super.checkGroupPermissionByGroupId(groupId);
}
}
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final notificationPermissionService = TestNotificationPermissionService();
void setMockNotificationPermission({
required PermissionStatus currentStatus,
PermissionStatus? requestedStatus,
}) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('flutter.baseflow.com/permissions/methods'),
(message) async {
if (message.method == 'checkPermissionStatus') {
return currentStatus.index;
} else if (message.method == 'requestPermissions') {
assert(
requestedStatus != null,
'mock requested status must not be null '
'when requesting permission');
return {Permission.notification.value: requestedStatus!.index};
}
return null;
});
}
void setMockNotificationGroupStatus({
required bool groupIsBlocked,
}) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('com.linagora.android.teammail.notification.group.permission'),
(message) async {
if (message.method == 'getNotificationGroupPermission') {
return groupIsBlocked;
}
return null;
});
}
group('notification permission service test', () {
test(
'should return false '
'when checkGroupPermission is called '
'and group id is empty',
() async {
// arrange
setMockNotificationGroupStatus(groupIsBlocked: true);
// act
final result = await notificationPermissionService.checkGroupPermissionByGroupId('');
// assert
expect(notificationPermissionService.callCheckGroupPermission, true);
expect(result, false);
});
test(
'should return the status of notification group '
'when checkGroupPermission is called '
'and group id is not empty',
() async {
// arrange
setMockNotificationGroupStatus(groupIsBlocked: true);
// act
final result = await notificationPermissionService.checkGroupPermissionByGroupId('test');
// assert
expect(notificationPermissionService.callCheckGroupPermission, true);
expect(result, true);
});
test(
'should return false '
'when checkNotificationPermissionEnabled is called '
'and permission is not granted',
() async {
// arrange
setMockNotificationPermission(currentStatus: PermissionStatus.permanentlyDenied);
// act
final result = await notificationPermissionService.checkNotificationPermissionEnabled('');
// assert
expect(result, false);
});
test(
'should return the status of notification group '
'when checkNotificationPermissionEnabled is called '
'and permission is not granted',
() async {
// arrange
setMockNotificationPermission(currentStatus: PermissionStatus.granted);
setMockNotificationGroupStatus(groupIsBlocked: true);
// act
final result = await notificationPermissionService.checkGroupPermissionByGroupId('test');
// assert
expect(result, true);
});
});
}
@@ -0,0 +1,84 @@
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:tmail_ui_user/main/permissions/permission_service.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final permissionService = PermissionService();
void setMockNotificationPermission({
required PermissionStatus currentStatus,
PermissionStatus? requestedStatus,
}) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('flutter.baseflow.com/permissions/methods'),
(message) async {
if (message.method == 'checkPermissionStatus') {
return currentStatus.index;
} else if (message.method == 'requestPermissions') {
assert(
requestedStatus != null,
'mock requested status must not be null '
'when requesting permission');
return {Permission.notification.value: requestedStatus!.index};
}
return null;
});
}
group('permission service test:', () {
group('isGranted test:', () {
test(
'should return true '
'when permission is granted before',
() async {
// arrange
setMockNotificationPermission(currentStatus: PermissionStatus.granted);
// act
final result = await permissionService.isGranted(Permission.notification);
// assert
expect(result, true);
});
test(
'should return true '
'when permission is not granted before '
'and granted when request',
() async {
// arrange
setMockNotificationPermission(
currentStatus: PermissionStatus.denied,
requestedStatus: PermissionStatus.granted);
// act
final result = await permissionService.isGranted(Permission.notification);
// assert
expect(result, true);
});
test(
'should return false '
'when permission is not granted before '
'and denied when request',
() async {
// arrange
setMockNotificationPermission(
currentStatus: PermissionStatus.denied,
requestedStatus: PermissionStatus.denied);
// act
final result = await permissionService.isGranted(Permission.notification);
// assert
expect(result, false);
});
});
});
}