aslan-flutter/test/room_rocket_ui_test.dart
2026-07-15 10:21:00 +08:00

168 lines
4.9 KiB
Dart

import 'package:aslan/chatvibe_data/models/message/at_floating_message.dart';
import 'package:aslan/chatvibe_domain/models/res/at_room_rocket_reward_res.dart';
import 'package:aslan/chatvibe_ui/widgets/room/rocket/room_rocket_floating_popup.dart';
import 'package:aslan/chatvibe_ui/widgets/room/rocket/room_rocket_reward_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
setUp(() {
TestWidgetsFlutterBinding
.instance
.platformDispatcher
.views
.first
.physicalSize = const Size(375, 812);
TestWidgetsFlutterBinding
.instance
.platformDispatcher
.views
.first
.devicePixelRatio = 1;
});
tearDown(() {
TestWidgetsFlutterBinding.instance.platformDispatcher.views.first
.resetPhysicalSize();
TestWidgetsFlutterBinding.instance.platformDispatcher.views.first
.resetDevicePixelRatio();
});
test('rocket reward parses the current backend API and IM fields', () {
final ATRoomRocketRewardRes apiReward =
ATRoomRocketRewardRes.fromJson(<String, dynamic>{
'rewardType': 'GOLD',
'rewardItemId': 12,
'rewardItemName': 'Gold',
'rewardAmount': 18800,
'cover': 'https://example.test/gold.png',
'rocketLevel': 2,
'message': 'Congratulations',
});
final ATRoomRocketRewardRes messageReward =
ATRoomRocketRewardRes.fromJson(<String, dynamic>{
'rewardType': 'PROP',
'cover': 'https://example.test/frame.png',
'rocketLevel': 3,
'userId': 10002,
'userNickname': 'Rocket Cat',
});
expect(apiReward.rewardItemId, '12');
expect(apiReward.displayLabel, '18800');
expect(messageReward.userId, '10002');
expect(messageReward.userNickname, 'Rocket Cat');
});
testWidgets(
'rocket floating window no longer opens the reward dialog on tap',
(tester) async {
await tester.pumpWidget(
ScreenUtilInit(
designSize: const Size(375, 812),
minTextAdapt: true,
builder:
(_, __) => MaterialApp(
home: Scaffold(
body: RoomRocketFloatingPopup(
message: ATFloatingMessage(
type: 3,
roomId: '',
userName: 'Igniter',
userId: '163526',
rocketLevel: 2,
),
onAnimationCompleted: () {},
),
),
),
),
);
await tester.pump();
await tester.pump(const Duration(milliseconds: 1500));
expect(find.text('Igniter'), findsOneWidget);
await tester.tap(find.byType(RoomRocketFloatingPopup));
await tester.pump(const Duration(milliseconds: 400));
expect(find.byType(RoomRocketRewardPage), findsNothing);
await tester.pumpWidget(const SizedBox());
await tester.pump(const Duration(seconds: 4));
},
);
testWidgets(
'rocket reward panel binds winner count and current user rewards',
(tester) async {
await tester.pumpWidget(
_testApp(
RoomRocketRewardPage(
rewards: _sampleRewards(),
currentUserId: '10002',
igniterUserId: '10003',
),
),
);
expect(find.text('10000'), findsNWidgets(2));
expect(find.text('2 users received rewards'), findsOneWidget);
expect(find.text('Rocket Cat'), findsOneWidget);
expect(find.text('Igniter'), findsOneWidget);
},
);
testWidgets('same reward panel switches to not-won state for another user', (
tester,
) async {
await tester.pumpWidget(
_testApp(
RoomRocketRewardPage(
rewards: _sampleRewards(),
currentUserId: '99999',
igniterUserId: '10003',
),
),
);
expect(
find.text("You didn't win a prize. Better luck next time!"),
findsOneWidget,
);
expect(find.text('2 users received rewards'), findsOneWidget);
});
}
Widget _testApp(Widget child) {
return ScreenUtilInit(
designSize: const Size(375, 812),
minTextAdapt: true,
builder:
(_, __) => MaterialApp(
home: Scaffold(
backgroundColor: Colors.black,
body: Center(child: child),
),
),
);
}
List<ATRoomRocketRewardRes> _sampleRewards() {
return <ATRoomRocketRewardRes>[
ATRoomRocketRewardRes.fromJson(<String, dynamic>{
'userId': 10002,
'userNickname': 'Rocket Cat',
'rewardType': 'GOLD',
'rewardAmount': 10000,
}),
ATRoomRocketRewardRes.fromJson(<String, dynamic>{
'userId': 10003,
'userNickname': 'Igniter',
'rewardType': 'PROP',
'rewardItemName': '7 days',
}),
];
}