TF-2877 Create notification data source & repo
This commit is contained in:
+101
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user