Files
Qlyra/test/text_entities_test.dart
T
sevenhill f74057ce9b
Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
Rebrand application as Qlyra
2026-08-30 13:16:17 +03:00

86 lines
3.0 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:qlyra/core/utils/text_entities.dart';
void main() {
group('detectTextEntities', () {
test('finds a phone and a card in one message', () {
final found = detectTextEntities('+70001234567 тест 2200123456789019');
expect(found, hasLength(2));
expect(found.first.kind, TextEntityKind.phone);
expect(found.first.value, '+70001234567');
expect(found.last.kind, TextEntityKind.card);
expect(found.last.value, '2200123456789019');
});
test('finds a bare russian phone and a spaced card', () {
final found = detectTextEntities('80001234567 и 2200 1234 5678 9019');
expect(found.map((e) => e.kind), [
TextEntityKind.phone,
TextEntityKind.card,
]);
expect(found.first.value, '+80001234567');
expect(found.last.value, '2200123456789019');
});
test('ignores digits that are not a valid card', () {
expect(detectTextEntities('111411200327680777'), isEmpty);
expect(detectTextEntities('2200123456789018'), isEmpty);
expect(detectTextEntities('1234567890123456'), isEmpty);
});
test('ignores timestamps and short numbers', () {
expect(detectTextEntities('05:46:16 1785041009832'), isEmpty);
});
test('finds a nickname but not an email', () {
final found = detectTextEntities('привет @ExampleBot и mail@ya.ru');
expect(found, hasLength(1));
expect(found.single.kind, TextEntityKind.mention);
expect(found.single.value, 'ExampleBot');
expect(found.single.start, 7);
expect(found.single.end, 18);
});
test('finds a formatted profile phone', () {
final found = detectTextEntities('+7 (000) 123-45-67');
expect(found, hasLength(1));
expect(found.single.kind, TextEntityKind.phone);
expect(found.single.value, '+70001234567');
});
test('skips ranges that are already claimed', () {
const text = 'https://max.ru/ExampleBot';
expect(
detectTextEntities(text, skip: [(start: 0, end: text.length)]),
isEmpty,
);
});
});
group('card metadata', () {
test('recognises payment systems by BIN', () {
expect(cardBrand('2200123456789019'), 'MIR');
expect(cardBrand('4111111111111111'), 'VISA');
expect(cardBrand('5500000000000004'), 'MASTERCARD');
expect(cardBrand('340000000000009'), 'AMEX');
expect(cardBrand('6200000000000005'), 'UNIONPAY');
expect(cardBrand('1234567890123456'), isNull);
});
test('builds the mask shown in the action menu', () {
expect(cardMask('2200123456789019'), 'MIR*9019');
expect(cardBrandTitle('2200123456789019'), 'МИР');
});
test('formats a card number in groups of four', () {
expect(formatCardNumber('2200123456789019'), '2200 1234 5678 9019');
});
test('luhn rejects a corrupted number', () {
expect(isLuhnValid('2200123456789019'), isTrue);
expect(isLuhnValid('2200123456789018'), isFalse);
});
});
}