TF-2517 Fix rename/create a folder with special characters do not show error message

This commit is contained in:
dab246
2024-08-05 12:40:26 +07:00
committed by Dat H. Pham
parent 8d8d23529b
commit f77d62831c
7 changed files with 64 additions and 10 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/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';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
@@ -291,6 +292,7 @@ abstract class BaseMailboxController extends BaseController {
return verifyNameInteractor.execute(newName, [
EmptyNameValidator(),
DuplicateNameValidator(listMailboxName),
SpecialCharacterValidator()
]).fold((failure) {
if (failure is VerifyNameFailure) {
return failure.getMessage(context, actions: mailboxActions);
@@ -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/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';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
@@ -205,6 +206,7 @@ class DestinationPickerController extends BaseMailboxController {
[
EmptyNameValidator(),
DuplicateNameValidator(listMailboxNameAsStringExist),
SpecialCharacterValidator()
]
).fold(
(failure) {
@@ -0,0 +1,15 @@
extension MailboxNameSpecialCharacterValidatorExtension on String {
bool get isValid {
if (startsWith('#')) {
return false;
}
final forbiddenChars = RegExp(r'[%*\r\n]');
if (forbiddenChars.hasMatch(this)) {
return false;
}
return true;
}
}
@@ -1,6 +0,0 @@
extension NameValidatorStringExtension on String {
bool hasSpecialCharactersInName() {
return RegExp(r'(?=.*?[#?!@$%^&*)(=+}{:;?/|\\><.,`~])').hasMatch(this);
}
}
@@ -1,8 +1,8 @@
import 'package:core/core.dart';
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/extensions/name_validator_string_extension.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/extensions/mailbox_name_special_character_validator_extension.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';
@@ -11,7 +11,7 @@ class SpecialCharacterValidator extends Validator<NewNameRequest> {
@override
Either<Failure, Success> validate(NewNameRequest value) {
if (value.value != null && value.value!.hasSpecialCharactersInName()) {
if (value.value != null && !value.value!.isValid) {
return Left<Failure, Success>(VerifyNameFailure(const SpecialCharacterException()));
} else {
return Right<Failure, Success>(VerifyNameViewState());
@@ -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/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';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
@@ -122,6 +123,7 @@ class MailboxCreatorController extends BaseController {
if (canCheckNameString)
EmptyNameValidator(),
DuplicateNameValidator(listMailboxNameAsStringExist),
SpecialCharacterValidator()
]
).fold(
(failure) {
@@ -0,0 +1,39 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/extensions/mailbox_name_special_character_validator_extension.dart';
void main() {
group('isValid::test', () {
test('should return true for a valid string', () {
expect('hello'.isValid, isTrue);
});
test('should return false for a string starting with #', () {
expect('#hello'.isValid, isFalse);
});
test('should return false for a string containing %', () {
expect('hello%world'.isValid, isFalse);
});
test('should return false for a string containing *', () {
expect('hello*world'.isValid, isFalse);
});
test('should return false for a string containing \\n', () {
expect('hello\nworld'.isValid, isFalse);
});
test('should return false for a string containing \\r', () {
expect('hello\rworld'.isValid, isFalse);
});
test('should return true for an empty string', () {
expect(''.isValid, isTrue);
});
test('should return true for a string with no forbidden characters and not starting with #', () {
expect('validString123'.isValid, isTrue);
});
});
}