TF-2934 Fix mailbox name with space only

This commit is contained in:
dab246
2024-08-05 13:26:05 +07:00
committed by Dat H. Pham
parent a3d17b3bb2
commit 43a44971c6
7 changed files with 81 additions and 11 deletions
@@ -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) {
@@ -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()
]
@@ -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<Object?> get props => [message];
}
class EmptyNameException extends VerifyNameException {
const EmptyNameException() : super(VerifyNameException.emptyName);
@override
List<Object> get props => [];
}
class DuplicatedNameException extends VerifyNameException {
const DuplicatedNameException() : super(VerifyNameException.duplicatedName);
@override
List<Object> get props => [];
}
class SpecialCharacterException extends VerifyNameException {
const SpecialCharacterException() : super(VerifyNameException.nameContainSpecialCharacter);
@override
List<Object> get props => [];
}
class EmailAddressInvalidException extends VerifyNameException {
const EmailAddressInvalidException() : super(VerifyNameException.emailAddressInvalid);
}
@override
List<Object> get props => [];
class NameWithSpaceOnlyException extends VerifyNameException {
const NameWithSpaceOnlyException() : super(VerifyNameException.spaceOnlyWithinName);
}
@@ -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<NewNameRequest> {
@override
Either<Failure, Success> validate(NewNameRequest value) {
if (value.value != null && value.value!.isNotEmpty && value.value!.trim().isEmpty) {
return Left<Failure, Success>(VerifyNameFailure(const NameWithSpaceOnlyException()));
} else {
return Right<Failure, Success>(VerifyNameViewState());
}
}
}
@@ -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 '';
}
@@ -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()
]
@@ -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<VerifyNameFailure>()),
(_) => 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<VerifyNameViewState>()),
);
});
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<VerifyNameViewState>()),
);
});
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<VerifyNameViewState>()),
);
});
});
}