From 43a44971c63076233c9c98bbf05046425ef558c5 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 5 Aug 2024 13:26:05 +0700 Subject: [PATCH] TF-2934 Fix mailbox name with space only --- .../base/base_mailbox_controller.dart | 2 + .../destination_picker_controller.dart | 2 + .../exceptions/verify_name_exception.dart | 18 +++----- .../name_with_space_only_validator.dart | 20 ++++++++ .../validator_failure_extension.dart | 2 + .../mailbox_creator_controller.dart | 2 + .../name_with_space_only_validator_test.dart | 46 +++++++++++++++++++ 7 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 lib/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart create mode 100644 test/features/mailbox/presentation/utils/name_with_space_only_validator_test.dart diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index deb165e2e..854eca61a 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -38,6 +38,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.d import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/special_character_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; @@ -291,6 +292,7 @@ abstract class BaseMailboxController extends BaseController { ) { return verifyNameInteractor.execute(newName, [ EmptyNameValidator(), + NameWithSpaceOnlyValidator(), DuplicateNameValidator(listMailboxName), SpecialCharacterValidator() ]).fold((failure) { diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index 7a8480f41..eb77e50a2 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.d import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/special_character_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; @@ -205,6 +206,7 @@ class DestinationPickerController extends BaseMailboxController { nameMailbox, [ EmptyNameValidator(), + NameWithSpaceOnlyValidator(), DuplicateNameValidator(listMailboxNameAsStringExist), SpecialCharacterValidator() ] diff --git a/lib/features/mailbox_creator/domain/exceptions/verify_name_exception.dart b/lib/features/mailbox_creator/domain/exceptions/verify_name_exception.dart index 77eb70412..7fbcc7f4e 100644 --- a/lib/features/mailbox_creator/domain/exceptions/verify_name_exception.dart +++ b/lib/features/mailbox_creator/domain/exceptions/verify_name_exception.dart @@ -6,36 +6,32 @@ abstract class VerifyNameException extends Equatable implements Exception { static const duplicatedName = 'The name already exists!'; static const nameContainSpecialCharacter = 'The name cannot contain special characters'; static const emailAddressInvalid = 'The email address invalid'; + static const spaceOnlyWithinName = 'The name cannot contain only spaces'; final String? message; const VerifyNameException(this.message); + + @override + List get props => [message]; } class EmptyNameException extends VerifyNameException { const EmptyNameException() : super(VerifyNameException.emptyName); - - @override - List get props => []; } class DuplicatedNameException extends VerifyNameException { const DuplicatedNameException() : super(VerifyNameException.duplicatedName); - - @override - List get props => []; } class SpecialCharacterException extends VerifyNameException { const SpecialCharacterException() : super(VerifyNameException.nameContainSpecialCharacter); - - @override - List get props => []; } class EmailAddressInvalidException extends VerifyNameException { const EmailAddressInvalidException() : super(VerifyNameException.emailAddressInvalid); +} - @override - List get props => []; +class NameWithSpaceOnlyException extends VerifyNameException { + const NameWithSpaceOnlyException() : super(VerifyNameException.spaceOnlyWithinName); } \ No newline at end of file diff --git a/lib/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart b/lib/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart new file mode 100644 index 000000000..35e77211d --- /dev/null +++ b/lib/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart @@ -0,0 +1,20 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/exceptions/verify_name_exception.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; + +class NameWithSpaceOnlyValidator extends Validator { + + @override + Either validate(NewNameRequest value) { + if (value.value != null && value.value!.isNotEmpty && value.value!.trim().isEmpty) { + return Left(VerifyNameFailure(const NameWithSpaceOnlyException())); + } else { + return Right(VerifyNameViewState()); + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart b/lib/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart index 8cb3a9f6e..9ff8af9fe 100644 --- a/lib/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart +++ b/lib/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart @@ -20,6 +20,8 @@ extension ValicatorFailureExtension on VerifyNameFailure { return AppLocalizations.of(context).this_folder_name_is_already_taken; } else if (exception is SpecialCharacterException) { return AppLocalizations.of(context).folderNameCannotContainSpecialCharacters; + } else if (exception is NameWithSpaceOnlyException) { + return AppLocalizations.of(context).this_field_cannot_be_blank; } else { return ''; } diff --git a/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart b/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart index 21f298dbd..92fd4f160 100644 --- a/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart +++ b/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart @@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.d import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/special_character_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; @@ -122,6 +123,7 @@ class MailboxCreatorController extends BaseController { [ if (canCheckNameString) EmptyNameValidator(), + NameWithSpaceOnlyValidator(), DuplicateNameValidator(listMailboxNameAsStringExist), SpecialCharacterValidator() ] diff --git a/test/features/mailbox/presentation/utils/name_with_space_only_validator_test.dart b/test/features/mailbox/presentation/utils/name_with_space_only_validator_test.dart new file mode 100644 index 000000000..92d1d57da --- /dev/null +++ b/test/features/mailbox/presentation/utils/name_with_space_only_validator_test.dart @@ -0,0 +1,46 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/name_with_space_only_validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; + +void main() { + group('NameWithSpaceOnlyValidator::validate::test', () { + final validator = NameWithSpaceOnlyValidator(); + + test('should return failure when name is spaces only', () { + final result = validator.validate(NewNameRequest(' ')); + expect(result.isLeft(), isTrue); + result.fold( + (failure) => expect(failure, isA()), + (_) => fail('Expected a failure, but got a success.'), + ); + }); + + test('should return success when name is null', () { + final result = validator.validate(NewNameRequest(null)); + expect(result.isRight(), isTrue); + result.fold( + (_) => fail('Expected a success, but got a failure.'), + (success) => expect(success, isA()), + ); + }); + + test('should return success when name is empty', () { + final result = validator.validate(NewNameRequest('')); + expect(result.isRight(), isTrue); + result.fold( + (_) => fail('Expected a success, but got a failure.'), + (success) => expect(success, isA()), + ); + }); + + test('should return success when name is valid', () { + final result = validator.validate(NewNameRequest('validName')); + expect(result.isRight(), isTrue); + result.fold( + (_) => fail('Expected a success, but got a failure.'), + (success) => expect(success, isA()), + ); + }); + }); +} \ No newline at end of file