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({ 'rewardType': 'GOLD', 'rewardItemId': 12, 'rewardItemName': 'Gold', 'rewardAmount': 18800, 'cover': 'https://example.test/gold.png', 'rocketLevel': 2, 'message': 'Congratulations', }); final ATRoomRocketRewardRes messageReward = ATRoomRocketRewardRes.fromJson({ '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 _sampleRewards() { return [ ATRoomRocketRewardRes.fromJson({ 'userId': 10002, 'userNickname': 'Rocket Cat', 'rewardType': 'GOLD', 'rewardAmount': 10000, }), ATRoomRocketRewardRes.fromJson({ 'userId': 10003, 'userNickname': 'Igniter', 'rewardType': 'PROP', 'rewardItemName': '7 days', }), ]; }