Files
IKAR/test/likely_forwarded_mark_test.dart
T

127 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:ikar/backend/modules/messages.dart';
import 'package:ikar/core/config/qlyra_settings.dart';
import 'package:ikar/frontend/widgets/attachment/bubbles/meta_marks.dart';
import 'package:ikar/frontend/widgets/message_bubble.dart';
import 'package:ikar/l10n/app_localizations.dart';
const int _me = 1;
const int _peer = 2;
const String _hint = 'Сообщения скорее всего пересланы';
const int _window = MessageBubble.forwardBurstWindowMs;
final int _instant = DateTime(2026, 1, 1, 12, 30).millisecondsSinceEpoch;
CachedMessage _message(String id, {int? time, int sender = _peer}) =>
CachedMessage.fromPushPayload(_me, _peer, {
'id': id,
'time': time ?? _instant,
'type': 'USER',
'sender': sender,
'text': 'Сообщение $id',
});
Future<void> _pump(WidgetTester tester, List<CachedMessage> messages) async {
await tester.pumpWidget(
MaterialApp(
locale: const Locale('ru'),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
for (var i = 0; i < messages.length; i++)
MessageBubble(
message: messages[i],
isMe: messages[i].senderId == _me,
myId: _me,
prevMessage: i > 0 ? messages[i - 1] : null,
nextMessage: i < messages.length - 1 ? messages[i + 1] : null,
chatType: 'DIALOG',
),
],
),
),
),
);
await tester.pump();
}
Finder get _marks => find.descendant(
of: find.byType(LikelyForwardedMark),
matching: find.byType(Icon),
);
void main() {
setUp(() => QlyraSettings.showForward.value = true);
tearDown(() => QlyraSettings.showForward.value = false);
testWidgets('метка стоит на каждом сообщении, ушедшем одной пачкой', (
tester,
) async {
await _pump(tester, [
_message('101', time: _instant - 60000),
_message('102'),
_message('103', time: _instant + 144),
_message('104', time: _instant + 144 + _window),
_message('105', time: _instant + 144 + _window * 2 + 1),
]);
expect(_marks, findsNWidgets(3));
});
testWidgets('сообщение вне окна пачки остаётся без метки', (tester) async {
await _pump(tester, [
_message('101', time: _instant - _window - 1),
_message('102'),
_message('103', time: _instant + _window + 1),
]);
expect(_marks, findsNothing);
});
testWidgets('близкие по времени сообщения разных авторов не помечаются', (
tester,
) async {
await _pump(tester, [_message('101'), _message('102', sender: _me)]);
expect(_marks, findsNothing);
});
testWidgets('метка слева от времени и по тапу объясняет себя', (
tester,
) async {
await _pump(tester, [_message('101'), _message('102')]);
final mark = tester.getRect(_marks.first);
final clock = tester.getRect(find.text('12:30').first);
expect(mark.right, lessThanOrEqualTo(clock.left));
await tester.tap(_marks.first);
await tester.pump();
await tester.pump(const Duration(milliseconds: 200));
expect(find.text(_hint), findsOneWidget);
await tester.pump(const Duration(seconds: 3));
await tester.pumpAndSettle();
expect(find.text(_hint), findsNothing);
});
testWidgets('настройка включает и выключает метку на лету', (tester) async {
QlyraSettings.showForward.value = false;
await _pump(tester, [_message('101'), _message('102')]);
expect(_marks, findsNothing);
QlyraSettings.showForward.value = true;
await tester.pump();
expect(_marks, findsNWidgets(2));
QlyraSettings.showForward.value = false;
await tester.pump();
expect(_marks, findsNothing);
});
}