MotorSignal-App/test/handle_validator_test.dart

86 lines
2.7 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:motorcycle_dash/services/social/handle_validator.dart';
void main() {
group('HandleValidator', () {
test('accepts valid handles', () {
final validCases = [
'canyon_rider',
'apex_hunter99',
'moto_gp',
'speedy',
'r1200gs',
'moto_pilot_2026',
];
for (final handle in validCases) {
final result = HandleValidator.validate(handle);
expect(result.isValid, isTrue, reason: 'Expected $handle to be valid');
expect(result.normalizedHandle, equals(handle.toLowerCase().trim()));
expect(result.error, isNull);
}
});
test('normalizes handles with uppercase and whitespace', () {
final result = HandleValidator.validate(' Apex_Rider ');
expect(result.isValid, isTrue);
expect(result.normalizedHandle, equals('apex_rider'));
});
test('rejects empty or blank handles', () {
expect(HandleValidator.validate('').isValid, isFalse);
expect(HandleValidator.validate(' ').isValid, isFalse);
});
test('rejects handles shorter than 3 characters', () {
final result = HandleValidator.validate('ab');
expect(result.isValid, isFalse);
expect(result.error, contains('at least 3 characters'));
});
test('rejects handles longer than 20 characters', () {
final result = HandleValidator.validate('this_handle_is_way_too_long_for_system');
expect(result.isValid, isFalse);
expect(result.error, contains('cannot exceed 20 characters'));
});
test('rejects handles not starting with a letter', () {
expect(HandleValidator.validate('99riders').isValid, isFalse);
expect(HandleValidator.validate('_speedy').isValid, isFalse);
});
test('rejects invalid characters like hyphens, spaces, and punctuation', () {
expect(HandleValidator.validate('moto-rider').isValid, isFalse);
expect(HandleValidator.validate('moto rider').isValid, isFalse);
expect(HandleValidator.validate('moto@dash').isValid, isFalse);
expect(HandleValidator.validate('moto!rider').isValid, isFalse);
});
test('rejects reserved handles', () {
final reserved = [
'admin',
'administrator',
'motorsignal',
'motorcloud',
'support',
'system',
'mod',
'moderator',
'help',
'official',
'root',
'api',
'bot',
'guest',
'anonymous',
];
for (final handle in reserved) {
final result = HandleValidator.validate(handle);
expect(result.isValid, isFalse, reason: 'Expected reserved handle $handle to fail');
expect(result.error, contains('reserved'));
}
});
});
}