feat(diary): tests

This commit is contained in:
mso7nueh
2026-05-04 17:36:48 +03:00
parent ea107ff07e
commit 91c8300da7
13 changed files with 2067 additions and 536 deletions

View File

@@ -1,270 +1,125 @@
import 'package:eatvio_app/core/constants/app_constants.dart';
import 'package:eatvio_app/core/utils/validation_utils.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ValidationUtils', () {
group('isValidEmail', () {
test('returns true for valid email', () {
expect(ValidationUtils.isValidEmail('test@example.com'), isTrue);
expect(ValidationUtils.isValidEmail('user.name@domain.co.uk'), isTrue);
});
test('returns false for invalid email', () {
expect(ValidationUtils.isValidEmail(''), isFalse);
expect(ValidationUtils.isValidEmail('invalid'), isFalse);
expect(ValidationUtils.isValidEmail('@example.com'), isFalse);
expect(ValidationUtils.isValidEmail('test@'), isFalse);
});
test('empty → false', () => expect(ValidationUtils.isValidEmail(''), false));
test('valid email', () => expect(ValidationUtils.isValidEmail('test@test.com'), true));
test('invalid email', () => expect(ValidationUtils.isValidEmail('not-an-email'), false));
test('email with dots', () => expect(ValidationUtils.isValidEmail('user.name@domain.co.uk'), true));
});
group('isValidPhone', () {
test('returns true for valid phone', () {
expect(ValidationUtils.isValidPhone('+79991234567'), isTrue);
});
test('returns false for invalid phone', () {
expect(ValidationUtils.isValidPhone(''), isFalse);
expect(ValidationUtils.isValidPhone('abc'), isFalse);
expect(ValidationUtils.isValidPhone('0123456789'), isFalse); // Starts with 0
});
test('empty → false', () => expect(ValidationUtils.isValidPhone(''), false));
test('valid phone +7', () => expect(ValidationUtils.isValidPhone('+79001234567'), true));
test('valid phone 8', () => expect(ValidationUtils.isValidPhone('89001234567'), true));
});
group('normalizePhone', () {
test('normalizes phone starting with +7', () {
expect(ValidationUtils.normalizePhone('+7 (915) 062 61 51'), '+79150626151');
});
test('normalizes phone starting with 8', () {
expect(ValidationUtils.normalizePhone('89150626151'), '+79150626151');
});
test('normalizes 10-digit phone', () {
expect(ValidationUtils.normalizePhone('9150626151'), '+79150626151');
});
test('returns empty string for empty input', () {
expect(ValidationUtils.normalizePhone(''), '');
});
test('returns empty string for input with no digits', () {
expect(ValidationUtils.normalizePhone('abc'), '');
test('empty → empty', () => expect(ValidationUtils.normalizePhone(''), ''));
test('starts with 8 → +7', () => expect(ValidationUtils.normalizePhone('89001234567'), '+79001234567'));
test('10 digits → +7 prefix', () => expect(ValidationUtils.normalizePhone('9001234567'), '+79001234567'));
test('already +7', () => expect(ValidationUtils.normalizePhone('+79001234567'), '+79001234567'));
test('with spaces and dashes', () {
final result = ValidationUtils.normalizePhone('+7 (900) 123-45-67');
expect(result, '+79001234567');
});
test('only non-digit chars → empty', () => expect(ValidationUtils.normalizePhone('abc'), ''));
});
group('isValidUrl', () {
test('returns true for valid URL', () {
expect(ValidationUtils.isValidUrl('https://example.com'), isTrue);
expect(ValidationUtils.isValidUrl('http://example.com'), isTrue);
});
test('returns false for invalid URL', () {
expect(ValidationUtils.isValidUrl(''), isFalse);
expect(ValidationUtils.isValidUrl('not a url'), isFalse);
});
test('empty → false', () => expect(ValidationUtils.isValidUrl(''), false));
test('valid URL', () => expect(ValidationUtils.isValidUrl('https://example.com'), true));
test('invalid URL', () => expect(ValidationUtils.isValidUrl('not a url'), false));
});
group('isValidTextLength', () {
test('returns true for text within max length', () {
expect(ValidationUtils.isValidTextLength('short text'), isTrue);
expect(ValidationUtils.isValidTextLength('text', maxLength: 10), isTrue);
});
test('returns false for text exceeding max length', () {
final longText = 'a' * (AppConstants.maxTextLength + 1);
expect(ValidationUtils.isValidTextLength(longText), isFalse);
expect(ValidationUtils.isValidTextLength('very long text', maxLength: 5), isFalse);
test('short text → true', () => expect(ValidationUtils.isValidTextLength('Hello'), true));
test('with custom maxLength', () {
expect(ValidationUtils.isValidTextLength('Hi', maxLength: 5), true);
expect(ValidationUtils.isValidTextLength('Hello World', maxLength: 5), false);
});
});
group('isValidTitleLength', () {
test('returns true for valid title', () {
expect(ValidationUtils.isValidTitleLength('Valid Title'), isTrue);
expect(ValidationUtils.isValidTitleLength('A'), isTrue);
});
test('returns false for invalid title', () {
expect(ValidationUtils.isValidTitleLength(''), isFalse);
final longTitle = 'a' * (AppConstants.maxTitleLength + 1);
expect(ValidationUtils.isValidTitleLength(longTitle), isFalse);
});
test('empty → false', () => expect(ValidationUtils.isValidTitleLength(''), false));
test('non-empty → true', () => expect(ValidationUtils.isValidTitleLength('Title'), true));
});
group('isValidDescriptionLength', () {
test('returns true for valid description', () {
expect(ValidationUtils.isValidDescriptionLength('Valid description'), isTrue);
expect(ValidationUtils.isValidDescriptionLength(''), isTrue);
});
test('returns false for description exceeding max length', () {
final longDescription = 'a' * (AppConstants.maxDescriptionLength + 1);
expect(ValidationUtils.isValidDescriptionLength(longDescription), isFalse);
});
test('short description → true', () => expect(ValidationUtils.isValidDescriptionLength('Desc'), true));
});
group('isValidPassword', () {
test('returns true for valid password', () {
expect(ValidationUtils.isValidPassword('password123'), isTrue);
expect(ValidationUtils.isValidPassword('Pass1234'), isTrue);
});
test('returns false for invalid password', () {
expect(ValidationUtils.isValidPassword(''), isFalse);
expect(ValidationUtils.isValidPassword('short'), isFalse);
expect(ValidationUtils.isValidPassword('onlyletters'), isFalse);
expect(ValidationUtils.isValidPassword('12345678'), isFalse);
});
test('too short → false', () => expect(ValidationUtils.isValidPassword('Ab1'), false));
test('no digits → false', () => expect(ValidationUtils.isValidPassword('abcdefgh'), false));
test('no letters → false', () => expect(ValidationUtils.isValidPassword('12345678'), false));
test('valid password', () => expect(ValidationUtils.isValidPassword('abcdef12'), true));
});
group('isValidUsername', () {
test('returns true for valid username', () {
expect(ValidationUtils.isValidUsername('user123'), isTrue);
expect(ValidationUtils.isValidUsername('user_name'), isTrue);
expect(ValidationUtils.isValidUsername('abc'), isTrue);
});
test('returns false for invalid username', () {
expect(ValidationUtils.isValidUsername(''), isFalse);
expect(ValidationUtils.isValidUsername('ab'), isFalse);
expect(ValidationUtils.isValidUsername('a' * 21), isFalse);
expect(ValidationUtils.isValidUsername('user-name'), isFalse);
expect(ValidationUtils.isValidUsername('user name'), isFalse);
});
test('too short → false', () => expect(ValidationUtils.isValidUsername('ab'), false));
test('too long → false', () => expect(ValidationUtils.isValidUsername('a' * 21), false));
test('valid username', () => expect(ValidationUtils.isValidUsername('user_123'), true));
test('special chars → false', () => expect(ValidationUtils.isValidUsername('user@name'), false));
});
group('getValidationErrorMessage', () {
test('returns error for null value', () {
expect(ValidationUtils.getValidationErrorMessage(null, ValidationType.email), 'Поле не может быть пустым');
expect(ValidationUtils.getValidationErrorMessage(null, ValidationType.phone), 'Поле не может быть пустым');
expect(ValidationUtils.getValidationErrorMessage(null, ValidationType.url), 'Поле не может быть пустым');
test('null value → error', () {
expect(ValidationUtils.getValidationErrorMessage(null, ValidationType.email), isNotNull);
});
test('returns error for empty value', () {
expect(ValidationUtils.getValidationErrorMessage('', ValidationType.email), 'Поле не может быть пустым');
expect(ValidationUtils.getValidationErrorMessage('', ValidationType.password), 'Поле не может быть пустым');
expect(ValidationUtils.getValidationErrorMessage('', ValidationType.username), 'Поле не может быть пустым');
test('empty value → error', () {
expect(ValidationUtils.getValidationErrorMessage('', ValidationType.email), isNotNull);
});
test('returns null for valid email', () {
expect(ValidationUtils.getValidationErrorMessage('test@example.com', ValidationType.email), isNull);
test('valid email → null', () {
expect(ValidationUtils.getValidationErrorMessage('test@test.com', ValidationType.email), isNull);
});
test('returns error for invalid email', () {
expect(ValidationUtils.getValidationErrorMessage('invalid', ValidationType.email), 'Введите корректный email');
test('invalid email → error msg', () {
expect(ValidationUtils.getValidationErrorMessage('not-email', ValidationType.email), isNotNull);
});
test('returns null for valid phone', () {
expect(ValidationUtils.getValidationErrorMessage('+79991234567', ValidationType.phone), isNull);
test('valid phone → null', () {
expect(ValidationUtils.getValidationErrorMessage('+79001234567', ValidationType.phone), isNull);
});
test('returns error for invalid phone', () {
expect(ValidationUtils.getValidationErrorMessage('abc', ValidationType.phone), 'Введите корректный номер телефона');
test('invalid phone → error msg', () {
expect(ValidationUtils.getValidationErrorMessage('abc', ValidationType.phone), isNotNull);
});
test('returns null for valid URL', () {
test('valid url → null', () {
expect(ValidationUtils.getValidationErrorMessage('https://example.com', ValidationType.url), isNull);
});
test('returns error for invalid URL', () {
expect(ValidationUtils.getValidationErrorMessage('not a url', ValidationType.url), 'Введите корректный URL');
test('valid password → null', () {
expect(ValidationUtils.getValidationErrorMessage('password1', ValidationType.password), isNull);
});
test('returns null for valid password', () {
expect(ValidationUtils.getValidationErrorMessage('password123', ValidationType.password), isNull);
test('invalid password → error msg', () {
expect(ValidationUtils.getValidationErrorMessage('short', ValidationType.password), isNotNull);
});
test('returns error for invalid password', () {
expect(ValidationUtils.getValidationErrorMessage('short', ValidationType.password), 'Пароль должен содержать минимум 8 символов, включая буквы и цифры');
test('valid username → null', () {
expect(ValidationUtils.getValidationErrorMessage('user_123', ValidationType.username), isNull);
});
test('returns null for valid username', () {
expect(ValidationUtils.getValidationErrorMessage('user123', ValidationType.username), isNull);
test('invalid username → error msg', () {
expect(ValidationUtils.getValidationErrorMessage('ab', ValidationType.username), isNotNull);
});
test('returns error for invalid username', () {
expect(ValidationUtils.getValidationErrorMessage('ab', ValidationType.username), 'Имя пользователя должно содержать от 3 до 20 символов (буквы, цифры, подчеркивания)');
test('valid title → null', () {
expect(ValidationUtils.getValidationErrorMessage('Title', ValidationType.title), isNull);
});
test('returns null for valid title', () {
expect(ValidationUtils.getValidationErrorMessage('Valid Title', ValidationType.title), isNull);
test('valid description → null', () {
expect(ValidationUtils.getValidationErrorMessage('Description', ValidationType.description), isNull);
});
test('returns error for invalid title', () {
expect(ValidationUtils.getValidationErrorMessage('', ValidationType.title), 'Поле не может быть пустым');
final longTitle = 'a' * (AppConstants.maxTitleLength + 1);
expect(ValidationUtils.getValidationErrorMessage(longTitle, ValidationType.title), 'Заголовок не может быть пустым и должен содержать не более ${AppConstants.maxTitleLength} символов');
});
test('returns null for valid description', () {
expect(ValidationUtils.getValidationErrorMessage('Valid description', ValidationType.description), isNull);
expect(ValidationUtils.getValidationErrorMessage('', ValidationType.description), 'Поле не может быть пустым');
});
test('returns error for invalid description', () {
final longDescription = 'a' * (AppConstants.maxDescriptionLength + 1);
expect(ValidationUtils.getValidationErrorMessage(longDescription, ValidationType.description), 'Описание не может содержать более ${AppConstants.maxDescriptionLength} символов');
});
test('returns null for valid text', () {
expect(ValidationUtils.getValidationErrorMessage('Valid text', ValidationType.text), isNull);
});
test('returns error for invalid text', () {
final longText = 'a' * (AppConstants.maxTextLength + 1);
expect(ValidationUtils.getValidationErrorMessage(longText, ValidationType.text), 'Текст не может содержать более ${AppConstants.maxTextLength} символов');
});
});
group('ValidationType enum', () {
test('has all expected values', () {
expect(ValidationType.values.length, 8);
expect(ValidationType.values, contains(ValidationType.email));
expect(ValidationType.values, contains(ValidationType.phone));
expect(ValidationType.values, contains(ValidationType.url));
expect(ValidationType.values, contains(ValidationType.password));
expect(ValidationType.values, contains(ValidationType.username));
expect(ValidationType.values, contains(ValidationType.title));
expect(ValidationType.values, contains(ValidationType.description));
expect(ValidationType.values, contains(ValidationType.text));
});
test('can access by name', () {
expect(ValidationType.values.byName('email'), ValidationType.email);
expect(ValidationType.values.byName('phone'), ValidationType.phone);
expect(ValidationType.values.byName('url'), ValidationType.url);
});
});
group('Edge cases', () {
test('isValidEmail handles special characters', () {
expect(ValidationUtils.isValidEmail('test+tag@example.com'), isTrue);
expect(ValidationUtils.isValidEmail('test.email@example.co.uk'), isTrue);
});
test('isValidPhone handles various formats', () {
expect(ValidationUtils.isValidPhone('+1234567890'), isTrue);
expect(ValidationUtils.isValidPhone('1234567890'), isTrue);
expect(ValidationUtils.isValidPhone('+123'), isTrue);
});
test('isValidUrl handles various protocols', () {
expect(ValidationUtils.isValidUrl('https://example.com'), isTrue);
expect(ValidationUtils.isValidUrl('http://example.com'), isTrue);
expect(ValidationUtils.isValidUrl('https://www.example.com/path?query=value'), isTrue);
});
test('isValidPassword handles edge cases', () {
expect(ValidationUtils.isValidPassword('Password1'), isTrue);
expect(ValidationUtils.isValidPassword('PASSWORD123'), isTrue);
expect(ValidationUtils.isValidPassword('password1'), isTrue);
expect(ValidationUtils.isValidPassword('1234567a'), isTrue);
});
test('isValidUsername handles edge cases', () {
expect(ValidationUtils.isValidUsername('a' * 3), isTrue);
expect(ValidationUtils.isValidUsername('a' * 20), isTrue);
expect(ValidationUtils.isValidUsername('user_123'), isTrue);
expect(ValidationUtils.isValidUsername('123user'), isTrue);
test('valid text → null', () {
expect(ValidationUtils.getValidationErrorMessage('Some text', ValidationType.text), isNull);
});
});
});